Maui学習の道(1)-Windowsフォーム設定

Maui学習の道(1)-Windowsフォーム設定

ついにシンプルなフォームのサイズ指定、最大化、枠なしフォームが完成しました

最終更新 2022/06/02 20:52
轩研 WPF开发者
読了目安 2 分
カテゴリ
MAUI
タグ
.NET MAUI

Mauiの先駆者として言いたいことがある。マイクロソフト、お前は俺をすごいプログラマーにしようと必死だな。絶対に俺が十分にすごくないと思って、わざと俺を怒らせようとしているんだろう。

さて、余談はここまでにして、Mauiもようやく正式リリースされた。これを使ってデスクトップアプリを作りたい。できればWindowsMacに対応させたい(もちろんLinuxも欲しいが、マイクロソフトは許してくれない)。というわけで、作業を始めた。

公式チュートリアルに従って、最新のプレビュー版vs2022Macも同様)をダウンロードしてインストールし、Maui関連のワークロードを選択、Mauiテンプレートプログラムを作成、そのままコンパイルして実行。一連の操作は流れるように進み、うまくいきそうな感じで順調そのもの。

OK、プログラムは完璧に動作。Macでも完璧。しかも同じコードがWindowsMacでシームレスに動く。これはとてもniceだ。自信がみなぎってきた。

優秀なプログラマーとして、自分なりのアイデアを持ちたい。例えば、枠なしのデスクトップアプリを作りたい。これはとてもeasyなはずだ。windowstyleをnoneに変更するだけでいい(そう思っていた)。今までずっとそうしてきたから、そうしようとした。しかし、どこを探してもWindowクラスもMauiWinUIWindowUIWindowも見つからない。

目がかすんでいるに違いない。もっと注意深く調べなければと自分に言い聞かせ、さらに30分かけて徹底的に探した。ついでにMauiのソースコードも少し見てみた(よくわからなかったが)。そう、間違いない。本当にない。まあ、考えが甘すぎた。クロスプラットフォームのプログラムは多くのプラットフォームを考慮しなければならない。これは簡単なことではない。そう自分を慰めた。

よし、この道は通じない。ならばMauiの公式チュートリアルを見てみよう。公式チュートリアルならきっとあるはずだ。かなり網羅的だろう。さらに30分かけてチュートリアルを確認したが、やはりない。うーん、これは非常に難しいことだ。何しろクロスプラットフォームだから、理解できる。では、WinUIの公式チュートリアルを探してみよう。何しろWinUI3を使っているのだから。

すぐに実行に移り、さっさと本題に突入した。努力は報われ、ついにタイトルバーの中に答えを見つけた。答えはあったが、それでも言いたい。マイクロソフト、お前の作ったこのクソみたいなものはmfcと何が違うんだ?ほとんどネイティブAPIの単なるラッパーじゃないか。さすがお前だ --- 我が巨硬(ここで絶叫)。

苦笑いしながら、MauiWindowsデスクトッププログラムでタイトルバーを変更する葵花宝典(秘伝の書)を書き記した。そこにはびっしりと「ありえない」と書かれていた。

秘伝の書は以下の通り:

  1. 忍耐力が必要だ;
  2. 忍耐力が必要だ;
  3. 忍耐力が必要だ;
  4. この方法を使う前に、必ずWindowsのライフサイクル関数を登録すること。参考ドキュメント:アプリケーションライフサイクル - .NET MAUI | Microsoft Docs この方法を使わず、appOnCreate関数をオーバーライドしてもよい;
  • ライフサイクル関数を登録

  • OnCreateメソッドをオーバーライド

  1. Maui Windowsに標準で付いているExtendsContentIntoTitleBarを必ずfalseに設定すること(これは非常に重要。また、Maui WindowクラスにはSetTitleBarがあるが、残念ながらそれは思っているのとは違う。変更しても効果がない。私がヘボすぎて方法を見つけられなかっただけかもしれない)

  2. Mauiのウィンドウハンドル(Windowsプラットフォーム)を使ってAppWindowを取得し、AppWindowTitleBarの関連プロパティを変更する。参考ドキュメント:タイトルバーのカスタマイズ - Windows apps | Microsoft Docs

  1. 上記の手順を完了すると、おめでとう。タイトルバーのないウィンドウを手に入れられる(実際にはタイトルバーはまだあるが、下のコンテンツと一体化している);

  2. さて、上記の手順を完了したら、きっとウィンドウの初期化サイズを自由に制御したり、最大化機能を作ったりしたいと思うだろう。残念ながら、それは本当に難しい。余計なことは言わず、直接コードを載せる。参考ドキュメント:AppWindow Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs

  1. ウィンドウの最大化にはWin32Apiを呼び出し、ウィンドウに最大化イベントを送信する必要がある(簡単にラップしたものがある。必要な人は私に連絡してほしい。他にも方法があるかもしれないが、私がバカなだけかも)

  1. ウィンドウサイズの変更にはAppWindowMoveAndResizeを呼び出す。注意:この関数内部ではDpiスケーリングを考慮していないので、自分で対応する必要がある

  1. 全画面表示を有効にするには、AppWindowPresenterを使用する。参考ドキュメント:AppWindowPresenter Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs

ようやく、ウィンドウサイズ指定、最大化、枠なしのウィンドウが完成した。確かに簡単だ。涙があふれる(まだ問題もある。タイトルバーのドラッグがボタンのクリックに影響してクリックできなくなる)。

最後に、ただ無力に怒り狂うしかない。巨硬、次は私をバカ扱いしてくれても構わない。そうしてくれ。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2023/01/12

Maui Blazor でカメラ機能を実装する方法

Maui Blazor ではインターフェースが WebView でレンダリングされるため、Android のカメラを使用する際に画面コンポーネントにバインドする必要があるため、カメラを取得できません。

続きを読む