0

オーバーレイとして機能する半透明のフォーム (AlphaBlend を使用) があります。ユーザーが下のウィンドウとやり取りできるようにするために、フォームに WS_EX_NOACTIVATE を設定して、すべての右クリックと左クリックが他のウィンドウに移動するようにしました。

ただし、フォームにはクリック可能なラベルがいくつかあります。それらをクリックして適切なアクションを実行すると、WS_EX_NOACTIVATE フラグにもかかわらず OnClick メソッドが呼び出されるため、正常に動作しますが、クリックは (明らかに) 他のウィンドウにも伝播します。この場合は望ましくありません。

それで、フォームですでに処理している場合に、下のウィンドウに送信されるクリックを「停止」する方法を知っている人はいますか? 基本的に、クリックが「自分のもの」で伝播されないか、または私のウィンドウの下のウィンドウがそれを受け取るかを選択できるようにしたいと考えています。

4

2 に答える 2

4

Rob が説明したように、WS_EX_NOACTIVATE はここでは関係ありません。ほとんどの場合、WS_EX_TRANSPARENT を使用して、マウス クリックに対してウィンドウを透明にしました。

マウス クリックの透過性をより細かく制御するには、トップ レベル ウィンドウで WM_NCHITTEST メッセージを処理します。「クリックスルー」したい領域の HTTRANSPARENT を返します。それ以外の場合は、HTCLIENT などを返します。

于 2013-06-11T23:09:10.603 に答える
1

Wm_ex_NoActivateここでは無関係であるべきです。これは、ウィンドウが入力フォーカスを受け取るかどうかを制御するだけです。実際、スクラッチ プログラムから始めて、拡張ウィンドウ スタイルを変更するだけで、そのプログラムのウィンドウの境界内をクリックすると、クリックは通常の方法で処理されることがわかります。活性化; そのウィンドウの背後にあるプログラムは、クリック イベントを受け取りません。

したがって、ラベル コントロールがクリック イベントを背後のウィンドウに転送するのではなく、食べるようにするには、それらのメッセージの転送を開始し、単純にそれを停止するために何をしたかを調べる必要があります。

于 2013-06-11T20:02:24.770 に答える