📄 demoview.cpp
字号:
cy = 0;
while ((!(bc[cx].bDontUse)) && cy < nReject)
{
if (bc[cx].dwColorCnt < bc[dwLeastUsed[cy]].dwColorCnt)
{
bc[dwLeastUsed[cy]].bDontUse = FALSE;
dwLeastUsed[cy] = cx;
bc[cx].bDontUse = TRUE;
}
cy++;
}
}
//创建236色调色板
pLP->palNumEntries = 236;
cx = 0;
for(int i = 0; i < nColors; i++)
{
if (!((bc[i].bDontUse)))
{
pLP->palPalEntry[cx].peRed = bmInfo.bmiColors[i].rgbRed;
pLP->palPalEntry[cx].peGreen =
bmInfo.bmiColors[i].rgbGreen;
pLP->palPalEntry[cx].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP->palPalEntry[cx].peFlags = PC_RESERVED;
cx++;
}
}
}
else if (nColors)
{
pLP->palNumEntries = nColors;
for(int i = 0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = PC_RESERVED;
}
}
hPal = CreatePalette( pLP );
delete[] pLP;
return hPal;
}
void CDemoView::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
GetPaletteEntries(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);
CPalette *pOldPalette = pDC->SelectPalette(&pal, FALSE);
pDC->RealizePalette();
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
CPalette *pOldMemPalette = memDC.SelectPalette(&pal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);
AnimatePalette(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);
pDC->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->SelectPalette(pOldPalette, FALSE);
}
else if( (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )
{
for( int i=0; i < nColors; i++)
{
pOriginal[i].peRed = bmInfo.bmiColors[i].rgbRed ;
pOriginal[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pOriginal[i].peBlue = bmInfo.bmiColors[i].rgbBlue ;
if(nFlag==1)
{
bmInfo.bmiColors[i].rgbRed = clrRValue;
bmInfo.bmiColors[i].rgbGreen = clrGValue;
bmInfo.bmiColors[i].rgbBlue = clrBValue;
}
}
::SetDIBitsToDevice(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;
}
}
::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);
// Delay...
Sleep(nDelay);
}
}
}
void CDemoView::FadeInColorORFadeOutGray( CDC *pDC, HANDLE hDIB, int xDest, int yDest, int nLoops,
int nDelay ,int nFlag)
{
CPalette pal;
CPalette *pOldPalette;
PALETTEENTRY pAnimate[256];
PALETTEENTRY pGray[256];
PALETTEENTRY pOriginal[256];
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
int nReservedColors = nColors > 236 ? 236 : nReservedColors;
int nWidth = bmInfo.bmiHeader.biWidth;
int nHeight = bmInfo.bmiHeader.biHeight;
LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 )
{
HPALETTE hPal = Create236Palette(hDIB);
pal.Attach( hPal );
//得到位图调色板
pal.GetPaletteEntries(0, nReservedColors, (LPPALETTEENTRY)&pOriginal);
for( int i=0; i < nReservedColors; i++)
{//得到颜色对应灰度值
int nGray = (pOriginal[i].peRed*299+ pOriginal[i].peGreen*587+ pOriginal[i].peBlue*114)/1000;
pGray[i].peRed = nGray;
pGray[i].peGreen = nGray;
pGray[i].peBlue = nGray;
pGray[i].peFlags=PC_RESERVED;
}
pOldPalette = pDC->SelectPalette(&pal, FALSE);
pDC->RealizePalette();
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
CPalette *pOldMemPalette = memDC.SelectPalette(&pal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
if(nFlag==1)//设置灰度调色板
AnimatePalette(hPal, 0, nColors, (LPPALETTEENTRY)&pGray);
pDC->BitBlt(xDest, yDest, nWidth, nHeight, &memDC,0,0,SRCCOPY );
//设置动态调色板初始值为当前调色板
pal.GetPaletteEntries(0, nColors, (LPPALETTEENTRY)&pAnimate);
memDC.SelectPalette(pOldMemPalette, FALSE);
memDC.SelectObject( pOldBitmap );
//淡入淡出
for( i=1; i <= nLoops; i++ )
{
for (int j = 0; j< nColors; j++)
{
if(nFlag==1)
{
pAnimate[j].peRed = pGray[j].peRed - ((pGray[j].peRed -pOriginal[j].peRed)*i)/nLoops;
pAnimate[j].peGreen = pGray[j].peGreen - ((pGray[j].peGreen-pOriginal[j].peGreen)*i)/nLoops;
pAnimate[j].peBlue = pGray[j].peBlue - ((pGray[j].peBlue -pOriginal[j].peBlue)*i)/nLoops;
pAnimate[j].peFlags = pGray[j].peFlags;
}
else
{
pAnimate[j].peRed = pOriginal[j].peRed -((pOriginal[j].peRed -pGray[j].peRed)*i)/nLoops;
pAnimate[j].peGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen-pGray[j].peGreen)*i)/nLoops;
pAnimate[j].peBlue = pOriginal[j].peBlue - ((pOriginal[j].peBlue -pGray[j].peBlue)*i)/nLoops;
pAnimate[j].peFlags = pOriginal[j].peFlags;
}
}
pal.AnimatePalette(0, nColors, (LPPALETTEENTRY)&pAnimate);
// Delay...
Sleep(nDelay);
}
pDC->SelectPalette(pOldPalette, FALSE);
}
else if( (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )
{
for( int i=0; i < nColors; i++)
{
pOriginal[i].peRed = bmInfo.bmiColors[i].rgbRed ;
pOriginal[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pOriginal[i].peBlue = bmInfo.bmiColors[i].rgbBlue ;
int nGray = (bmInfo.bmiColors[i].rgbRed*299+ bmInfo.bmiColors[i].rgbGreen*587+ bmInfo.bmiColors[i].rgbBlue*114)/1000;
if(nFlag==1)
{
bmInfo.bmiColors[i].rgbRed = nGray;
bmInfo.bmiColors[i].rgbGreen = nGray;
bmInfo.bmiColors[i].rgbBlue = nGray;
}
pGray[i].peRed = nGray;
pGray[i].peGreen = nGray;
pGray[i].peBlue = nGray;
}
::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0,
nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
//淡入淡出
for( i=1; i <= nLoops; i++ )
{
for (int j = 0; j< nColors; j++)
{
if(nFlag==1)
{
bmInfo.bmiColors[j].rgbRed = pGray[j].peRed - ((pGray[j].peRed -pOriginal[j].peRed)*i)/nLoops;
bmInfo.bmiColors[j].rgbGreen = pGray[j].peGreen - ((pGray[j].peGreen-pOriginal[j].peGreen)*i)/nLoops;
bmInfo.bmiColors[j].rgbBlue = pGray[j].peBlue - ((pGray[j].peBlue -pOriginal[j].peBlue)*i)/nLoops;
}
else
{
bmInfo.bmiColors[j].rgbRed = pOriginal[j].peRed - ((pOriginal[j].peRed -pGray[j].peRed)*i)/nLoops;
bmInfo.bmiColors[j].rgbGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen-pGray[j].peGreen)*i)/nLoops;
bmInfo.bmiColors[j].rgbBlue = pOriginal[j].peBlue - ((pOriginal[j].peBlue -pGray[j].peBlue)*i)/nLoops;
}
}
::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
// Delay...
Sleep(nDelay);
}
}
else
{
::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
}
}
void CDemoView::DrawTransparentBitmap( CDC *pDC, int nXDest, int nYDest,HGLOBAL hDIB, COLORREF colorTransparent, CPalette *pPal)
{
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);
CDC memDC,maskDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
{
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
}
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
maskDC.CreateCompatibleDC(pDC);
CBitmap maskBitmap;
maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor( colorTransparent );
maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY );
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));
memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->SetBkColor(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,
0, 0, SRCPAINT);
memDC.SelectObject( pOldBitmap );
}
void CDemoView::DrawSemiTransparentBitmap(CDC *pDC, int nXDest, int nYDest, HGLOBAL hDIB,CPalette *pPal)
{
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);
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
{
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
}
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
CDC maskDC;
CBitmap mbm;
maskDC.CreateCompatibleDC(pDC);
mbm.CreateCompatibleBitmap(pDC, nWidth, nHeight);
maskDC.SelectObject(&mbm);
maskDC.FillSolidRect(CRect(0, 0, nWidth, nHeight), RGB(0x7F, 0x7F, 0x7F));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC, 0, 0, SRCPAINT);
memDC.SelectObject(pOldBitmap);
}
BOOL CDemoView::LoadBMP( LPCTSTR sBMPFile, HGLOBAL *phDIB, CPalette *pPal )
{
CFile file;
if( !file.Open( sBMPFile, CFile::modeRead) )
return FALSE;
BITMAPFILEHEADER bmfHeader;
long nFileLen;
nFileLen = file.GetLength();
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return FALSE;
// 'BM'
if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
return FALSE;
HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
if (hDIB == 0)
return FALSE;
if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
nFileLen - sizeof(BITMAPFILEHEADER) )
{
::GlobalFree(hDIB);
return FALSE;
}
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
if( nColors <= 256 )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for( int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
pPal->CreatePalette( pLP );
delete[] pLP;
}
*phDIB = hDIB;
return TRUE;
}
void CDemoView::DrawDIB( CDC* pDC, HGLOBAL hDIB, CPalette *pPal, int xDest, int yDest )
{
LPVOID lpDIBBits; // Pointer to DIB bits
BOOL bSuccess=FALSE; // Success/fail flag
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
// Compute the address of the bitmap bits
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors +
bmInfo.bmiHeader.biClrUsed) +
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
// Select and realize the palette if one supplied and if device supports it
if( pPal && (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) )
{
pDC->SelectPalette(pPal, FALSE);
pDC->RealizePalette();
}
::SetDIBitsToDevice(pDC->m_hDC, // hDC
xDest, // DestX
yDest, // DestY
bmInfo.bmiHeader.biWidth, // nDestWidth
bmInfo.bmiHeader.biHeight, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
bmInfo.bmiHeader.biHeight, // nNumScans
lpDIBBits, // lpBits
(LPBITMAPINFO)hDIB, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -