eMbedded Visual-C++3.0を試す3

既存ソフトの移植

2001年01月20日

←第3回へ 第5回へ→

■はじめに

「eMbedded Visual Tools 3.0」を使って、既存のソフトをPocketPC用に移植したい場合、どのような問題があるのか、また何をしなければならないかを見ていきたい。この記事ではMFCで作られたソフトについての問題について述べる。

■PalmSize-PC用ソフトはPocketPCで動く?

PlamSize-PC用、あるいはWindowsCE2.x用のソフトは原則としてPocketPCでも動作する。ということは特にPocketPC用を作らなくても、PocketPC上でそのソフトを使うことができるわけである。ただし、いくつか問題が起こる。

  1. PocketPC用ソフトはコマンドバーが下、スタートメニューが上にくるが、以前と同様に旧OS用のソフトはコマンドバーが上、スタートメニューが下になる。
  2. PocketPC用ソフトでは、ファイルメニューが無く、ドキュメントリストを普通使う
  3. PocketPC用ソフトではタップ&ホールドでコンテキストメニューを出す。
  4. PocketPCではダイアログは最大化される

以上のような問題のため、PocketPC用ソフトを作成する意味は十分にあるといえる。特に1のコマンドバーに関する違いは操作上大きな違いをもたらすので、対応が必要になるだろう。

■コマンドバー上下問題に対応する

MFC用ソフトでコマンドバー上下問題に対応するのは簡単である。既存のプロジェクトを読み込みターゲットをPocketPCにしてビルドする。おそらく何の問題もなくビルドは完了するはずだ。そして、できたexeファイルをテストしてみると、見事にコマンドバーが下に来て、上にはスタートメニューのアイコンが来ている。つまり、MFCの場合、PocketPC用にリビルドするだけでコマンドーバーには対応できる。

■ダイアログ問題に対応する

ダイアログが常に最大化される問題も同様で、既存のプロジェクトを読み込みターゲットをPocketPCにしてビルドするだけで対応できる。リビルドしなければ最大化にならないので、やはりPocketPC用を作る価値はあると思う。

また、ダイアログスタイルに WS_EX_CAPTIONOKBTN を指定してもタイトルバーにキャンセルボタンがつかない問題では、仕方がないのでキャンセルボタンをボタンとして付け加えるか、キャンセルに依存しないような処理(必要な項目を空欄のままOKを押したときにはキャンセル扱いする、とか)が必要になる。

■メインウィンドウにOKをつける

よくPocketPC用ソフトメインウィンドウ右上にOKボタンが出ているソフトがある。OKボタンがあるとそれを押すだけでソフトを終了させられるので便利だ。これに対応する場合、ViewクラスでWM_CREATEに対応する関数(OnCreate)をClassWizardで作り、

ShowDoneButton(TRUE);

とするだけでよい。

■タップ&ホールドに対応する

タップ&ホールドとは、しばらく同一地点をタップしたままにしていると、タップしている地点に対応した動作が起こる(普通はメニューが出る)機能である。右クリックメニューが使えないWindowsCEでは非常に重宝すると思われる新機能だ。これに対応するには、以下のようにする。

1.メッセージマップに以下の行を追加する。

ON_NOTIFY_REFLECT(GN_CONTEXTMENU, OnContextMenu)

メッセージマップとは、MFCでメッセージと関数の対応を指定するもので、ソースファイルのBEGIN_MESSAGE_MAPから始まり END_MESSAGE_MAP() で終わるエリアの中に上の行を書く。この例では関数名を OnContextMenu とする。

2.ヘッダファイルに、OnContextMenu の宣言を追加する。

afx_msg void OnContextMenu(NMHDR* pNMHDR, LRESULT* pResult);

DECLARE_MESSAGE_MAP()の上あたりに上の宣言を追加する。

3.OnContextMenu 関数を実装する。

OnContextMenuを実装する。ここではメニューを出すようにしている。

void CxxxView::OnContextMenu(NMHDR* pNMHDR, LRESULT* pResult)
{
	NMRGINFO* pnmhdr = reinterpret_cast <NMRGINFO*>(pNMHDR);

	CMenu menu;
	menu.LoadMenu(IDR_MENU_TRACK);

	CMenu* pPopup = menu.GetSubMenu(1);
	POINT point = pnmhdr->ptAction;

	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y,this);
}
■ドキュメントリストに対応する

ドキュメントリストに対応するのは思った以上に大変である。新規ソフトをドキュメントリスト対応にするのはWizardでやればいいので簡単だが、既存ソフトを改造するとなるとかなり大変である。 Wizardで作られたプロジェクトを元に、既存ソフトへの移植を試みたが、ソースレベルだけではなくリソースレベルでも対応しなければならない。これはどうも新規にプロジェクトを作って、それに既存ソフトを移植した方が楽のようなので、そちらをおすすめする。既存ソフトのドキュメントリスト対応方法についてもいずれご紹介したい。

また、私が試した限りでは、どうもCSplitterWndで画面分割したプロジェクトに対しては、ドキュメントリストに対応できないようである(成功した方、教えてください)。

■さいごに

まだまだありそうな気がするので、是非投稿をお願いしたい。次回以降は既存ソフトをどう移植するか、をお伝えしていきたい。もし、誤り等がありましたら、是非メールもしくは掲示板にご意見等ください。


■関連URL




■感想・コメントは、Windows CE FAN の掲示板 (BBS)

へお願いします。




===更新履歴===

2001/01/20    作成

Reported by 古原伸介

(C)2001 Windows CE FAN