3

マークアップ(XAML)によるUIの開発を必要とするマネージドクラップやネイティブコードを処理できないため、カスタムGUIフレームワークに取り組んでいます。そのGUIフレームワークを使用するアプリケーションのプロトタイプを作成しようとしていますが、WinAPI内のウィンドウの性質に関するプラットフォーム固有の問題があります。

DWMは、没入感を損なう非クライアント領域のカスタマイズを実際には許可していません。DWMで許可されるのは、カスタマイズの錯覚を与えるためにクライアント領域に拡張することだけです。

したがって、最善の行動は、クライアント領域内の「非クライアント領域」を再構築することであり(WINAPIと比較して)、キャプションを削除し、ボタンを最大化、最小化する必要がありました。したがって、基本的にすべてのものを列挙しました。それらを非アクティブ化するために、それらを一緒にORし、すべてのビットを反転させます。

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)

これらのスタイルがなくなると、通常のシャットダウン手順(Alt + F4、またはタスクバーを右クリックして[閉じる]に移動)を使用できなくなります。これらは機能しないためです。プロセスを強制終了せずに終了できるように、VK_ESCAPEとPostQuitMessage(0)を手動でインターセプトする必要がありました。

なんでそうなの?そして、どうすればこれを修正できますか?

4

1 に答える 1

6

短い答え

交換:

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)

と:

WS_POPUP

ファンキーな動作はもう必要ありません。アプリケーションは正しく応答します。ケーキをお楽しみください。

長い答え

ああ、最近の MSDN のすべてと同様に、ケーキは嘘です。ウィンドウスタイルは、単なる視覚的なものではありません。また、アプリケーションのウィンドウで使用できる固有のウィンドウ機能も指定します。さて、ここにはかなりの量の策略が見られます。

まず第一に、MSDN は、そのウィンドウ スタイル定義テーブルに関して、実際には近づきにくく、有用ではありません。WS_OVERLAPPEDWINDOWWindows のデフォルトの動作は、最も単純な式 0 (32 ビット値、すべてのビットがダウン、0x00000000) を占めるものとして識別される従来のキャプション、クローズ、ボーダー パッケージです。CreateWindow*関数内のスタイルに 0 を指定すると、従来のウィンドウが生成されます。

あなたが望むのは、むき出しの汚れた空の窓です。Microsoft はまさにあなたが探しているものを手に入れました -WS_POPUPこれは最上位ビットを 1 に設定し、それ以外はすべて 0 に設定します。

つまり、すべてを再実装する必要があります。しかし、それがあなたの目的ですよね?

すべてのビットを反転するだけでは不十分です。必要なオプションを削除するだけでなく、残りのオプションをアクティブにして、アプリケーションが今経験していることをおかしくします。したがって、それを他の何かと AND するか、Microsoft によって容易に定義されたものを使用します - WS_POPUP

そしてまた。ケーキと幸せなコーディングをお楽しみください。

于 2012-12-28T23:46:22.497 に答える