リスト ビュー コントロールとフォトショップ スタイルの HSV カラー ピッカーを含む複雑な色編集ダイアログ ボックスを作成しています。このダイアログは説明どおりに使用されます。ユーザーは最初に特定のアイテムをクリックし、次にカラーピッカーでカーソルを操作してアイテムに適切な色を設定し、次に別のアイテムをクリックしてプロセスを繰り返します。
私の hotoshop stle HSV colorpicker は 2 つの長方形に分割されています。
- 現在選択されている HUE のすべての VALUES および SATURATION バリエーションを表示する 256x256 ウィンドウ。
実現: 私はいくつかの調査を行い、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が失われ、ウィンドウを移動できますが、領域がリフレッシュされません. 私の停止マークは、0x00000000 を示し、GetLastError が 0 を示す hBitmap=CreateBitmapIndirect(...) の問題を示しています。
そして今、主な質問は、私が間違っていることは何ですか?