問題タブ [nonclient]
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.
c# - エアロ ガラス ウィンドウの非クライアント ペインティング
今、アプリケーションのタイトル バーをカスタマイズしています。私の目的は、タイトル バーにボタンを 1 つ追加することです。以前の質問 で、非クライアント領域をカスタマイズする方法について人々からアドバイスを受けました。それは、1つの小さなことを除いて完全に機能します-光っています! 非クライアント領域でグローを描くことはできますが、窓の外に広がるようにすることはできません。このサブジェクトに関するリソースも見つかりません。
このサンプルを調べて、クライアント以外の描画機能を調査するための独自のテスト アプリを作成しました。私のアプリのウィンドウのスクリーンショット:
これで、borderframe によってクリップされたときに、システム ボタンがウィンドウの外で光るのがわかります。
たとえば、Skype のウィンドウには、タイトル バーに 4 つのカスタム ボタンがあり、ウィンドウ フレームから「光る」ことができます。
窓の外にボタンの光を描く方法を見つけるようにアドバイスしてもらえますか?
前もって感謝します!
[編集]
皆さん、回答ありがとうございます!
winforms - winForms透明で非クライアント領域をペイントする方法は? .ネット4
カスタムフォームを開発していますが、非クライアント領域を透明にしたいと考えています。メッセージ番号「0x85」を介して非クライアント領域の描画を処理しています。これは私がこれまでに試したことです:
- 色 "Color.Transparent" を使用してペイント -> 非クライアント領域が黒くペイントされました。赤、黒、または緑の画像を使用した場合、完全に機能しますが、透明 = 黒
- フォームのサイズの透過画像を作成し、メソッド「myGraphics.DrawImage("img.png")」を使用しました。背景は黒のまま。赤、黒、または緑の画像を使用した場合、それも完全に機能します...
- 何もペイントしないでください(私が透明のままであることを望んでいます)...うまくいきませんでした
winforms - クライアント以外の領域に新しいボタンを挿入するにはどうすればよいですか?
カスタムフォームを開発していて、最小化ボタンのすぐ隣にボタンを配置する必要があります。誰もがそれを行う方法を知っていますか?
winapi - WM_NCHITTESTはマウスカーソルを変更しません
カスタムNCHITTESTとNCCALCSIZEを実装するレイヤードウィンドウ(WS_EX_LAYERED)があり、ウィンドウのクライアントrectをウィンドウrectと同じにします。私のウィンドウのサイズとペイントは正しくあります。カーソルがウィンドウの下端近くにあるときにWM_NCHITTESTからHTBOTTOMを返すと、ウィンドウの下部から垂直方向のサイズ変更タイプのアクションが発生します。ただし、垂直サイズ変更カーソルが表示されません。WM_SETCURSORを実装して、ウィンドウの端に対するポインターの位置をテストせずに、これを修正する方法はありますか?
これが私のコードの抜粋です:
.net - NonClient の上部境界線のサイズを取得するには?
セカンダリ フォームを他のフォームの右端に揃える必要があります。
AERO を有効にしてCOMPILEDアプリケーションをコンパイルして実行すると(IDE から実行する場合ではない)、次のようになります。
ここでGJKHのすばらしい回答に感謝します: Aero の非クライアント領域サイズを正しく決定する方法は?
...これで、セカンダリ フォームをメイン フォームの右側に揃えることができますが、セカンダリ フォームはまだ上から少しピクセル分ずれています。
これは私が使用しているコードです:
delphi - 境界線の「ルック アンド フィール」を失わずに TCustomControl にパディングを追加する方法は?
カスタム TMemo を作成しましたが、テキストがパディングなしで境界線にぶつかっていることに気付きました。ClientRect 内の問題をオフセットするなどして修正することはできますが、この段階ではあまり洗練された解決策にはなりません。TMemoには、クライアント領域の一部ではない少なくとも1pxのパディングがあるので、同じことを試してみようと思いました(とにかくそれが彼らがしていることだと思います)。
そのため、WM_NCCALCSIZE を使用してクライアント領域を縮小しましたが、もちろん境界線は完全には描画されないため、WM_NCPAINT も実装する必要があります。それはうまくいきます。ここで、単一の clBlack 境界線を描画し、その後に clWindow のパディング四角形を描画します。ここまでは順調ですね。
ただし、XP (クラシック スタイル) では 1px の境界線が少し奇妙に見えるので、古い「クライアント エッジ」の境界線を描画し、XP/Vista/Win7 テーマのクライアント エッジの外観にも準拠する方法があるのではないかと考えました (私はグラデーションを使用して手動で描画する方法がわからない)。
そして、それは私が少し立ち往生しているところです。パディングを実行できるように境界線をペイントする方法と、適切な「クライアントエッジ」の外観(1pxまたは2px)を維持する方法を知っている人はいますか?
とても有難い。;)
(もちろん他の方法も大歓迎です)
=====
編集: いじくり回した後、次の解決策を思いつきました。ここに投稿しようと思いました。
編集: ああ!スクロールバーが動作している場合、上記のものは機能しません。私はまだその解決策を持っていません。助言がありますか?
delphi - 非クライアント ウィンドウの境界線が太くなっているスクロールバーの描画の問題
スクロールバーを持つカスタム コントロールのクライアント領域の周りに色付きの境界線を描画しようとしています。このためBorderWidth
に、正の整数に設定してWM_NCPAINT
メッセージに応答します。これは VCL と Win32 を組み合わせたように聞こえますが、このBorderWidth
プロパティによってメッセージが適切に処理されるだけWM_NCCALCSIZE
です。
次のコードはSSCCEです。
結果は次のようになります。
これは、右下の正方形を除いて完璧に見えます。その領域は、何かを行うことで簡単に修正できます。この領域は、私が説明しようとしている実際の問題とは何の関係もないため、意図的にペイントしません。ですから、その四角は無視してください。
これで、フォームの右側の境界線をドラッグしてフォームのサイズを変更できるようになりました。サンプル コントロール ウィンドウの垂直スクロール バーが非表示になるように、最初にサイズを小さくします。次に、フォームをゆっくりと拡大して、サンプル コントロールが再び完全に見えるようにします。次に、次のようになります。
ここで問題を見ることができます:BorderSize
垂直スクロールバーの ~ 左端のピクセルは、オペレーティング システムによって描画されていないように見えます。
いくつかの観察:
inherited
mere の代わりにfull を使用するDefaltHandler(Message)
と、問題がさらに悪化します。この場合、フォームが一時的に画面外に移動された後、およびコントロールを遮るフォームの縮小拡大操作の後、黄色の領域はスクロールバーを完全に遮ります。
メッセージに一致する応答を実装する
WM_NCHITTEST
と、コントロールの動作が改善されますが、スクロールバーの描画の問題は解決されません。スクロールバーのあるコントロールの非クライアント領域内にカスタム境界線を描画する方法を知っていますか? ; この Q への回答はすべて、上記の問題に悩まされています。
Delphi 2009 と Windows 7 Home Premium、64 ビット、Aero 対応を使用しています。