8

Win32 C++ で透明なチェックボックスを作成しました。私が知っている限り、ネイティブのwin32では透明なチェックボックスを使用できず、NSISインストーラーでこのチェックボックスを使用する必要があるため、作成しました。

私の問題:再描画するとき、「透明なキャンバス」に描画できるように、透明な背景を消去する方法がわかりません。これは、ユーザーがチェックボックス内のテキストを変更し、再描画する必要がある場合に重要です。私は、誰もが透明な窓で遭遇しなければならない問題に遭遇したと思います。

透明なウィンドウをクリアする方法は何ですか、ウィンドウを再描画するだけなので、ウィンドウのAFAIKを本当にクリアできないというWinAPIに精通していることに注意してください。そのため、次のようなウィンドウを再描画するために使用できる手法についてアドバイスを探しています。

  • 再描画メッセージを親ウィンドウに送信すると、その子 (つまり、チェックボックス) にメッセージを送信せずに、親 (チェックボックスの下にあるウィンドウ) が再描画されることが期待されます。これを試してみましたが、チェックボックスがちらつきます。
  • たぶん、ウィンドウを本質的にクリアするチェックボックスウィンドウ全体をペイントするために使用できる、私が知らない透明なブラシ/ペイント機能がありますか?これを試してみましたが、何らかの理由でチェックボックスウィンドウが黒くなりますか?

私のコード:

case WM_SET_TEXT:
{
        // set checkbox text
        // Technique 1: update parent window to clear this window
        RECT thisRect = {thisX, thisY, thisW, thisH};
        InvalidateRect(parentHwnd, &thisRect, TRUE);
}
break;
case WM_PAINT:
{
     PAINTSTRUCT ps;
     HDC hdc = BeginPaint(hwnd, &ps);
     // Technique 2:
     SetBkMode(hdc, TRANSPARENT);
     Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle?
     EndPaint(hwnd, &ps);
}
break;  
4

2 に答える 2

1

メッセージを処理する必要がありWM_ERASEBBKGNDます。次のようなものが機能するはずです!

case WM_ERASEBKGND:
{
    RECT rcWin;
    RECT rcWnd;
    HWND parWnd = GetParent( hwnd ); // Get the parent window.
    HDC parDc = GetDC( parWnd ); // Get its DC.

    GetWindowRect( hwnd, &rcWnd );
    ScreenToClient( parWnd, &rcWnd ); // Convert to the parent's co-ordinates

    GetClipBox(hdc, &rcWin );
    // Copy from parent DC.
    BitBlt( hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left,
        rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY );

    ReleaseDC( parWnd, parDC );
}
break;
于 2012-07-13T03:30:32.410 に答える
0

ウィンドウ スタイル WS_CLIPCHILDREN を削除してみてください

于 2012-07-13T03:46:21.750 に答える