如果系统支持调色板,创建动态调色板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);
}
}
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能