c语言字体淡入,背景的淡入淡出

如果系统支持调色板,创建动态调色板pAnimate与初始调色板pOriginal。从位图中获取初始调色板,若为淡入将背景色赋予动态调色板。利用前面所提到的公式,根据淡入淡出标志,在循环中更改动态调色板,用AnimatePalette函数设置调色板,改变显示结果。

如果系统不支持调色板,保存位图调色板到初始调色板,若为淡入将背景色赋予位图调色板,利用前面所提到的公式,根据淡入淡出标志,在循环中更改位图调色板,显示位图改变显示结果。返回:位图的淡入淡出。

//参数说明:

//hDIB -位图句柄

//color -指定背景色

//xDest -显示位图的左上角x坐标

//yDest -显示位图的左上角y坐标

//nLoops -循环次数

//nDelay -每次循环中的延时

//nFlag -淡入淡出标志 1–淡入 其它–淡出

void FadeInORFadeOut( CDC *pDC, HANDLE hDIB, COLORREF color, int xDest, int yDest,

int nLoops, int nDelay ,int nFlag)

{

int i,j;

HPALETTE hPal;

PALETTEENTRY pAnimate[256];

PALETTEENTRY pOriginal[256];

CPalette pal;

// 创建236色调色板

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 1 << bmInfo.bmiHeader.biBitCount;

int nWidth = bmInfo.bmiHeader.biWidth;

int nHeight = bmInfo.bmiHeader.biHeight;

LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

int clrRValue = GetRValue(color);

int clrGValue = GetGValue(color);

int clrBValue = GetBValue(color);

if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 )

{

if (!(hPal = Create236Palette(hDIB)))

return;

pal.Attach( hPal );

// 得到调色板初始值

GetPaletteEntries(hPal, 0, nColors, (LPPALETTEENTRY)&pOriginal);

// 设定动态调色板初始值为指定色

if(nFlag==1)

{

for (j = 0; j < nColors; j++)

{

pAnimate[j].peRed = clrRValue;

pAnimate[j].peGreen = clrGValue;

pAnimate[j].peBlue = clrBValue;

pAnimate[j].peFlags = PC_RESERVED;

}

}

else

{

GetPal etteEntries(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);

CPalet te *pOldPalette = pDC->SelectPalette(&pal, FALSE);

pDC-&g t;RealizePalette();

CDC memDC;

memDC. CreateCompatibleDC( pDC );

CBitma p bmp;

bmp.Cr eateCompatibleBitmap( pDC, nWidth, nHeight );

CBitma p *pOldBitmap = memDC.SelectObject( &bmp );

CPalet te *pOldMemPalette = memDC.SelectPalette(&pal, FALSE);

memDC. RealizePalette();

::SetD IBitsToDevice(memDC.m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,l pDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);

Animat ePalette(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);

pDC-&g t;BitBlt(xDest, yDest, nWidth, nHeight, &memDC,0,0,SRCCOPY );

// 淡入淡出

for( i=1; i <= nLoops; i++ )

{

for (j = 0; j < nColors; j++)

{

if(nFlag==1)

{

pAnimate[j].peRed = clrRValue – ((clrRValue-pOriginal[j].peRed)*i)/nLoops;

pAnimate[j].peGreen = clrGValue – ((clrGValue-pOriginal[j].peGreen)*i)/nLoops;

pAnimate[j].peBlue = clrBValue – ((clrBValue-pOriginal[j].peBlue)*i)/nLoops;

}

else

{

pAnimate[j].peRed = pOriginal[j].peRed – ((pOriginal[j].peRed – clrRValue)*i)/nLoops;

pAnimate[j].peGreen = pOriginal[j].peGreen – ((pOriginal[j].peGreen – clrGValue)*i)/nLoops;

pAnimate[j].peBlue = pOriginal[j].peBlue – ((pOriginal[j].peBlue – clrBValue)*i)/nLoops;

}

}

pal.AnimatePalette(0, nColors, (LPPALETTEENTRY)&pAnimate);

// Delay…

Sleep(nDelay);

}

memDC. SelectPalette(pOldMemPalette, FALSE);

memDC. SelectObject( pOldBitmap );

pDC-&g t;SelectPalette(pOldPalette, FALSE);

}

else if( (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )

{

for( int i=0; i < nColors; i++)

{

pOriginal.peRed = bmInfo.bmiColors.rgbRed ;

pOriginal.peGreen = bmInfo.bmiColors.rgbGreen;

pOriginal.peBlue = bmInfo.bmiColors.rgbBlue ;

if(nFlag==1)

{

bmInfo.bmiColors .rgbRed = clrRValue;

bmInfo.bmiColors .rgbGreen = clrGValue;

bmInfo.bmiColors .rgbBlue = clrBValue;

}

}

::SetD IBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight ,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);

// 淡入淡出

for( i=1; i <= nLoops; i++ )

{

for (j = 0; j < nColors; j++)

{

if(nFlag==1)

{

bmInfo.bmiColors [j].rgbRed = clrRValue – ((clrRValue-pOriginal[j].peRed)*i)/nLoops;

bmInfo.bmiColors [j].rgbGreen = clrGValue – ((clrGValue-pOriginal[j].peGreen)*i)/nLoops;

bmInfo.bmiColors [j].rgbBlue = clrBValue – ((clrBValue-pOriginal[j].peBlue)*i)/nLoops;

}

else

{

bmInfo.bmiColors [j].rgbRed = pOriginal[j].peRed – ((pOriginal[j].peRed-clrRValue)*i)/nLoops;

bmInfo.bmiColors [j].rgbGreen = pOriginal[j].peGreen – ((pOriginal[j].peGreen-clrGValue)*i)/nLoops;

bmInfo.bmiColors [j].rgbBlue = pOriginal[j].peBlue – ((pOriginal[j].peBlue-clrBValue)*i)/nLoops;

}

}

::SetD IBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight ,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);

// Delay…

Sleep(nDelay);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值