0

リスト ビュー コントロールとフォトショップ スタイルの HSV カラー ピッカーを含む複雑な色編集ダイアログ ボックスを作成しています。このダイアログは説明どおりに使用されます。ユーザーは最初に特定のアイテムをクリックし、次にカラーピッカーでカーソルを操作してアイテムに適切な色を設定し、次に別のアイテムをクリックしてプロセスを繰り返します。

私の hotoshop stle HSV colorpicker は 2 つの長方形に分割されています。

  1. 現在選択されている 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(...) の問題を示しています。

そして今、主な質問は、私が間違っていることは何ですか?

4

0 に答える 0