SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

Windows電卓の中はどうなっているのだろう?(前編)
~オープンソースのコードを見てみよう

UWPアプリ開発の最前線 第13回

  • このエントリーをはてなブックマークに追加

 Windows 10に標準で入っている「電卓」アプリのソースコードが公開されています。C++/CXで書かれたUWPアプリです。このソースコードは、UWPアプリのアーキテクチャや、C++/CXとXAMLを使ったUWPアプリの書き方などの勉強になります。カスタマイズした「電卓」を配布することもOKです。今回は、そのソースコードをちょっと覗いてみましょう。

  • このエントリーをはてなブックマークに追加

  • 適用バージョン: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クラスのインスタンスを作り、和暦を設定するメソッドを呼び出すコードは次のようになります。

Calendarクラスを使う例
// C++/CX
Windows::Globalization::Calendar^ calendar = ref new Windows::Globalization::Calendar();
calendar->ChangeCalendarSystem(Windows::Globalization::CalendarIdentifiers::Japanese);

 C#なら、次のように書くところです。

Calendarクラスを使う例
// 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: Windows 8 ストアアプリことはじめ(1)(2)追補(2013年、επιστημη)
  • C++/CX Windows 8.1ストアアプリことはじめ(1)(2)(2013年、επιστημη)
  • C++/CXでHelloUWP!(2015~2016年、επιστημη)

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
開発環境の準備

関連リンク

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11538 2019/07/26 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング