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

时间:2014-08-01 10:23:10

标签: winapi gdi hbitmap device-context

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

我的hotoshop stle HSV colorpicker分为两个rectangels - 1. 256x20色斜坡,代表全部360跨度HUE

  1. 256x256窗口,显示当前所选HUE的所有VALUES和SATURATION变体。
  2. 实现: 我做了一些研究并决定使用GDI位图。 所以我填写GDI BITMAP结构,得到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;
    

    然后在鼠标移动时我必须检查用户是否在色调斜坡中选择了其他一些HUE,如果他这样做,那么我需要用新值填充我的BITMAP的字节数组。在列表中为简单起见,每次鼠标移动都需要更改HUE并在每次调用时重新填充整个位图。

    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;

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

0 个答案:

没有答案