問題タブ [ws-ex-layered]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1082 参照

c++ - UpdateLayeredWindow、SIZE_RESTORED、および GetClientRect の問題

MFC アプリケーションでレイヤード ウィンドウをセットアップしています。ウィンドウのレンダリング方法のさまざまな部分をカスタマイズできるように、CDialog の独自の派生をセットアップしました。最小化と最大化について心配し始めるまで、すべてが正常に機能します。

最小化または最大化をクリックすると、ウィンドウは期待どおりに反応します (つまり、レイヤード ウィンドウを使用していない場合とまったく同じです)。ただし、ウィンドウを復元すると、非常に奇妙なことが起こります。

私のテスト ウィンドウの既定のクライアントの四角形は 324x102 です。たとえば、最小化された状態から復元すると、OnSize に渡される cx と cy は 994, 550 です。その後、(OnSize 内で) GetClientRect を実行すると、これはウィンドウに対して報告されるサイズです。奇妙なことに、GetWindowRect を実行すると、正しいサイズが返されます (ただし、クライアント以外の領域はすべて含まれています)。

ここで何が起こっているのか、さらに重要なことに、GetClientRect が正しい情報を報告するように修正する方法を知っている人はいますか?

前もって感謝します!

0 投票する
3 に答える
8960 参照

winapi - Win32: ドロップ シャドウを非長方形のレイヤード ウィンドウに反映させる方法は?

WS_EX_LAYERED拡張スタイルを追加して、レイヤード ウィンドウを作成しました。

Windows は、クロマ キー カラー値として黒を使用します。問題を明確にするために、黒の大きな境界線を残します。

代替テキスト


ウィンドウが構築された後、クロマキー カラーとして黒を使用するように指示します。

ポップアップ レイヤード ウィンドウが部分的に透明に表示されます。

代替テキスト


問題は最後のステップです。Windows XP 以降で利用できるCS_DROPSHADOWクラス スタイルを使用して、ドロップ シャドウを作成します。

ドロップ シャドウが表示されますが、影は元の四角形のウィンドウを囲んでおり、レイヤード ウィンドウによって提供されるウィンドウの透明度は考慮されていません。

ドロップシャドウが非長方形のレイヤードウィンドウを尊重するようにする、どこかで見逃した魔法のオプションを誰かが知っていますか?


この問題が発生する別の例は、6px のパディング/マージンを含めない場合です。Windows® テーマによって描画されるヒント ウィンドウは、四角形ではありません。これにより、ウィンドウが透明になる小さな隙間が残りますが、ドロップ シャドウは表示されません。

代替テキスト

Internet Explorer からのこのヒントからわかるように、Microsoft はそれを機能させることに成功しました。

代替テキスト


Windowstooltipsクラス ヒント ウィンドウの拡大図。SpyXXを使用すると、そのウィンドウ rect とクラス スタイルを取得できます。

SpyXX 言います:

したがって、すべてがウィンドウ自体が 104x20 ピクセルであり、ドロップ シャドウがウィンドウ自体の外側にあることを示しています。(これは と一致していCS_DROPSHADOWます。)

tooltips次に、ウィンドウ クラスのスタイルを確認します。

CS_SAVEBITS興味深いことに、 ( 0x800);は使用しません。これは、小さくて寿命の短いウィンドウに役立ちます。

CS_DROPSHADOW( )も使用しません0x20000。それで、自分のウィンドウの外でどのように描画しているのだろうか?

注:透明なレイヤード ウィンドウは、領域よりも優先される手法として文書化されています。

編集:レイヤード Windows は Windows 2000 で使用されています。CS_DropShadow は XP で追加されました。

0 投票する
3 に答える
5069 参照

windows - 窓の外に描く方法は?

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

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

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

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

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

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

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

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

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

0 投票する
1 に答える
1628 参照

c++ - WS_EX_LAYERED ウィンドウがマウス イベントを受信しない

最小化やビットマップで閉じるなどのボタンを使用して、カスタム背景の非長方形ウィンドウをコーディングしています。 のところ私のコードは次のとおりです。問題は、ゼロ以外のアルファ領域にカーソルを合わせている間、カスタム ウィンドウがマウス メッセージを受信しないことです。

0 投票する
1 に答える
1604 参照

c# - C#のレイヤードウィンドウのアルファブレンドコントロール

WS_EX_LAYERED 拡張スタイル セットを使用したレイヤード フォームがあります。CreateWindowEx(...) API 関数を使用して、子の「EDIT」コントロールを作成しました。コントロールはそこにありますが、ペイントされておらず、フォームには何も表示されません。

トップ ウィンドウで WS_EX_LAYERED スタイルを使用すると、WM_PAINT メッセージが送信されなくなり、どちらの子コントロールもそれを受信しないため、表示されません。

フォームの不透明度が 255 に設定されており、背景が UpdateLayeredWindow(...) API を使用して透明な画像でペイントされていることを考慮してください。

マウスを EDIT コントロールの上に置くと、テキスト カーソルが表示され、その中のテキストをコピーできます。

私が対処しなければならない問題は、ユーザーペイントを受け入れるようにコントロールを作成することだと思います。

フォームと同じ手法でコントロールをペイントしようとしました。そのために、フォームから互換性のある DC を作成しましたが、これが可能かどうかはわかりません。コントロールはまだペイントされていません。

そのコントロールの WM_PRINTCLIENT を送信すると機能しますか? その場合、DC は階層化された親フォームにする必要がありますか? 私もこれを試しましたが、うまくいきませんでした。

通常形: http://img580.imageshack.us/i/formy.png/

レイヤードフォーム: http://img6.imageshack.us/i/layeredform.png/

私の質問は、編集コントロールが alpha-blended-user-paint を受け入れるようにするにはどうすればよいですか? レイヤード フォームにアルファ ブレンド コントロールをペイントする方法を教えてください。

0 投票する
1 に答える
1846 参照

c++ - レイヤードウィンドウでのC++GDI+描画イメージが機能しない

そのため、レイヤードウィンドウに画像を描画することについて、SOに関する多くのコードサンプル、ガイド、および回答を見つけました。純粋なHBITMAPSとWICライブラリを使用して描画しようとしましたが、今度はGDI +を使用して描画します(これははるかに単純で使いやすいように見えますが、これまでのところ、障害のあるWICコード)。

私は現在立ち往生していUpdateLayeredWindowます。何をしようとしても動かせません。現在、87、またはを返していERROR_INVALID_PARAMETERます。問題は、どちらが間違っているかということです。困った!UpdateLayeredWindow以下のコードは、動作を拒否しているという事実以外の解決策のようです。

私は何が間違っているのですか?

これは、HDC/ビットマップ情報/グラフィックスオブジェクトを設定するコードです。

上記は正常に機能します-私はそれをステップスルーし、すべてのポインターが機能します。

そして、これがPNGを描画する方法です。

髪を抜く!ヘルプ?

編集:関数の呼び出しを書き直すことにしましたUpdateLayeredWindow。これにより、誤ったパラメーターの問題が解決されました。これが私が思いついたものです。ただし、それでも機能しません。私は何が間違っているのですか?

0 投票する
1 に答える
707 参照

qt - win32 コントロール (QWinHost) がレイヤード (つまり、半透明) ウィジェット (WS_EX_LAYERED) に描画されない

QWinHost を使用して win32 コントロールを移植し、階層化された (半透明の) ウィジェットに配置しました。WS_EX_LAYERED フラグを設定すると、win32 で移植されたコントロールに対してペイントが発生しませんでした。

0 投票する
2 に答える
1685 参照

winapi - 親ウィンドウに画像を使用して半透明の子ウィンドウを描画する

ウィンドウで鳥のアニメーションを作成する必要がありWS_OVERLAPPEDます(以下を参照)。アニメーションは8つの画像で表されます。

アニメーション

画像の青色(つまりRGB(0, 255, 255))は透明である必要があります(下のスクリーンショットを参照)。

引数CreateWindowEx()付きで(鳥はレイヤードウィンドウで表されます)これを実行したかったのです。WS_EX_LAYERED残念ながら鳥はしなければなりませんWS_CHILD。混合はWindows7ではWS_EX_LAYERED | WS_CHILD 合法ではありません:

Windows 8: WS_EX_LAYEREDスタイルは、トップレベルウィンドウと子ウィンドウでサポートされています以前のバージョンのWindowsは、トップレベルのウィンドウに対してのみWS_EX_LAYEREDをサポートします。

最終的な効果は次のようになります(ウィンドウの背景は既にペイントしています。唯一の問題は鳥です)。

ここに画像の説明を入力してください

どうすればこの効果を達成できますか?親ウィンドウで鳥をアニメートする方法は?
透明な背景色で鳥のアニメーションを実装する方法について何かアイデアがあれば、共有してください。

0 投票する
2 に答える
2384 参照

visual-c++ - WS_EX_LAYERED、非表示ウィンドウ、および Windows の新規インストール

Windows の新規インストールで WS_EX_LAYERED フラグが機能しない理由を理解するのに多くの時間を費やしたので、この投稿を共有したいと思います (私のテストは Win7 で行われました。 Win8 OS)。

これは私のコードでした:

次に、透明なレイヤーを追加したかった:

コードを実行しても、ウィンドウは表示されませんでした! これは子ウィンドウではなかった (WS_EX_LAYERED は子ウィンドウでは機能しない) ため、WS_EX_LAYERED フラグは機能しているはずです。

なんで?