Windows Mobile プログラミング #09 Todayプラグイン
NextTrain互換JNTrainWM、そのJNtrainのTodayアプリ版を作成していて、いろいろはまった事。
プログラミングに興味のない人は読んでもあまり意味ない記事ですね。(興味のある人もすでに知っていることかもしれないですが・・・)
現在、NextTrain互換のJNTrainのTodayプラグインを作成しているのですが、いろいろ障害が多く(自分の知識不足が大半ですが)なかなか難航しています。今回はそこら辺の覚書。
まず、WindosMobileプログラミング徹底研究(以下、徹底研究と略)のサンプルとおりの作成方法をとればあまり困らないはずなので、ほとんどの方は自分とおなじはまり方はないはずです。
徹底研究のサンプルでは、Win32スマートデバイスプロジェクトを作成して、アプリケーションの種類をDLLにするように指示されています。通常はこの方法で作成すればはまることもなく、Todayプラグインが作成できるのですが…。
自分は、ここでさらに、「MFCを使用する」にチェックを入れてしまいました。これがいろいろ波及を呼ぶのですが。
MFCを使用している理由は、JNTrainで作成した時刻表読み込みのクラスをそのまま流用したかったからです。非MFC用に書き直す手もあるのですが、これですと時刻表クラスを2重で管理しなければいけなくなり、バグ修正した場合、2つのソースを修正しなくてはならなくなるので面倒です。そこで極力、同じソースを使いまわしたかった、と。
・DLLの作成について
MFCを使用する場合、DLLの初期化処理を行うためのDllMain関数がなくなります。MFCのライブラリでラップされてしまうので。CWinAppの実体が作成されている個所があるので、CWinAppのInitInstance()、ExitInstance()を代わりに使用します。ここら辺ははまったというほどのことではなく、徹底研究のサンプル通りにはいかないということのみですね。
・アイコンのロードについて
はまりました。LoadImege()にてアイコンをロードしなければIconの描画ができないのですが、失敗します。「指定されたリソース名がイメージ ファイルに見つかりません。」のエラーが発生してしまいます。
まぁ、いろいろ試してみたのですが、原因はInstanceハンドルでした。
InitInstanceにてMFCの初期化の行があるのですが、この処理の実行前と実行後ではInstanceハンドルが変わっていました。なぜだかはまだ判明していないのですが、初期化後のハンドルではアイコンがロードできません。ここら辺はおいおい調べておいたほうがいいかも。
現在は、MFCの初期化前にアイコンをロードしています。
・Todayの描画について
Windows系のOSの描画にはデバイスコンテキスト(以下DC)の取得を行い、そのDCに対して描画操作を行うようになっています。
このDCの取得方法に間違いが…。
GetDC()・ReleaseDC()を使用してしまっていたのですが、BeginPaint(), EndPaint()を使用する必要があります。これらの違いは、ググってもらえれば解説されているページがいっぱい引っかかるので割愛しますが、間違ってGetDC()・ReleaseDC()を使用した場合、すぐにWM_ERASEBKGNDメッセージが飛んできて、せっかく書いたものが消されることに。何でこんなことになるのかはじめは見当もつかず、Todayアプリの作り方が悪いのかと悩んでしまいました。
ただ、上記のBeginPaint()・EndPaint()に修正して正常に描画できるようになった現在、描画時に他のTodayアプリの領域も再描画されている現象が起きてしまっているので、まだ間違っている個所がある模様…
まだまだ問題がありそうなので次の公開はもちっと先になります。
とりあえず画面はこんな感じに…
駅名と時刻表の間のラインは履歴内に複数ある時刻表の識別を兼ねています。スクロールバーのような感じですね。
2008.06.21 | Comments(0) | Trackback(0) | Mobile プログラミング

