最初のWinUI C++プログラムについて解説

最初のWinUI C++プログラムについて解説

前回のレッスンではWinUI C++の環境インストールと最初のプロジェクト作成を完了し、プログラムを正常に起動できるようになりました。今回の授業では、作成した最初のWinUI C++プログラムの内部構造を分析していきます。

プロジェクトのソリューションディレクトリ

以下で各ファイル・フォルダの役割を解説します

プロジェクトディレクトリを解析

ソリューション名

一番上部に表示される「Solution ‘App3’」がソリューション名で、この例ではApp3となっています。プロジェクト作成時に任意のソリューション名を指定可能で、既定値はプロジェクト名と同一です。

プロジェクト作成画面

上記画像の一番目の入力欄がプロジェクト名、最後の欄がソリューション名です。既定で同一の名前になっていますが、別々の名前に変更することもできます。

一つのソリューションに複数のプロジェクトを格納可能で、本プロジェクトにはデスクトップパッケージ型プロジェクト「App3 (Desktop)」が1つだけ含まれています。

1. References(参照)

プロジェクトが依存するSDK、Windows App SDK、WinRTランタイム、NuGetでインストールしたコンポーネントへの参照を管理するフォルダです。

  • Windows SDK、WinUI 3コントロールライブラリ、C++/WinRTヘッダーライブラリ、Microsoft.UI.Xamlなどの依存ライブラリがここで管理されます。
  • 手動で編集する必要はなく、Visual StudioがNuGetパッケージを管理する際に自動的に更新されます。
参照一覧(一部抜粋)

2. External Dependencies(外部依存関係)

システム標準ヘッダー、SDKヘッダー、サードパーティライブラリのヘッダーファイルが自動的にスキャンされ表示されるフォルダです。

  • Windows.h、winrt/配下の各種ヘッダー、Microsoft.UI.Xaml底层ヘッダーなどが含まれます。
  • 読み取り専用で外部から取り込まれたコードを確認する用途のみ、手動編集はできません。通常Visual Studioインストール時に付属するライブラリが対象となります。
外部依存ファイル(一部抜粋)

任意のファイルをダブルクリックで開くと、ファイルパスがVisual Studioのインストール配下にあることを確認できます。上部のファイル名にマウスオーバーすると完全なパスが表示されます。

3. Assets リソースフォルダ(アプリアイコン / 起動画面)

Microsoft Store掲載、システムダイアログ、起動スプラッシュ画面、ロック画面で使用する画像リソースを格納し、MSIXパッケージ作成・ストア公開に利用します。

なぜこれらの画像ファイルが存在するのか。プロジェクト作成時にパッケージ型テンプレートを選択したためです。パッケージとは、最終的にMSIXファイルまたはMicrosoft Store用配布ファイルにコンパイルする形式のことを指します。パッケージ型と非パッケージ型の違いは以下の通りです。非パッケージ型はexeファイル単体で実行可能、過去の多くの開発プロジェクトがこちらに該当し、コンパイル後exeをダブルクリックするだけで起動できます。一方パッケージ型はexe、dll、各種リソースファイルを一つのパッケージにまとめ、他のユーザーがパッケージファイルを実行するだけでインストールできる仕組みです。今回はMicrosoft Storeへ公開する前提のため、パッケージ型テンプレートを選択しています。

上記画像がプロジェクト作成時に選択したテンプレートです。説明文から「Microsoft Store公開用、MSIXファイル出力対応プロジェクト」であることが分かります。ストア公開には各種アイコン・画像が必須なため、プロジェクト内に事前に各種画像リソースが用意されています。パッケージを使用しない選択肢も存在し、exe単体出力で直接実行することも可能です。詳細は後述します。

各画像ファイルの役割
ファイル名役割
LockScreenLogo.scale-200.pngロック画面に表示するアプリアイコン(200%高DPIスケーリング対応)
SplashScreen.scale-200.pngアプリ起動時のスプラッシュ画面
Square44x44Logo…複数画像スタートメニュー小アイコン、タスクバーアイコン、Alt+Tabウィンドウサムネイル
Square150x150Logo.scale-200.pngスタートメニュー中サイズタイルアイコン
StoreLogo.pngMicrosoft Storeに表示されるアプリ大アイコン
Wide310x150Logo.scale-200.pngスタートメニュー横長タイル

app.manifest

従来型Windowsアプリケーションマニフェスト(Win32互換用)

  • アプリ権限、対応Windowsバージョン、DPI感知設定、管理者権限、ウィンドウスケーリング動作を定義します。
  • UWPのPackage.appxmanifestとは別のファイルで、デスクトップパッケージ型プロジェクトでは2種類のマニフェストが共存します。

4. App.xaml / App.xaml.h / App.xaml.cpp

アプリケーション全体のルートクラス(winrt::App3::Appに対応)

  1. App.xaml:XAML全体共通リソースディクショナリ。グローバルスタイル、コントロールテンプレート、色、フォント、テーマリソースを定義し、プロジェクト内全ページで共有されます。
  2. App.xaml.h:C++/WinRTにより自動生成されたヘッダーファイル。Appクラスの宣言を記述し、OnLaunched、OnActivatedなどライフサイクル関数を含みます。
  3. App.xaml.cpp:アプリライフサイクルロジックを実装
    • OnLaunched:アプリ起動時に実行され、MainWindowの作成と表示を行います。
    • ウィンドウアクティベート、一時停止、テーマ切り替え、例外キャッチ処理を記述。
    • グローバル初期化処理(フォント、データベース、シングルトンサービス)をこちらに記載します。

cppファイルを開くと下記のコードが確認できます

    void App::OnLaunched([[maybe_unused]] LaunchActivatedEventArgs const& e)
    {
        window = make<MainWindow>();
        window.Activate();
    }Code language: C++ (cpp)
この箇所からプログラムはMainWindowへ処理が移行します。Appはアプリのエントリーポイントであり、ウィンドウを生成する役割ではありません。実際に画面やコントロール、ダイアログを作成するのはMainWindowとなります。

5. MainWindow.xaml 一式(メインウィンドウ)

アプリ既定のメインウィンドウ、デスクトップアプリのルート可視ウィンドウ、最上位の画面です。

  1. MainWindow.xaml:ウィンドウ画面レイアウト。ボタン、テキストボックス、ナビゲーションコントロール、ページを格納するFrameを記述します。
  2. MainWindow.idlIDLインターフェース定義ファイル(C++/WinRTコア)。ウィンドウが外部に公開するプロパティ、メソッド、イベントを定義し、XAMLバインディング、コンポーネント間呼び出し、型メタデータ生成に使用。編集後は自動的に.h/.cppの連携コードが生成されます。
  3. MainWindow.xaml.h:IDLとXAMLから自動生成されたクラスヘッダー。コントロールメンバー、コンストラクタ、イベントハンドラ宣言を格納。
  4. MainWindow.xaml.cpp:ウィンドウ業務ロジック。ボタンクリックイベント、データバインディング、ページ遷移、コントロール操作コードを記述。

下記のMainWindow.xamlはコントロールとレイアウトを定義するファイルです

<?xml version="1.0" encoding="utf-8"?>
<Window
    x:Class="App3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App3"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="App3">

    <Grid>

    </Grid>
</Window>
Code language: HTML, XML (xml)

6. module.g.cpp

C++/WinRTグローバルモジュール自動生成ファイル(手動編集禁止)

  • 全ての.idlファイルを元にWinRT型登録コードを生成。
  • winrt::App3::implementation名前空間のエントリを提供し、システムが独自XAMLコントロール・ウィンドウクラスを認識できるようにします。
  • IDLファイルを追加・削除するとVisual Studioが自動的に再生成します。

7. Package.appxmanifest(MSIXパッケージ定義ファイル、最重要ファイル)

デスクトップアプリをMSIXインストーラーにパッケージするための設定ファイル。ダブルクリックすると可視エディタで開けます。

  • アプリ名、バージョン、発行者、アイコン、起動エントリの設定。
  • システム権限宣言(ファイルアクセス、カメラ、ネットワーク、バックグラウンドタスク)。
  • ファイル開くプロトコル、URLプロトコル、拡張機能の関連付け定義。
  • ストア公開情報、デスクトップショートカット、ファイル関連付けを設定。app.manifestとの違い:本ファイルはMicrosoft Store / MSIXパッケージ専用マニフェストで、UWP・パッケージ型デスクトップアプリに使用されます。

例えばこちらではMicrosoft Store関連の設定(バージョン、パッケージ名、発行者情報など)を記述します。これらの情報はMicrosoft Store開発者ページから取得する必要があります。

8. packages.config

NuGetパッケージ設定ファイル。プロジェクトに導入された全NuGetパッケージのバージョンを記録します。

  • Microsoft.Windows.SDK.NET、Windows App SDK、C++/WinRT、WinUI 3ライブラリなど。
  • チーム開発やPC変更時、Visual Studioがこのファイルを参照して依存パッケージを自動復元します。

9. pch.h/pch.cpp(事前コンパイルヘッダー、C++コンパイル高速化)

pch = Precompiled Header(事前コンパイルヘッダー)

  1. pch.h:全ソースで共通使用するヘッダーを一括インクルード(winrt/Windows.*、Microsoft.UI.Xaml.*、標準ライブラリなど)。全cppファイルの最初行に#include "pch.h"を記述します。
  2. pch.cpp:事前コンパイルヘッダーのコンパイル用ソースファイル。役割:大量のシステムヘッダーを各ファイルで個別読み込まず、コンパイル時間を大幅に短縮します。

共通で使用するインクルード文をこのファイルにまとめ、他のソースからこのファイルを読み込むことでコード量削減とビルド速度向上を実現します。

10. readme.txt

Visual Studioテンプレート標準付属の説明文書。WinUI 3 C++プロジェクトの基本的なビルド、パッケージ作成、デバッグ手順が記載されています。

混同しやすい2種類のmanifestファイル

  1. app.manifest → 従来Win32プロセス用マニフェスト(ウィンドウ、システム互換性、権限設定)
  2. Package.appxmanifest → MSIXアプリパッケージマニフェスト(ストア公開、インストール、システム機能宣言)

プログラム全体の実行フロー

  1. アプリ起動 → App::OnLaunched(App.xaml.cpp)へ進む
  2. MainWindowインスタンスを作成しアクティブ表示 window = make(); window.Activate();
  3. MainWindow.xamlが画面を描画、cppファイルがユーザー操作を処理
  4. パッケージ出力時にPackage.appxmanifestを読み込みインストーラーを生成、Assets内の各アイコン画像がパッケージに埋め込まれる

以上が最もシンプルな空白アプリのディレクトリ構造と実行フローの全解説となります。次回のレッスンではウィンドウにボタンを追加し、クリックするたびに数値が増加する機能を実装し、WinUI C++フレームワークの動作原理を理解します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です