0

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

我的 hotoshop stle HSV 颜色选择器分为两个矩形 - 1. 256x20 色带,代表完整的 360 跨度 HUE

  1. 256x256 窗口,显示当前选定 HUE 的所有 VALUES 和 SATURATION 变化。

实现:我做了一些研究并决定使用 GDI 位图。所以我填写GDI BITMAP struct,获取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;

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

4

0 回答 0