はじめに
今回の試みをするにあたって、自分がよくやる開発の説明を
- Windows開発(Win32/MFC/.NET)
- スマホ開発(Obj-C/swift/Java/kotlin)
- 3Dレンダリング
- 3次元復元・画像処理
これらを単体・複合でやる事が多いんです
最近の人ならUnity/UE使えよと言う人も多いでしょうが、ライセンスの問題等があるのでそこはご容赦を
で、普段3DはC++&OpenGL&imguiで書く事が多いんですが、そろそろWindowsも2D GUIはC#リッチインターフェース欲しいよな、と思う年頃
- WPFはC++と連携してる例を見ない・3Dレンダリングとしてはトリッキー
- UWPはストアアプリは普段作らんのでノータッチ
WinUI3があるじゃないか!!(2024/04現在)
てわけでWinUI3構築 Ver1.0
1. C#/WinRTのアプリプロジェクトを作成
.csprojのPeopertyGroupに以下を追加
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
2. C++/WinRTのランタイムコンポーネントを作成
[プロジェクト]右クリック -> [追加] -> [新しい項目] -> [WinUI] -> [カスタムコントロール]
ここで一度ビルド(特にエラーは出ないはず)
あるとしたら指定した.NETのバージョンがインストールされてないとか
3. C#/WinRTで2のプロジェクションコンポーネントを作成
ここで、どうやってC#/WinRTのアプリにC++/WinRTのコンポーネントをリンクするんだ?と
MS様のページ見るとNuget化するためにプロジェクションプロジェクトを通せ、とな
https://learn.microsoft.com/ja-jp/windows/apps/develop/platform/csharp-winrt/net-projection-from-cppwinrt-component
てなわけで、書かれてる通りにプロジェクト作成
4. 結果
リポジトリ更新しちゃったんで面倒なんで結論だけ
エラーもワーニングも出ず、%USER%.nuget\以下にdllも出力される
MainWindow.xamlでインポートもできる、コントロールのクラスも認識できてる、にも関わらず何も表示されず
WinUI3構築 Ver1.1
1. さらば、nuget
色々調べた結果、C++/WinRTをダイレクトにインポートできるっぽい
C#/WinRTの.csprojに以下を追加
<PropertyGroup>
<CsWinRTWindowsMetadata>sdk</CsWinRTWindowsMetadata>
<CsWinRTGenerateProjection>true</CsWinRTGenerateProjection>
<CsWinRTIncludes>
CppWinRTComponent;
Windows.Foundation;
</CsWinRTIncludes>![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/b693c913-93a4-f477-cbdc-3b231ab4d9ca.png)
<CsWinRTExcludes>
Windows.Foundation.Diagnostics;
Windows.Foundation.PropertyType;
</CsWinRTExcludes>
<CsWinRTEnableLogging>true</CsWinRTEnableLogging>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\CppWinRTComponent\CppWinRTComponent.vcxproj" />
</ItemGroup>
2. SwapChainPanel導入
これが本来の筋なんだけど、情報少なすぎて時間かかりそうだから一旦ペンディング
WinUI3構築 Ver2.0
1. Win32使えないか?
C++/WinRTでHWNDやWin32使えるんだから、Win32でCreateWindowすれば慣れ親しんだ書き方できるんじゃない?
-> やってみた
2. できたんだけど...
MainWindowの子ウィンドウとして表示すると、おそらくXAMLに上書きされて何も表示されない
あと、ウィンドウプロシージャもC++側で持ちたいので、親なし別スレッドで表示
そうすると、当然の事ながらMainWindowを動かしても追従しない
MainWindowのドラッグ・リサイズイベントをフックしてコントロールを変形...
いや、本末転倒だ...
3. 結論
XAMLではまだWPFのようなHwndHostはできないっぽい
HwndHostも.NET Framework 4.5までの機能なので.NET8の時代にあんまり使いたくないな...
やっぱWin32最強
てことで現時点では古典的なWin32に軍配が上がる結果に
まぁ、Unity/UEも未だにWin32だし、フレームレート上げようと思うとプロシージャを自分で操作できる方が強いよね
という結論に至りました