1

win32 または atl/wtl c++ でレイヤード ウィンドウを使用する場合、メイン ウィンドウのアルファを 0 に設定し、子の偽のウィンドウにペイントして表示できるようにし、ウィンドウをクリックすると、ウィンドウ全体がクリックスルーになります。ウィンドウ全体ではなく、ウィンドウの領域のみクリックスルーできるようにしたいのですが、丸みを帯びたコーナーウィンドウをペイントしたい場合、下部/メインウィンドウをクリックスルーにしますが、クリックスルーする上部の「偽の」ウィンドウ、クリックできるようにしたい。それ、どうやったら出来るの?これまでのところ: メイン ウィンドウの OnInitDialog 関数:

::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
BYTE bTran = 0;
::SetLayeredWindowAttributes( m_hWnd, 0, bTran, LWA_ALPHA);

そして、偽のウィンドウを作成すると:

m_hFakeWnd = ::CreateWindowEx( WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_LEFT
        , m_strWndClassName
        , NULL
        , WS_VISIBLE | WS_OVERLAPPED
        , rc.left
        , rc.top
        , rc.Width()
        , rc.Height()
        , GetSafeHwnd()
        , NULL
        , ::GetModuleHandle(NULL)
        , NULL
        );

IF、私は WS_EX_TRANSPARENT フラグを削除するように設定しましたが、メインはクリックスルーですが、偽のウィンドウはクリック可能です。何も反応しません!クリック/ドラッグします。なし。

4

3 に答える 3

1

クリックを傍受するためだけに別のウィンドウを隠しているようですね。

WM_NCHITTESTとにかく、特定の位置が透明であることをシステムに知らせるために、ウィンドウのメッセージを処理する必要がありHTTRANSPARENTます。

現在、同じスレッド内の別のウィンドウによってカバーされているウィンドウ (メッセージは、同じスレッド内の下位のウィンドウのいずれかが HTTRANSPARENT ではないコードを返すまで送信されます)。

于 2012-11-20T14:24:09.783 に答える
0

2 つのウィンドウを作成します。1 つはクリックスルー プロパティで、もう 1 つは通常のプロパティです。

于 2012-11-20T15:32:45.220 に答える
0

クリックを受け入れる領域では、0 の代わりにアルファ 1 を使用します。ウィンドウはまだ完全に見えませんが、アルファ 1 の領域は通常どおりクリックとマウスの動きを登録します。

UpdateLayeredWindowピクセルごとのアルファを取得するには、 ではなくを使用する必要があることに注意してくださいSetLayeredWindowAttributes

于 2012-11-20T19:26:40.777 に答える