
初心者がテトリス作りに挑戦(2)
こんにちは。4月最初の休日をどのようにお過ごしでしょうか?
私の地域では、今日、春祭りがあって、賑やかで春だなぁと感じました^^。
さて、MAUI の人柱になるべく少しずつ記事を書いていこうと思います。どなたか、共に人柱になれる方がいらっしゃったら是非お声を掛けてもらえると嬉しいです。
今日は、ウィンドウのサイズ調整について調べました。
Android や iOS では全画面表示が基本でウィンドウは利用しませんよね。Windows や macOS ではウィンドウを利用するので、どのように処理をするのか関心があったのです。
こういうところに、マルチプラットフォーム対応の難しさが現れてくるのですよね。
調べたところ、2つの方法があると分かりました。
1つ目の方法
下の画面にある App.xaml.cs の class App に CreateWindow() を追加します。(class Application の CreateWindow() をオーバーライドします。)
プログラミングを始めたばかりの方には分かりにくい表現となりますが、いずれ言ってる意味が分かるようになるので安心してください。
今日は、ウィンドウのサイズを変更したいだけなので文法の説明はしませんが、今後、オーバーライド等の説明をするつもりです。

App.xaml.cs に、10行ほど書き足せば OK です。
Width(幅)と Height(高さ)の値は適当に直接数値を書き込んでいますが、今後このあたりも修正しようと思っています。
みなさんも好きな数値を入れて実行してみてください。

おそらく、Android や iOS の場合には、window.Width などの値は無視されるようになってるのでしょうね。
また、下のように、「window.」 まで入力すると、いろいろ設定できそうなものが出てくるので、他に面白そうなものがないか探すと良いですよ。
window.X と window.Y で、ウィンドウを表示する位置も指定できました。

C# は長い歴史の中で、機能がものすごく拡張されているので、このような開発環境の支援を受けて開発するのが C# では一般的になっています。
あれもこれも覚えなくちゃならない、と気負わずに気軽に開発できるのが C# の良いところですね。
2つ目の方法
1つ目の方法では、macOS で実行したときもウィンドウのサイズが変更されのだと思います。(私は Mac を持っていないので、実際に試すことができません。もし、Mac を持ってらっしゃる方がいましたら、是非試してみてくださいね。)
今回のように、Windows と Mac で同じ動作で構わないときはこれで良いのですが、Windows ならではの処理をしたいときもあると思います。
そのような場合には、Platform 毎に処理を記述する場所があるので、そこに処理を記述します。

今回は、上の図の Windows の App.xaml.cs に処理を追加します。
App.xaml.cs にある public App() には、this.InitializeComponent(); の1行しかないと思うのですが、その下に以下のようなコードを追加します。
今回は、platform 毎に処理を変えたい場合の例としてサンプルを掲載しているだけなので、実際には以下のコードを書かなくても良いと思います。
Windows OS で管理されているウィンドウハンドルを直接取りに行くコードになってますね。
少しややこしいので、単なる例として見るだけで十分だと思います。
public App()
{
this.InitializeComponent();
Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) => {
var nativeWindow = handler.PlatformView;
nativeWindow.Activate();
IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
appWindow.Resize(new SizeInt32(800, 1000));
appWindow.Move(new PointInt32(100, 100));
});
}
今回は、ウィンドウサイズを変更したいというだけものだったので、文法等の解説はしませんでしたが、今後はできるだけ解説を入れていこうと思います。
プログラミングを始めたばかりの方には分かりにくい記事となってすみませんが、今後も気長に付き合ってもらえると嬉しいです。
それでは。