Winapi 为什么在WM_MOUSEMOVE中重复调用createBitmapIndirect最终返回NULL?

Winapi 为什么在WM_MOUSEMOVE中重复调用createBitmapIndirect最终返回NULL?,winapi,hbitmap,gdi,Winapi,Hbitmap,Gdi,我正在编写一个复杂的颜色编辑对话框,其中包含一个列表视图控件和一个photoshop风格的HSV颜色选择器。此对话框将按如下所述使用: 用户首先单击特定项,然后操纵颜色选择器上的光标为该项设置正确的颜色,然后单击另一项并重复该过程 我的hotoshop stle HSV颜色选择器分为两部分- 1.256x20颜色渐变,代表360种色调 256x256窗口,显示当前选定色调的所有值和饱和度变化 实现: 我做了一些研究,决定使用GDI位图。 因此,我填写GDI位图结构,获取dc,获取comaptab

我正在编写一个复杂的颜色编辑对话框,其中包含一个列表视图控件和一个photoshop风格的HSV颜色选择器。此对话框将按如下所述使用: 用户首先单击特定项,然后操纵颜色选择器上的光标为该项设置正确的颜色,然后单击另一项并重复该过程

我的hotoshop stle HSV颜色选择器分为两部分- 1.256x20颜色渐变,代表360种色调

  • 256x256窗口,显示当前选定色调的所有值和饱和度变化
  • 实现: 我做了一些研究,决定使用GDI位图。 因此,我填写GDI位图结构,获取dc,获取comaptable dc,并通过CreateBitmapIndirect创建hBitmap:

        case WM_INITDIALOG:
        bitmap_hsv.bmBits=&bits_hsv;
        bitmap_hsv.bmBitsPixel=32;
        bitmap_hsv.bmHeight=256;
        bitmap_hsv.bmPlanes=1;
        bitmap_hsv.bmType=0;
        bitmap_hsv.bmWidth=256;
        bitmap_hsv.bmWidthBytes=256*4;
    
        hDC=GetDC(hDlg);
        hDC_compat=CreateCompatibleDC(hDC);
        hBitmap_hsv=CreateBitmapIndirect(&bitmap_hsv);
        return (INT_PTR)TRUE;
    
    然后在鼠标移动时,我必须检查用户是否在色调渐变中选择了其他色调,如果他选择了,那么我需要用新值填充位图的字节数组。在清单中,为了简单起见,每次鼠标移动都需要改变色调,并在每次调用时重新填充整个位图

    case WM_MOUSEMOVE:
        if (wParam&MK_LBUTTON)
        {
            hDC=GetDC(hDlg);
            pt.x=(LONG) LOWORD(lParam);//client coords
            pt.y=(LONG) HIWORD(lParam);//client coords
            H+=1;
            if (H==360) H=0;
            fill_bits_hsv(H,bits_hsv,4);
            hBitmap_hsv=CreateBitmapIndirect(&bitmap_hsv);
            if (!hBitmap_hsv)
            {
                err=GetLastError();
                return 0;//I STOP CODE HERE TO SEE err=0;
            }
            SelectObject(hDC_compat,hBitmap_hsv);
            BitBlt(hDC,0,0,255,255,hDC_compat,10,10,SRCCOPY);
    
            drawCursor(pt.x,pt.y,hDC);
            ReleaseDC(hDlg,hDC);
        }
        return 0;
    
    对于40或50个第一次呼叫,它可以正常工作,但随后所有窗口都会延迟并失去DC,我可以移动窗口,但该区域不会刷新。我的停车标志显示了我的问题 hBitmap=CreateBitmapIndirect(…),显示0x00000000,GetLastError显示0


    现在主要的问题是我做错了什么

    每次创建新位图时,旧位图会发生什么变化?选择OBJ返回替换的位图;您需要将句柄馈送到DeleteObject(),我刚才也这么认为,并且我尝试删除Object(SelectObject(…)),结果成功了,问题似乎是这些对象没有被删除,而是堆积在内存中,直到没有空间为止。如果您检查了
    err
    的值,很有可能是
    错误\u内存不足
    ,这会导致内存泄漏。请注意,除了删除旧位图外,还需要使用
    SelectObject
    取消选择DC中选择的每个对象。如何取消选择它们?如果当前选择取消了上一个选项,为什么我需要这样做?