我在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成员函数的参数。
你有什么想法吗?
非常感谢您的帮助。
答案 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)
我认为你需要在调用Replace()之前从mem DC中选择位图:
memDC.SelectObject(pObj);
imgage_list.Replace( i, bitmap, 0 );
答案 3 :(得分:0)
据我所知,在您的情况下,位图在Windows XP中无法正常显示。
虽然线程谈到在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 );
希望它有所帮助。