CImageList控件中图象橙色被显示为黄色?


我使用了一个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->pal
PalEntry[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.


[返回“一学网www.onestudy.net”首页]