4

Windowstooltipsクラスのヒント ウィンドウを見ると、ヒント ウィンドウの実際の四角形の外側にドロップ シャドウが描画されていることがわかります。

SpyXXを使用すると、ツールチップのウィンドウ四角形とクラス スタイルを取得できます。

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

表示されるドロップ シャドウは、描画されているウィンドウの物理的な外側にあることがわかります。窓の外にいるときに、窓の周りに影を描くにはどうすればよいですか?

:影は、標準CS_DROPSHADOWのクラス スタイルを使用して描画されません。私はこれを実験的に確認しており、SpyXXのウィンドウのクラス スタイルも確認できます。使用しませんCS_DROPSHADOW:

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

では、どうすればウィンドウの外に描画できますか?

注:デスクトップ DC で描画しようとするとアウトです。Greg Schechter のRedirecting GDI、DirectX、および WPF アプリケーションから:

画面への描画と画面からの読み取り -- ひどい!

最後に、リダイレクトの話題なので、GetDC(NULL) を使用して画面に書き込むか、XOR ラバーバンド行を実行しようとするなど、特に危険な方法の 1 つに画面への書き込みがあります。2 つあります。画面への書き込みが悪い大きな理由:

高価です...画面への書き込み自体は高価ではありませんが、通常、画面への書き込み時にXORのような読み取り-変更-書き込み操作を行うため、ほとんどの場合、画面からの読み取りが伴います。ビデオ メモリ サーフェスからの読み取りは非常にコストがかかり、DWM との同期が必要であり、GPU パイプ全体と DWM アプリケーション パイプが停止します。
それは予測不可能です...どうにかして実際のプライマリに到達してそれに書き込むことができた場合、プライマリに書き込んだものがどれくらい画面に残るかについての予測可能性はありません. UCE はそれを認識していないため、画面で他に何を更新する必要があるかによって、次のフレーム リフレッシュでクリアされるか、非常に長い間存続する可能性があります。(とにかく、プライマリへの直接書き込みを許可していません。まさにその理由です...たとえば、DirectDrawプライマリにアクセスしようとすると、アクセスしているアプリケーションが終了するまでDWMがオフになります)

4

3 に答える 3

5

説明した方法でウィンドウの外に描画することはできません。

デスクトップを右クリックしてプロパティ/外観/効果に移動し、[メニューの下に影を表示] のチェックを外すと、影がなくなります。

肝心なのは、これはあなたのプログラムではなく、ウィンドウマネージャの製品だということです。

于 2010-02-09T21:58:06.143 に答える
4

Q: 1 つのウィンドウの外にどのように描画しますか? A:別のウィンドウの内側に描画してください。

最初に注意すべきことは、ツールチップ クラスが実際にスタイルを使用することCS_DROPSHADOWですが、これはクラススタイルであり、ウィンドウスタイルではないことに注意してください。そのため、Spy++ プロパティ ダイアログの [クラス] タブを見て、それを見つける必要があります。tooltips_class32ウィンドウには実際にこれがあり、他にもいくつかあることがわかります。

しかし、それは次の質問につながります-それはどのよう機能しますか? Windows は、ヘルパー HWND を作成して影を描画することでこれを実装しているようです。おそらく、影を付けているものと同じサイズと形状の別のポップアップ ウィンドウを作成し、それを灰色で塗りつぶし、メイン ウィンドウの真下に配置し、設定します。これをWS_EX_LAYEREDウィンドウとして使用すると、影が透明になり、アルファ ブレンディングを使用してエッジの周りでフェードアウトできます。また、独自のウィンドウの 1 つに別の種類の影の効果を追加したい場合は、同じまたは類似の手法を自分で使用することを妨げるものは何もありません。

簡単に言えば、独自のウィンドウの外に描画する場合は、描画する一般的な領域にヘルパー透明ウィンドウを作成し、代わりにそのヘルパー ウィンドウに描画します。

--

さて、これらのヘルパー シャドウ ウィンドウの 1 つを Spy++ で見つけようとしても、あまり見つかりません。有効期間が長く、必要に応じて表示/非表示を切り替えるだけのウィンドウとは異なりtooltip_class32、これらのシャドウ ウィンドウは、よりとらえどころのない生き物です。必要な期間だけ作成されるため、ツールチップがある間は Spy++ を更新するか、またはポップアップ メニューやその他のウィンドウに存在するシャドウを使用する - マウスを移動して Spy++ に切り替えるとすぐにほとんどのツールチップとメニューが消えるため、これは注意が必要です。しかし、Spy++ 自体のツールバーのツールチップは残り続けることがわかりました。そのため、Spy++ を起動し、ツールバーの項目にカーソルを合わせて、F5ツールチップと影が表示されている間に HWND ツリーを更新します。下にスクロールすると、ツリーの 3 番目と 4 番目に表示されている HWND がツールチップ自体であり、その直後にSysShadowウィンドウが表示されます。残念ながら、ツールチップと影が消えてしまったため、その HWND のプロパティ ダイアログを取得しようとすると、「無効なウィンドウ」メッセージが表示された空白のプロパティ ダイアログが表示されます。SysShadow がどのように機能するか、それ自体がどのようなスタイルを使用しているかなどを実際に調べて確認したい場合はCS_DROPSHADOW、Spy++ で自由に探索できる長寿命のポップアップを使用してターゲット アプリを作成できます。

(最後に、これらの影は、Vista 以降、あるアプリ ウィンドウが別のアプリ ウィンドウの上にあるときに表示される影とはまったく異なるものであることに注意してください。このタイプの影は Aero グラス モードの一部であり、同じデスクトップ コンポジションによって処理されます。ガラスのタイトルバー効果を追加するマネージャーであり、影を実装するためにヘルパー ウィンドウを使用または必要としません)。

于 2013-01-07T13:42:23.553 に答える
1

その影がウィンドウ マネージャー自体に密接に結びついているとしても、私は驚かないでしょう。結局のところ、どのウィンドウがそれ自体のどの部分をペイントするか、いつペイントできるかを決定するのはウィンドウ マネージャです。ウィンドウマネージャーが持っているすべてのものを制御できる場合、その影を描くことはロケット科学だとは思いません。

于 2010-02-09T21:53:29.943 に答える