您的位置:首页 > 其它

CImageList 控件中图象橙色被显示为黄色的问题

2006-02-12 00:33 169 查看
我使用了一个 CImageList 控件来装入位图,用于 TREE 控件,其它的色彩都很正常就是橙色被显示成为黄色。
  你只能使用系统指定的 20 种颜色(橙色不包括在内);当然,你也可以用下面的方法来装载位图资源而不受颜色数的限制。

HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString,
HPALETTE FAR* lphPalette)
{
HRSRC hRsrc;
HGLOBAL hGlobal;
HBITMAP hBitmapFinal = NULL;
LPBITMAPINFOHEADER lpbi;
HDC hdc;
int iNumColors;
if (hRsrc = ::FindResource(hInstance, lpString, RT_BITMAP))
{
hGlobal = ::LoadResource(hInstance, hRsrc);
lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal);
hdc = ::GetDC(NULL);
*lphPalette = CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors);
if (*lphPalette)
{
::SelectPalette(hdc,*lphPalette,FALSE);
::RealizePalette(hdc);
}
hBitmapFinal = ::CreateDIBitmap(hdc,
(LPBITMAPINFOHEADER)lpbi,(LONG)CBM_INIT,
(LPSTR)lpbi + lpbi->biSize + iNumColors * sizeof(RGBQUAD),
(LPBITMAPINFO)lpbi,DIB_RGB_COLORS );
::ReleaseDC(NULL,hdc);
::UnlockResource(hGlobal);
::FreeResource(hGlobal);
}
return (hBitmapFinal);
}

// internally used by LoadResourceBitmap
HPALETTE CreateDIBPalette (LPBITMAPINFO lpbmi, LPINT lpiNumColors)
{
LPBITMAPINFOHEADER lpbi;
LPLOGPALETTE lpPal;
HANDLE hLogPal;
HPALETTE hPal = NULL;
int i;
lpbi = (LPBITMAPINFOHEADER)lpbmi;
if (lpbi->biBitCount <= 8)
*lpiNumColors = (1 << lpbi->biBitCount);
else
*lpiNumColors = 0; // No palette needed for 24 BPP DIB
if (lpbi->biClrUsed > 0)
*lpiNumColors = lpbi->biClrUsed; // Use biClrUsed
if (*lpiNumColors)
{
hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) +
sizeof (PALETTEENTRY) * (*lpiNumColors));
lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);
lpPal->palVersion = 0x300;
lpPal->palNumEntries = *lpiNumColors;
for (i = 0; i < *lpiNumColors; i++)
{
lpPal->palPalEntry[i];
peRed = lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
if (i<=10 // i>=246)
lpPal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;
else
lpPal->palPalEntry[i].peFlags = 0;
}
hPal = CreatePalette (lpPal);
GlobalUnlock (hLogPal);
GlobalFree (hLogPal);
}
return hPal;
}

  该函数也重载了位图调色板,这个功能被 CBitmap::LoadBitmap 忽略了(它假定位图只使用 20 种颜色)。因此要保证在 DC 中有 SelectPalette 和 RealizePalette。

文章出处:http://www.evget.com/articles/evget_1427.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: