Windows Mobile アプリを作ってみる
iPhone アプリの状況がうらやましい限り。
んー悔しい。何千万円も儲からなくてもいいんだよ。何千円でもおっけーなんだよ。
Appleの事情にはとんと疎いので、iTunesとかも使ったことないけど、うまいこと課金システムが出来上がってるんだろうな。
触発されたわけではないが、明日のためのその1として、Windows Mobile用のアプリを作成すべく、プロトタイプ的なものを作ってみる。
すこしずつ、野望に近づくのだ!
題材は、インド式計算としてみる。最近とんと計算ができなくなってきたため、通勤時等のエクササイズ用として使えれば幸い。
以下手順、はまりポイントメモ。
1.仕様
計算問題を出題。回答入力。正解、不正解と解法を表示
2.プロジェクトの作成
(1) 新規作成-プロジェクト から、MFCスマートデバイスアプリケーションを選ぶ
MFCを使ってみる。SDKプログラミングはよくわからんのでとっつきやすいかと思い。
(2) ウィザードで、Windows Mobile 6 Standard SDKを選択
自機が、Windows Mobile 6 Standard なので。
おっと、ここにくるまでに、準備が結構必要なので、興味ある方は、こちらを参照。
(3) まずは、感じをつかむためなので、ダイアログベースで
3.画面まわりの実装手順
(1) メニューの追加
はまりその1。
もともと、存在している、IDR_MAINFRAME メニューはいくら修正しても、なにもおこらない。以下の対応をするまで、1時間程度のはまり。
IDR_MENUを追加し、メニューを作成。ダイアログ cpp ファイルの、OnInitDialog 関数内の、dlgCommandBar.InsertMenuBarの引数を変更したら、メニューが表示されるようになった。
BOOL CindcalcDlg::OnInitDialog() // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 if (!m_dlgCommandBar.Create(this) || : |
(2) メニューにイベントを追加する
リソースエディタに戻り、メニューが押下されたときのイベントを以下の手順にて作成する。
・メニューのコンテキストメニューから、イベントハンドラの追加を選択
・イベントハンドラ追加先を選択。ダイアログにしておく。
「追加して編集」で、イベントハンドラを編集できるようになる。
(3) ダイアログ画面の作成
ダイアログエディタで、コントロールをぺたぺたはりつつ、ダイアログのメンバー変数として、コントロールを管理するために、コンテキストメニューから変数の追加を選択する。
変数名を適当につけて、完了すると、ダイアログボックスクラスのメンバー変数としてコントロールが作成される。
(4) Enterキーのハンドリング
はまりその2。というほどでもない。ぐぐったらすぐわかった。
ダイアログベースなので、Enterキーを押すと、画面が閉じてしまうので、CDialog::PreTranslateMessage 関数をオーバーライドして、Enterキー押下時の処理を実装する
BOOL CindcalcDlg::PreTranslateMessage(MSG* pMsg) if(pMsg->message == WM_KEYDOWN) { OnAnswer(); // Enterキー押下で、呼び出す処理。 return CDialog::PreTranslateMessage(pMsg); |
4. 計算練習クラスの追加
(1) 簡単な練習クラス(普通のC++クラス)を作成して、プロジェクトに追加する。
問題の値から、解法を表示させようかと思っていたが、面倒くさくなったのでやめ。
単純に計算問題を作成するだけのクラス
はまりその3.
まいった。2時間程度はまったのが、Windows Mobile を Visual Studioで開発する場合、time_t 関係の関数が利用できないみたい。
乱数のSeedに現在時間を取得したいだけなのに。以下の青字部分のようにして、何とか動いた。
#include "StdAfx.h" CompPractice::CompPractice(void) CompPractice::~CompPractice(void) // 練習開始 練習タイプ 1:足し算、2:引き算、3:掛け算 と、桁数を与える // 次の問題 SYSTEMTIME st; CString ope = _T(""); CString exp = _T(""); return exp; // 回答のチェック // 正答の取得 |
(2) 計算クラスを呼び出す
先ほどの、ダイアログのイベントハンドラから、上記計算クラスの関数を呼び出す。
MFCのCStringクラスの利用法などもにわかには覚えきれないので、使いそうなのをこちらにまとめておく。
void CindcalcDlg::OnAnswer(void) int ans = _ttoi(str_ans); m_lbl_ans.SetWindowTextW(msg); |
5.動かす
エミュレータだとこんな感じ。実機でもちゃんと動いている感じ。
6.まとめ
また一歩野望に近づいた!
次は、サンプルアプリのリリースバージョンをどうやって作成するか調べる。
※ インストーラの作成へ