True color CImageList on Windows XP
True color CImageList on Windows XP
我在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);
再次感谢您的帮助。
- GdiObject * pObj代替CObject
-
我认为你需要在调用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 );
希望对大家有所帮助。
相关文章:
- std::async from std::async in windows xp
- 如何在Visual Studio 2017中编译Windows XP的代码
- 如何构建使用Visual Studio 2017的Windows XP的Winsock2(WS2_32.LIB)应用程序
- WinHttpSendRequest and HTTPS on Windows XP
- 功能本地静态为Windows XP生成故障代码
- SHOpenWithDialog analog for windows XP?
- 如何检查操作系统是否至少是Windows XP SP3
- 使用Visual Studio 2012针对Windows XP构建Boost 1.52库
- 使用 Build Tools 2015 (不带 Visual Studio) 面向 Windows XP
- 有任何替代SHGetKnownFolderPath的Windows XP用户令牌的方案吗
- 当Windows XP(32位,SP3)播放声音时,随机应用程序暂停半秒钟
- 函数从windows XP中的数据包中检索标头目标地址
- GetConsoleScreenBufferInfoEx equivalent for windows XP?
- 如何跟踪Windows 7是否在C ++中以编程方式进入睡眠或休眠状态,就像在Windows XP中所做的那样
- 如何从Windows XP下的程序中知道或更改Windows事件日志的大小
- 带Realtek Alc888的活动耳机插孔(Windows XP)
- 如何使用Visual Studio 2012编译Windows XP
- Visual C 2012 Express Compied Application在Windows XP上不起作用
- 为 Windows XP 编译的应用程序无法在 Windows 7 上运行
- 检测本地化的 Windows XP 安装的系统语言