我正在编写一个复杂的颜色编辑对话框,其中包含一个列表视图控件和一个 Photoshop 样式的 HSV 颜色选择器。该对话框将按描述使用:用户首先单击特定项目,然后操纵颜色选择器上的光标为项目设置正确的颜色,然后单击另一个项目并重复该过程。
我的 hotoshop stle HSV 颜色选择器分为两个矩形 - 1. 256x20 色带,代表完整的 360 跨度 HUE
- 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;
现在的主要问题是我做错了什么?