Windows XP上的真彩色CImageList

时间:2011-11-09 09:51:48

标签: c++ visual-studio-2008 mfc

我在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成员函数的参数。

你有什么想法吗?

非常感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

您尚未初始化memDC,因此无法正常回复。在执行SelectObject选择位图之前,请执行以下操作:

memDC.CreateCompatibleDC(pDC);

答案 1 :(得分:1)

最终,更正和正常工作的代码:

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);

再次感谢您的帮助。

答案 2 :(得分:0)

  1. GdiObject * pObj而不是CObject
  2. 我认为你需要在调用Replace()之前从mem DC中选择位图:

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

答案 3 :(得分:0)

据我所知,在您的情况下,位图在Windows XP中无法正常显示。

虽然线程谈到在Windows 7中没有正确显示的位图,这与你正在寻找的相反,但线索可能就在那里......不确定,只是试图提供帮助。

Bitmaps dont show up properly in Windows 7

答案 4 :(得分:0)

我遇到的问题是,我的位图在添加到图像列表时总会显示黑色。

我终于弄明白了。这是我的代码的精简版。

// 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 );

希望它有所帮助。