■ 新・ゲーム開発講座




■ へっぽこプログラミング入門♪


■第30夜:やや、やっぱり書き換えが!?

・・・・今回は、まず皆様にお詫びを申し上げます m(_ _)m
え? 何が? ・・・まあ、これを見て下さいまし(爆死)




間抜けの図


バックサーフェイスから表画面に常時転送していれば面倒な再描画処理とはおさらば・・・・というノリで第13夜を書いてしまいましたが、自分が出したダイアログではしっかりと書き換え跡が残ってしまうことに気が付きました(^^;)。考えてみれば、ダイアログが消えるまでは Mainloop() は止まったままなので転送も停止している訳ですね(爆死)。なるべく最小限のコードで分かりやすく・・・・のつもりだったのですが、ちょっとうっかりしていたようです。

これを防ぐには、main.cpp イベントハンドラ Win_Proc() に _WM_PAINT メッセージの処理部分を書き加えればOKです。_WM_PAINT はウィンドウの再描画の必要性が発生した場合(重なっていたウインドウが移動した・・・など)に降ってくるメッセージで、追加部分の処理ではバックサーフェイスの内容を表に転送して対応しています。BitBlt() の直後で return DefWindowProc(hwnd,msg,wprm,lprm); という記述がありますが、これは _WM_PAINTメッセージの副作用(処理の最中に再入してきたりいろいろ妙なことを引き起こすらしいです・・・・^^;)を帳消しにするためにデフォルト処理を呼んでいるものです。実は私もこのあたりの内部的な動作については分からないところがイロイロあります(爆死 ^^;) まあ、とりあえず実質2行の記述で御利益が得られるので、いまはこうして使っておきましょう(う〜ん、へっぽこ的♪)



LRESULT WndProc(HWND hwnd,UINT msg,WPARAM wprm,LPARAM lprm)
{

switch(msg){
case WM_CREATE: //Windowが生成された
break;

case WM_DESTROY: //Windowの消去操作がされた
PostQuitMessage(0);
break;

case WM_PAINT: //描画命令が出た
//バックサーフェイスを表にコピー
BitBlt(win_hdc,0,0,640,480,Back_DC,0,0,SRCCOPY);

return DefWindowProc(hwnd,msg,wprm,lprm);
//↑DefWindowProc()にデフォルト処理を投げてやることで、
// GDI絡みの再描画指令が帳消しになってくれる

case WM_KEYDOWN: //キーが押された
switch(wprm){
case VK_ESCAPE:
PostQuitMessage(0);
break;

case VK_SPACE:
case VK_RETURN:
//カーソルブリンク中ならブリンク解除
if( Mode_stat.flag_cursor_blink == ON ){
Com_cursor_blink_end();
}
//終了待ち中なら終了処理
if( Mode_stat.flag_halt == ON ){
Com_halt_end();
}
//改ページのキー待ち中なら終了処理
if( Mode_stat.flag_page2 == ON ){
Com_page2_end();
}
break;
}
break;

case WM_LBUTTONDOWN: //マウス左ボタンが押された
//カーソルブリンク中ならブリンク解除
if( Mode_stat.flag_cursor_blink == ON ){
Com_cursor_blink_end();
}
//終了待ち中なら終了処理
if( Mode_stat.flag_halt == ON ){
Com_halt_end();
}
//改ページのキー待ち中なら終了処理
if( Mode_stat.flag_page2 == ON ){
Com_page2_end();

break;

default:
//その他のイベントはWindowsのシステムにお任せ(楽ちん、楽ちん)
return DefWindowProc(hwnd,msg,wprm,lprm);

}

return 0;


}

たったこれだけではありますが、一応ソースとサンプルスクリプトを用意してあります♪(^^;) 以前の実行ファイルと比べてどう違うのか比較してみて下さい。