我使用SS_BITMAP样式创建了图片控件,并在内存DC上创建了位图。那么可以或如何为控件设置DDB的HBITMAP
?它无法使用:
修改
HDC hDC = GetDC(hPB); //hPB, Handle to static control.
HDC hMemDC = ::CreateCompatibleDC(hDC);
HBITMAP hDDB = ::CreateCompatibleBitmap(hDC, 17, 14);
SelectObject(hMemDC, hDDB);
//Draw on DDB
SendMessage(hPB, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hDDB));
DeleteObject(hDDB);
DeleteObject(hBrush);
ReleaseDC(hPB, hDC);
答案 0 :(得分:1)
GDI句柄具有进程关联性 - 您无法将STM_SETIMAGE转换为另一个进程中的静态控件。
下一步:STM_SETIMAGE不保证制作位图的副本 - 主要是它保留传入的HBITMAP句柄。在SendMessage之后的行中,删除了hDDB句柄,使静态控件的位图无效。
静态控件希望控制传入的位图的生命周期 - 并且会在销毁时尝试将DesmapObject作为位图句柄 - 这意味着您必须:
注意:如果您的应用使用通用控件6来获取visual styles控件,则静态控件永远不会销毁通过STM_SETIMAGE传递的任何位图,因此应用需要销毁任何返回的控件AND通过句柄传递。
我认为//Draw on DDB
取代了删除的代码?在这种情况下,查看IS存在的示例代码,我的心理能力表明问题是因为您没有选择内存DC的位图OUT。你需要让它看起来像这样(重新安排以与创建相反的顺序进行清理):
HDC hDC = GetDC(hPB);
HBITMAP hDDB = ::CreateCompatibleBitmap(hDC, 17, 14);
HDC hMemDC = ::CreateCompatibleDC(hDC);
HGDIOBJ hOld = SelectObject(hMemDC, hDDB);
//Draw on DDB here...
SelectObject(hMemDC,hOld); // this releases the hDDB
DeleteDC(hMemDC);
ReleaseDC(hPB, hDC);
HBITMAP hbmPrev = (HBITMAP)SendMessage(hPB, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hDDB));
if(hbmPrev && hbmPrev != hDDB)
DeleteObject(hbmPrev);