- 適用バージョン:Windows 10 version 1803(build 17134)以降
はじめに
Windows 10に標準で搭載されている「電卓」アプリ。Windows 10ユーザーなら、おそらく一度は使ったことのあるユニバーサルWindowsプラットフォーム(UWP)アプリでしょう。先日、そのソースコードがオープンソースとして公開されました。次の画像は、オープンソース化を伝えるブログ記事と、そのコードからビルドした「電卓」アプリです(クリックで拡大)。
上の画像に見えるように、現在の「電卓」アプリは複数の画面を開けるようになっています(マルチインスタンスではありません)。
なお、製品版の「電卓」アプリとオープンソース化されたものは、まったく同じではありません。次のような違いがあります。
- 一部のリソースなどが異なる:例えばアプリのアイコンやバージョン番号が変更されています。上の画像でタスクバーのアイコンが製品版のもの(右隣のアイコン)とは違っていることが分かるでしょうか
- 変更が早い:製品版がアップデートされるよりも早く、オープンソースのリポジトリに反映されます。製品版で直っていないバグが、オープンソース側ではすでに対応済みだったりすることもあります
このオープンソース化された「電卓」アプリのソースコードを読んだり、改造して楽しんだりすることで次のようなノウハウを習得できます。
- C++/CXとXAMLを使ったUWPアプリの書き方
- MVVMアーキテクチャ
- UWPアプリでのユニットテスト
- フルーエントデザインやAzure PipelinesといったWindows 10の新技術
今回は、このソースコードの読み方を簡単に紹介します。
対象読者
- UWPアプリを作っている開発者
- UWPアプリに興味を持っている開発者
必要な環境
本稿では、以下の環境で動作確認しています。
- Windows 10 1903
- Visual Studio 2019 Version 16.1.0 Community Edition
- UWP用Windows 10 SDK: 10.0.17134.0、10.0.18362.0
なお、以下の環境があればよいとのことです(6月1日時点のREADMEファイルより)。
- Windows 10 1803以降
- 最新のVisual Studio(無償のCommunity Editionで可)
- 最新のUWP用Windows 10 SDK
C++/CXについて
「電卓」アプリのプログラミング言語はC++/CXです。「CX」は「component extensions」の略で、UWPのAPIを使えるようにC++を拡張したものです。
本稿ではC++/CXの解説はしませんが、従来のC++との大きな違いはref
キーワードと^
(ハット)修飾子くらいのものです。UWP APIのクラスにはref
を付けます。また、ポインター(*
)の代わりに^
を使います。これによって、使い終わったUWP APIのオブジェクトは自動的にデストラクターが呼び出されます。
例えば、UWPのCalendarクラスのインスタンスを作り、和暦を設定するメソッドを呼び出すコードは次のようになります。
// C++/CX Windows::Globalization::Calendar^ calendar = ref new Windows::Globalization::Calendar(); calendar->ChangeCalendarSystem(Windows::Globalization::CalendarIdentifiers::Japanese);
C#なら、次のように書くところです。
// C# Windows.Globalization.Calendar calendar = new Windows.Globalization.Calendar(); calendar.ChangeCalendarSystem(Windows.Globalization.CalendarIdentifiers.Japanese);
C#から見ると、C++/CXでは名前空間の区切りに::
を使うとか、ポインターや^
修飾子を付けて宣言したオブジェクトのメソッドなどを呼び出すには->
を使うとかいった違いがあります。が、そのほかの文法はよく似ているので、ソースコードを読むだけならC#の開発者でもそれほど難しくはないでしょう。
なお、上のコードでは、書き方の違いをお見せするために名前空間をフルに書いています。もちろん、C++/CXもC#も、usingすればいちいち名前空間を書かずにすみます。
C++/CXについて詳しくは次の記事などを参照してください。
- コンポーネントの拡張機能: C++/CX のツアー(MSDNマガジン2013年4月号)
- C# 開発者のための Windows ストア C++: 基本分野を理解する(MSDNマガジン2014年4月号)
- "Hello world" アプリを C++/CX で作成する
- C++/CX での Windows ランタイム コンポーネントの作成(翻訳に難があるので、英語版を推奨)
- C++/CX での非同期プログラミング(翻訳に難があるので、英語版を推奨)
- Visual C++ の言語リファレンス (C++/CX)(翻訳に難のあるページが多いので、英語版を推奨)