Winapi 你能在静态图片控制上设置DDB吗

Winapi 你能在静态图片控制上设置DDB吗,winapi,controls,bitmap,image,Winapi,Controls,Bitmap,Image,我用SS_位图样式创建了图片控件,并在内存DC上创建了位图。因此,您可以或如何为控件设置DDB的HBITMAP?它不适用于使用: 编辑: HDC hDC = GetDC(hPB); //hPB, Handle to static control. HDC hMemDC = ::CreateCompatibleDC(hDC); HBITMAP hDDB = ::CreateCompatibleBitmap(hDC, 17, 14); SelectObject(hMe

我用SS_位图样式创建了图片控件,并在内存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);
  • GDI句柄具有进程关联性-您不能将SETIMAGE STM_设置为另一个进程中的静态控件

  • 下一步:STM_SETIMAGE不保证生成位图的副本-大部分情况下它保留传入的HBITMAP句柄。在SendMessage后面的行中,删除hDDB句柄,使静态控件保留无效位图

  • 静态控件期望控制传入位图的生命周期-并在位图句柄被销毁时尝试销毁该对象-这意味着您必须:

  • 销毁SendMessage调用返回的任何旧HBITMAP-调用STM_SETIMAGE将旧位图的所有权(和销毁责任)转移到调用代码。(1)
  • 不要将一个HBITMAP传递给多个控件,因为第一个关闭的控件将破坏它-为其他控件破坏聚会
  • 注意:如果您的应用程序使用common controls 6获取控件,则静态控件不会销毁通过STM_SETIMAGE传递的任何位图,因此应用程序需要销毁任何返回的句柄和传入的句柄


    我认为
    //使用DDB
    来代替删除的代码?在这种情况下,查看当前的示例代码,我的灵力说问题在于您没有从内存DC中选择位图。您需要使其看起来像这样(按与创建相反的顺序重新排列以进行清理):


    是的,你就是这样做的。无法使用为什么它不工作,后复制代码。即使我在调试器中运行行SendMessage,它也不会设置位图。我还对“DeleteObject(hDDB)”后面的行进行了注释。看起来您并没有在绘制后将hMemDC恢复到其初始状态。HBITMAPs不能同时选择到多个DC中,因此STM_SETIMAGE调用可能因此失败。
    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);