2010-09-01 63 views
0

我有一个内存DC创建SS_BITMAP风格和创建位图图象控制。所以可以或如何设置控制的DDB的HBITMAP?它不使用工作:你可以设置一个DDB的静态图像控制

编辑:

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

是的,你就是这么做的。不可思议的为什么它不起作用,重新发布代码。 – 2010-09-01 02:02:23

+0

我发布了代码。 – xor 2010-09-01 09:29:51

回答

1
  1. GDI处理有一个过程的亲和力 - 你不能STM_SETIMAGE到另一个进程中的静态控制。

  2. 下一页:STM_SETIMAGE不能保证使位图的副本 - 主要是它保留在HBITMAP处理的通过。在SendMessage之后的行中,删除hDDB句柄,使静态控件具有无效的位图。

静态控制期望控制的传递位图的生活 - 将尝试Dest​​royObject当它被摧毁了位图处理的 - 这意味着你必须:

  1. 销毁返回的任何旧HBITMAP通过SendMessage调用 - 调用STM_SETIMAGE所有权转移(和责任消灭)旧的位图调用代码(1)
  2. 不要传递一个HBITMAP到多个控件作为第一个关闭必摧之 - 败坏了其他控件的派对。

注意:如果您的应用程序使用公共控件6拿到visual styles控制,静态控制从来没有破坏任何通过STM_SETIMAGE过去了,所以应用程序需要摧毁任何返回的句柄和在手柄通过。我想//Draw on DDB是代替删除的代码吗?在这种情况下,看看存在的示例代码,我的心理能力说这个问题是因为你没有选择内存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); 
+0

即使我在调试器中运行SendMessage行,它也不会设置位图。我也评论了“DeleteObject(hDDB)”后面的行。 – user963241 2010-09-01 13:06:45

+0

另请参阅附加信息。看起来你没有在绘画之后将hMemDC恢复到初始状态。 HBITMAP不能一次选入多个DC,因此STM_SETIMAGE调用可能会失败。 – 2010-09-01 14:10:11

相关问题