20211013のC#に関する記事は2件です。

Unity設計入門:目次

はじめに Unityで開発している際に雑に書いてしまうと、コードが膨れ上がって混沌とすることが多いと思います。 そして、それを解決するためにネットで検索してみると「MVPやMVCなどの技法があるらしいぞ」とか「疎結合にするといいっぽい」とか、いろいろな手法の情報が得られます。 しかし、「概念だけ言われても実際どう書くんだよ!」「単純なサンプルだけじゃわかんないよ!」「とりあえず言われたライブラリを使ってみたけどよくなった気がしない」と思ってしまうこともしばしばあります。また、それぞれの記事で前提知識が多かったり、「責務の問題」とかいう曖昧な言葉でお茶を濁されたりしがちです。 そこで、このシリーズでは、マクロな設計について、「基礎の基礎から」そして「実際のコードを踏まえて」解説していきたいと思います。 対象読者 C#・Unityがなんとなく分かる人 UniRXの超基本的なところが分かる人(具体的には IObservable, IObserver, Subject, ReactiveProperty, Subscribe, OnNext程度です) Unityでもう少しいい感じのコードが書きたい人 マクロな設計についての知識を増やしたい人 ※「switch文を消したい」や、「個々のオブジェクトの生成方法」などのコードレベルのミクロな設計については対象外です リンク 第1章「ModelとView」・理論編 第1章「ModelとView」・実践編 第1章(補足)「変わるものと変わらないものの分離」 第1章(補足)「オブジェクト指向とコンポーネント指向」(10/20投稿) 第2章「MVXの思想」・理論編その1(10/22投稿) 第2章「MVXの思想」・理論編その2(10/24投稿) 第2章「MVXの思想」・実践編その1(10/26投稿) 第2章「MVXの思想」・実践編その2(10/28投稿) 第3章その1「監視型View」・理論編(10/30投稿) 第3章その1「監視型View」・実践編(11/1投稿) 第3章その2「Passive View」・理論編(11/3投稿) 第3章その2「Passive View」・実践編(11/5投稿) 第3章その3「バインディング」・理論編(11/7投稿) 第3章その3「バインディング」・実践編(11/9投稿)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[WPF]Windows 11 スナップレイアウトに対応する(要修正)

こんにちは。 Windows 11がリリースされて一週間経ちましたが、ウィンドウまわりにスナップレイアウトという機能が実装されましたね。 最大化ボタンまたは元に戻すボタンをホバーすると、下記のようなものが出てきます。 で、任意の領域をクリックすると、その領域にウィンドウがジャストフィットするようにレイアウトされます。 この機能、私が開発しているboiler's Graphicsでも使えるのかなー。そう思っておもむろに起動してみましたが、使えませんでした。 Windows 11 上でデスクトップ アプリのスナップ レイアウトをサポート https://docs.microsoft.com/ja-jp/windows/apps/desktop/modernize/apply-snap-layout-menu 上記記事によると、WPFアプリには何やら特別な処理が必要だそうです。 というわけで、当記事ではboiler's GraphicsをWindows 11のスナップレイアウトに対応させてみたいと思います。 で、早速ですが以下が変更したコードです。 MainWindow.xaml.cs using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; namespace boilersGraphics.Views { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Loaded += (o, e) => { var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); source.AddHook(new HwndSourceHook(WndProc)); }; } const int WM_NCHITTEST = 0x0084; const int HTMAXBUTTON = 9; private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_NCHITTEST) { int x = lParam.ToInt32() & 0xffff; int y = lParam.ToInt32() >> 16; var maximizeButton = this.MainWindowInstance.Template.FindName("MaximizeButton", this.MainWindowInstance) as Button; var rect = new Rect(maximizeButton.PointToScreen(new Point()), new Size(maximizeButton.Width, maximizeButton.Height)); if (rect.Contains(new Point(x, y))) { handled = true; } return new IntPtr(HTMAXBUTTON); } return DefWindowProc(hwnd, msg, wParam, lParam); } [DllImport("user32.dll")] static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); : } } 要点は以下の通りです。 Loadedイベントでグローバルフックを使う グローバルフック内でWM_NCHITTESTメッセージを捕捉したらHTMAXBUTTONを返すようにする 2はマウスポインタが最大化ボタンの上に存在する(ホバーしている)時のみ、handled = trueにする 上記の記事内(英語)には、"For Win32 apps, make sure you are responding appropriately to WM_NCHITTEST (with a return value of HTMAXBUTTON for the maximize/restore button)."と書いてあります。つまりWM_NCHITTESTメッセージが来た時ははHTMAXBUTTONを返せということです。 これで、boiler's Graphicsはどのような挙動をするか確認しました。 おおースナップレイアウトはちゃんと動きます。 しかし、最大化ボタンをクリックしても反応しなくなってしまいました。最小化ボタンと閉じるボタンは正しく反応するのですが。どうしたら良いんだろう...。 (下記2021/10/13 14:17追記) ソースコードを載せ忘れました。 ここに置いときます。 boiler's Graphics https://github.com/dhq-boiler/boiler-s-Graphics ブランチ:feature/windows11
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む