「Windows API/イベントドリブン方式」の版間の差分

削除された内容 追加された内容
PeekMessage() 関数
101 行
 
そして、このタイマーのブロックにも、けっして「何秒、経過したか」という時間経過のプログラムだけでなく、さらに時間経過イベント後に必要になる処理も一緒に書くことになります。
 
 
== イベントドリブン方式をやめたい場合 ==
PeekMessage() 関数を使うと、イベントドリブン方式はやめる事になり、(かつてのMS-DOSやBASICのような)手続き型のような処理になります。
 
 
さて、WindowsAPIの起動時にVisual Studio の自動作成するコードをよく見ると、
<source lang=c>
MSG msg;
 
// メイン メッセージ ループ:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
 
return (int)msg.wParam;
</source>
 
というような感じのコードが、最初から作成されています(Visual Studioのバージョンによって多少の差異の可能性あり)。
 
コード中のGetMessage() 関数のところをPeekMessage() 関数に置き換えれば( たとえば<code>PeekMessage(&msg,NULL,0,0,PM_REMOVE)</code>など )、イベントドリブン方式をやめて、メッセージの到着を待たずに処理をしていく、従来的な手続き型になります。
 
一方、GetMessage() 関数のままの場合なら、メッセージの到着を待って処理をしていく方式になるので、「イベントドリブン方式でループをしていく」と宣言していることになります。
 
DirectX系のゲームなどのプログラミングの場合、プレイヤーの入力を待たずに画面などが更新され続けますが、それらの機能は一般に PeekMessage() 関数に置き換えることによって実装されています。