37

Chrome と Firefox 4 などのアプリケーションでは、ユーザー インターフェイスの一部がタイトル バーに配置されるようになりました。Windows では、通常、OS がタイトル バー全体を制御します。アプリケーションは、OS のタイトル バーを削除し、代わりに (WinAmp のように) 「偽の」タイトル バーを描画することで、カスタム タイトル バーを作成できますが、タイトル バーのカスタマイズされていない要素 (閉じる/最小化など) を描画する方法を知っているのは OS だけです。 /Maximize)、OS のバージョンによって異なります。

Chrome や Firefox などのアプリはどのようなメカニズムでタイトル バーを OS と「共有」しますか (元の OS のビジュアル テーマを維持しながらタイトル バーにカスタム要素を配置します)?

ここに画像の説明を入力

Chrome では、タブがタイトル バーに食い込むため、タイトル テキストに十分なスペースがありません。

4

4 に答える 4

23

Microsoft は記事Custom Window Frame Using DWMで非常に詳細な説明をしています。

于 2011-04-07T21:07:59.203 に答える
7

タイトル バーとウィンドウの境界線は、ウィンドウの非クライアント領域 (NC) に属します。メッセージ ポンプ ベースのアプリケーションを作成している場合は、WM_NCPAINT および WM_NCHITTEST ウィンドウ メッセージを使用して、独自のロジックとこの領域の外観を提供できます (Jon が書いたように)。

この領域は以前の Windows バージョンではかなり控えめに使用されていましたが、Microsoft は最近 (少なくとも Vista 以降)、非クライアント領域をより魅力的で豊富な機能に変更し始めました。

現代のアプリケーションでは、非クライアント領域を完全に無視し、代わりに厳密なウィンドウ境界線を持たず、クライアント領域のみで構成されるウィンドウを作成することがよくあります。このメソッドでは、ウィンドウは、ウィンドウ タイトルとウィンドウ ボタン (最小化、最大化/復元、および閉じる) を描画するための独自の実装を提供する必要があります。この手法をウィンドウの透過性と組み合わせると、刺激的なユーザー インターフェイスを非常に簡単に作成できます。

WPF を使用している場合は、この目的でWindowChrome クラスが非常に便利であることがわかります。このクラスは .NET 4 フレームワークの一部であり、.NET 3.5の個別のライブラリとして利用できます。

編集

明らかに、誰かがこの答えを気に入っていません。はっきりさせておきたいのですが、これが Chrome や他のアプリケーションのやり方だと言っているのではありません。私が説明した方法は、私自身と私が働いている会社がいくつかのプロジェクトで使用した実行可能なソリューションであり、他のいくつかのアプリケーションが同じアプローチを使用していることを知っている. それは最善ではないかもしれませんが、それは確かにそれを行うための方法です! :-)

于 2011-04-05T21:48:06.863 に答える
2

クロムとファイアフォックスのソースを調べて、彼らが何をしたかを正確に調べるのは面倒ですが、WM_NCPAINT と WM_NCHITTEST のカスタム処理が含まれている可能性が高いです。OS に基本的なタイトルバーの描画を許可し、その上に独自のビットを貼り付けることができます。別の方法として、DWM API の呼び出しを含めてすべての描画を自分で行うことで、すべての凝った部分を処理します。いずれにせよ、やってみるのは醜いことであり、正しく行わないと、見栄えも気分も悪くなります。

于 2011-04-05T21:12:20.717 に答える
1

おそらくこれも一見の価値があります: https://github.com/lstratman/.NETTitleBarTabs

および別のリンク: http://www.nuget.org/packages/TitleBarTabs/

私はそれを自分で試したことはありません。

于 2014-04-04T09:38:26.550 に答える