Windows Mobile プログラミング #10 Todayプラグイン
時刻表読み込み・表示部分がJNTrainWMから流用できるにもかかわらず、JNTrain for Todayはなかなか開発が進んでません。orz
まぁ、それでも表示系の組み方が何となくわかってきた今日この頃。表示更新処理がちょっとまずかった分がありますので、そこだけでも近々公開するかもです。
まぁ、そんなこんなで、todayプラグインの開発覚書です。
WndProcでハンドリングするメッセージについて
WM_TODAYCUSTOM_QUERYREFRESHCACHE メッセージ名称にはリフレッシュとあるので、Todayアイテムの再描画要求なんだろうけど、いつ呼ばれるかどうかが余り判明していない。自アプリにフォーカスがあたったとき、一定間隔なんだろうけど。
JNTrain for Today 1.04betaのときは勘違いしていて、通常の更新もこのメッセージに対しての復帰値をTRUEにしていた。これは誤りで、Today画面全体の再描画要求が必要な際にTRUE(具体的にはTodayアイテムの高さ調整が必要な時のみ)を返す。
TRUEを返すと、WM_ERASEBKGND、WM_PAINTが発行されて自Todayアイテムの画面更新を行うことができるが、そういう用途に使用すると他のアプリも再描画がかかってしまうのでちらついてしまう。
自アイテムの更新は、以下のコードでWM_ERASEBKGND & WM_PAINTを発行させるか、自アプリ領域を自前で書き換えるかで行う。
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
WM_ERASEBKGND
背景消去の要求メッセージ。
これを受け取った場合、何らかの処理で背景をクリアしなければならない。これをしておかないと他のアプリ(非Todayアプリ)からTodayを表示した際に、前のアプリの画面が残ってしまう。
一般的には以下のコードで、壁紙をそのまま表示する模様
TODAYDRAWWATERMARKINFO dwi;
dwi.hdc = (HDC)wParam;
GetClientRect(hwnd, &dwi.rc);
dwi.hwnd = hwnd;
SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)&dwi);
return TRUE;
WM_PAINT
通常のWindowsアプリ作成時にもお馴染みなメッセージ。
このイベント発生時に、BeginPaint〜EndPaintでデバイスコンテキストを取得して、後はそのDCに対して描画するだけ。
GetDC〜ReleaseDCを使用すると描画内容によっては、WM_ERASEBKGNDが発生してしまいせっかく描画した内容が消されてしまうので注意!
WM_TODAYCUSTOM_CLEARCACHE
WindowsMobileプログラミング徹底研究(以下、徹底研究と略)を読んだときは、終了時に呼ばれて確保したメモリの開放等を行うためのものと解釈してしまった。
どうやら、最初と最後に呼ばれるらしい。つまり、アプリ起動中にたまっていったデータを一旦初期状態にするもの、と、捕らえた方が良いのかな?
始め、Todayアプリ終了時に呼ばれるものと思い、作成したクラスの解放をコーディングしていたら、しょっぱなから呼ばれて、クラスが使用できなくなってはまりました。
テーマ:SoftBank(ソフトバンクモバイル) - ジャンル:携帯電話・PHS
2008.06.25 | Comments(0) | Trackback(0) | Mobile プログラミング

