可以在静态优化校准上设置DDB

时间:2010-09-01 01:47:14

标签: winapi controls bitmap image

我使用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);

1 个答案:

答案 0 :(得分:1)

  1. GDI句柄具有进程关联性 - 您无法将STM_SETIMAGE转换为另一个进程中的静态控件。

  2. 下一步:STM_SETIMAGE不保证制作位图的副本 - 主要是它保留传入的HBITMAP句柄。在SendMessage之后的行中,删除了hDDB句柄,使静态控件的位图无效。

  3. 静态控件希望控制传入的位图的生命周期 - 并且会在销毁时尝试将DesmapObject作为位图句柄 - 这意味着您必须:

    1. 销毁SendMessage调用返回的任何旧HBITMAP - 调用STM_SETIMAGE将旧位图的所有权(以及销毁责任)转移到调用代码。(1)
    2. 不要将单个HBITMAP传递给多个控件,因为第一个关闭将会销毁它 - 破坏其他控件的聚会。
    3. 注意:如果您的应用使用通用控件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);