LoginSignup
3
2

WinUI3を諦めた話

Last updated at Posted at 2024-04-23

はじめに

今回の試みをするにあたって、自分がよくやる開発の説明を

  • 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のアプリプロジェクトを作成

デスクトップアプリのテンプレート選択

1.png

.csprojのPeopertyGroupに以下を追加

<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>

2. C++/WinRTのランタイムコンポーネントを作成

2.png

[プロジェクト]右クリック -> [追加] -> [新しい項目] -> [WinUI] -> [カスタムコントロール]
3.png

ここで一度ビルド(特にエラーは出ないはず)
あるとしたら指定した.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>

一応、狙い通り表示された
4.png

2. SwapChainPanel導入

これが本来の筋なんだけど、情報少なすぎて時間かかりそうだから一旦ペンディング

WinUI3構築 Ver2.0

1. Win32使えないか?

C++/WinRTでHWNDやWin32使えるんだから、Win32でCreateWindowすれば慣れ親しんだ書き方できるんじゃない?
-> やってみた
5.png

2. できたんだけど...

MainWindowの子ウィンドウとして表示すると、おそらくXAMLに上書きされて何も表示されない
あと、ウィンドウプロシージャもC++側で持ちたいので、親なし別スレッドで表示

そうすると、当然の事ながらMainWindowを動かしても追従しない
MainWindowのドラッグ・リサイズイベントをフックしてコントロールを変形...
いや、本末転倒だ...

3. 結論

XAMLではまだWPFのようなHwndHostはできないっぽい
HwndHostも.NET Framework 4.5までの機能なので.NET8の時代にあんまり使いたくないな...

やっぱWin32最強

てことで現時点では古典的なWin32に軍配が上がる結果に
まぁ、Unity/UEも未だにWin32だし、フレームレート上げようと思うとプロシージャを自分で操作できる方が強いよね
という結論に至りました

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2