私はビスタグラス機能について話しているのではありません.私はすでにそれを達成する方法を知っています. 私が話している機能は、office 2007 がロゴとツールバーで行うように、タイトルバーにコントロールを追加することです。
4 に答える
その効果を得るには、Win32 相互運用を行う必要があります。Winforms を使用しているか WPF を使用しているかによって、メッセージ処理にフックする方法が異なります (Winforms を覚えていないので、WPF のすべての例を示します)。ただし、どちらの場合も、次のことを行う必要があります。
ウィンドウの作成を中断し、ウィンドウ スタイルと拡張スタイルを変更します。WPF では、これを実現するために を継承し
HwndSource
て変更する必要がありますHwndSourceParameters
。通常のスタイルには WS_OVERLAPPEDWINDOW、WS_CLIPSIBLINGS、および WS_VISIBLE が必要であり、拡張スタイルには WS_EX_WINDOWEDGE および WS_EX_APPWINDOW が必要です。HwndSource パラメーター HwndSourceHook を介してメッセージ ハンドラーを追加します。
ステップ 2 でフックを介して追加されたメッセージ プロシージャでは、いくつかのメッセージを処理する必要があります。
WM_NCACTIVATE
- アプリが起動されているかどうかにかかわらず、タイトルの絵を変更するWM_NCCALCSIZE
- 非クライアント領域がない OS に戻るWM_NCPAINT
- 一般に、ここでのみウィンドウ rect を無効にする必要があります。WPF が実際の描画を処理します)WM_NCHITTEST
- ウィンドウの移動、最小化、最大化を処理します。
上記を実行すると、WPF がビジュアル ツリーを描画するクライアント領域が、ウィンドウの領域全体に広がります。アプリケーションがユーザーに対して通常のアプリケーションのように見えるように、「cliet 以外の」ビジュアルを追加する必要があります。
さらにいくつかのメッセージが必要になる場合があります。
WM_THEMECHANGED
「非クライアント」領域のペイントを OS テーマと一致するように変更したい場合WM_DWMCOMPOSITIONCHANGED
ガラスを拡張して、ガラスが有効なときに標準の OS NC ガラス ペインティングを取得し、ガラスが有効でないときにカスタム ロジックに切り替える場合。
「非クライアント」領域で使用する境界線、キャプション、閉じる、最小化、および最大化ボタンの標準 Win32 アセットを取得したい場合は、Win32 テーマ API を参照することをお勧めします。
Glass をウィンドウに拡張したい場合は、以下を参照してください。
DwmExtendFrameIntoClientArea
- 標準ガラス NC 領域を取得するにはDwmDefWindowProc
- デスクトップ マネージャーに Glass と標準の NC コントロールをペイントさせるDwmIsCompositionEnabled
- Glass が有効かどうかを判断するため。上記の 2 つの API は、Glass が有効になっている場合にのみ使用できます。Glass が有効になっていない場合は、NC 領域を独自に描画する必要があります。
P/Invokeで、必要なすべてのメッセージ、スタイル、および対応する Win32 API の適切な C# 定義を見つけることができます。
標準の WPF ウィンドウをWindowStyle=none
. ただし、アプリと他のアプリに対するデスクトップの動作にはいくつかの違いがあります。最も明白なのは、タスクバーを右クリックしても、ウィンドウを重ねたり並べたりできないことです。
この機能の一部を有効にするサードパーティ コンポーネントを調べることもできます。私は何も使用していません (ご覧のとおり、私は Win32 相互運用性を恐れていません :-))、特にお勧めすることはできません。
WPF 製品チームの開発者である Joe Castro は、Office 2007 のような UI (ウィンドウのクライアント領域と非クライアント領域の両方にまたがるコントロール) を作成するために使用できる "WPF Chrome" という MSDN コード ギャラリー プロジェクトを持っています。 )。
ここで見つけてください: http://code.msdn.microsoft.com/chrome
Franci が言及しているように、必要なのは DwmExtendFrameIntoClientArea です。その方法を示す Codeproject の例を次に示します。
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx
私は DotNetBar コントロール スイートを使用してうまくいきました。