True color CImageList on Windows XP

True color CImageList on Windows XP

本文关键字:Windows XP on CImageList color True      更新时间:2023-10-16

我在CDialog中有以下代码。这段代码在Windows 7上运行良好,但在Windows XP SP3上它的颜色总是黑色的。

UINT color_flags = CWindowDC(this).GetDeviceCaps(BITSPIXEL);
switch ( color_flags )
{
case 4 : color_flags = ILC_COLOR4; break;
case 8 : color_flags = ILC_COLOR8; break;
case 16 : color_flags = ILC_COLOR16; break;
case 24 : color_flags = ILC_COLOR24; break;
case 32 : color_flags = ILC_COLOR24; break;
default : color_flags = ILC_COLOR24;
};
CImageList imgage_list;
imgage_list.Create( 16, 16, color_flags, 0, 10 );
imgage_list.SetImageCount( number_of_bitmaps );
CDC * pDC = this->GetDC();
CDC memDC;
CRect memRect(0, 0, 16, 16);
CObject * pObj = 0;
COLORREF my_color = RGB(255,0,0);
CBitmap * bitmap = 0;
memDC.CreateCompatibleDC(pDC); 
for ( int i = 0; i < number_of_bitmaps; ++i )
{
  bitmap = new CBitmap;
  bitmap->CreateCompatibleBitmap( pDC, 16, 16 );
  pObj = memDC.SelectObject( bitmap );
  memDC.FillSolidRect( memRect, my_color );
  imgage_list.Replace( i, bitmap, 0 );
  memDC.SelectObject(pObj);
  delete bitmap;
}
memDC.DeleteDC();
this->ReleaseDC(pDC);

我启用了MSDN建议的视觉样式。我使用这个CImageList对象作为CListCtrl::SetImageList成员函数的参数。

你知道吗?

非常感谢您的帮助

您还没有初始化您的memDC,所以它没有正确响应。在您执行SelectObject以选择位图之前,请执行以下操作:

memDC.CreateCompatibleDC(pDC);

最终更正后的工作代码:

CImageList imgage_list; // class member
imgage_list.Create( 16, 16, ILC_COLOR24, number_of_bitmaps, 0 );
CDC * pDC = this->GetDC();
CDC memDC;
COLORREF my_color = RGB(255,0,0);
memDC.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap->CreateCompatibleBitmap( pDC, 16*number_of_bitmaps, 16 );
CObject * pObj = memDC.SelectObject( &bitmap );
int k = 0;
for ( int i = 0; i < number_of_bitmaps; ++i )
{
  // fill list control, so i is used
  // my_color is changing on every loop step
  memDC.FillSolidRect( k, 0, k+16, 16, my_color );
  k += 16;
}
memDC.SelectObject(pObj);
imgage_list.Add( &bitmap, RGB(0,0,0) );
memDC.DeleteDC();
this->ReleaseDC(pDC);

再次感谢您的帮助。

  1. GdiObject * pObj代替CObject
  2. 我认为你需要在调用Replace()之前从mem DC中选择位图,像这样:

    memDC.SelectObject(pObj);
    imgage_list.Replace( i, bitmap, 0 );
    

我知道在你的情况下,位图在Windows XP中不能正常显示。

虽然这个线程讨论了位图在Windows 7中不能正确显示,这与你所寻找的相反,线索可能在那里。不知道,只是想帮忙。

位图在Windows 7中不能正常显示

我有一个问题,我的位图总是显示黑色时,添加到图像列表。

我终于自己弄明白了。以下是我的代码的精简版本。

// get device context
CDC* pDC = GetDC();
// create image list
imageList.Create( cx, cy, ILC_COLOR24, 1, 1 );
// Create offscreen device context
CDC memDC;
memDC.CreateCompatibleDC( pDC );
// Create new bitmap of size cx by cy
CBitmap newBmp;
newBmp.CreateCompatibleBitmap( pDC, cx, cy );
// Select new bitmap in memory for drawing
CBitmap* pOldBmp = memDC.SelectObject( &newBmp );
// do drawing here...
// e.g. memDC.FillSolidRect( 0, 0, cx, cy, RGB(255,0,0) );
/*
IMPORTANT:
Deselect new bitmap before adding to image list,
otherwise you'll potentially end up with a black icon
*/
memDC.SelectObject( pOldBmp );
// add bitmap to image list
imageList.Add( &bitmap, (CBitmap*)NULL );
// cleanup
memDC.DeleteDC();
ReleaseDC( pDC );

希望对大家有所帮助。