PeekMessage関数は、Getmessage関数と同じように
キューにポストされているメッセージを取得する機能を持っています。
しかし、PeekMessageとGetmessageの動作の違いは
Getmessageはメッセージが取得できるまで待つのにたいし、
PeekMessageはメッセージを取得できなくても
処理を返すという行動をとります。
これにより、メッセージがポストされていない時に
別の処理を行うことができる、というわけです。
他の部分は基本的に前回と同じで、ループ処理に関するところだけを抜き出します。
//ループ処理 while (TRUE) { //キューにメッセージがあればいつもの処理 if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { //メッセージがWM_QUITならループを抜ける if (msg.message == WM_QUIT) break ; TranslateMessage (&msg) ; DispatchMessage (&msg) ; } //キューにメッセージがなければ随時処理 else Point_Move(hwnd); }
whileループの中での動作を順に解説していくと、
まずPeekMessage 関数で、キューにメッセージがポストされていないか調べます。
メッセージがあれば、&msgにメッセージを格納し、
msgがWM_QUITならループを抜けます。
メッセージがWM_QUITでなければループは継続され、
TranslateMessageで仮想キーのメッセージを文字メッセージに変換し
メッセージをDispatchMessageでウィンドウプロシージャに送ります。
一方、メッセージがなければPeekMessage は0を返すので
自作の関数(ここではPoint_Move())などの処理を行います。
windowsからのメッセージは普通はめったにこないので、
出来る限り処理は行われようとします。
あとの(Point_Move関数などの)処理は前回のラインプログラムと同じなので割愛します。
では以上を踏まえたソースを実行してみましょう。
動作は前回と同じですが、動き自体は前回のタイマーより若干速く動くことでしょう。
今回のプログラムは注意点として、
このやり方では出来る限り処理が行われるということがあります。
出来る限りというのは、つまりCPUの許す限りというわけで、
CPUをフルに動かすのはWindowsCEではどうなんでしょう?という感じはします。
他のプログラムを動かすことが出来なくなるのはともかく、
バッテリが速く減ってしまうことになります。
しかし、ゲームを速く動かすためには多少の無理は許されることでしょう。
■BOOL PeekMessage ( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
・キューにメッセージがあるか調べ、あればMSG構造体にメッセージを格納する
第一引数 lpMsg には、1 個の MSG 構造体へのポインタを指定します
第二引数 hWnd には、メッセージの取得に使う(取得元)ウィンドウのハンドルを指定します
第三引数 wMsgFilterMin には、取得対象のメッセージの最小値を整数で指定します
第四引数 wMsgFilterMax には、取得対象のメッセージの最大値を整数で指定します
第五引数 wRemoveMsg には、メッセージの処理方法を指定します
PM_NOREMOVE・・・PeekMessage 関数がメッセージを処理した後、そのメッセージをキューから削除しません
PM_REMOVE・・・PeekMessage 関数がメッセージを処理した後、そのメッセージをキューから削除します
戻り値 メッセージを取得した場合、0 以外の値が、メッセージを取得しなかった場合、0 が返ります。
■ソースの表示■
2005/6/5