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