|
|
|
1-3-8. プロシージャWindowsのプログラミングの大部分は、このプロシージャ部のコーディングと言っても過言ではありません。良い事ではありませんが、あちこちにサポート関数を作っても、1、000行を超えることもあります。LRESULT CALLBACK ApHelloProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
static HFONT hFont;
static UINT idFormat = IDM_CENTER;
static LPSTR pHello = "Hello World.";
switch (uMsg)
{
case WM_CREATE: // メインウィンドウの新規作成
:
break;
case WM_DESTROY: // ウィンドウの破棄時に発生
:
return 0;
case WM_PAINT: // クライアントエリアの描画
:
return 0;
case WM_COMMAND: // コマンド
:
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
プロシージャの基本型は、上記の様になります。この関数は、システムがコールするため、CALLBACK 宣言されます。クラスの登録時に WNDCLASS 構造体の lpfnWndProc メンバに、この関数のポインタを設定します。よってグローバルである必要はありませんので、static でもかまいません。この関数のパラメータは、ウィンドウのハンドルとメッセージ、そして、wParam,lParam のメッセージの追加情報の4つです。プロシージャでは、uMsg のメッセージの内容で,switch 文で分岐します。そして目的に合ったメッセージだけ、case 文でフックして、処理します。他の多くのメッセージは、DefWindowProc 関数に渡され、システムがあらかじめ定めた処理を行ないます。フックとは良い言葉です。必要なメッセージだけ針で引っかけて、処理します。その内容を良く表しています。 Windowsの通常のメッセージは、WM_XXXの名前で定義されています。コントロールのメッセージは、EM_XXXなどの別の名前があります。またユーザが自由に使うことのできる、WM_USERと言うメッセージもあります。メッセージのことは、前項のメッセージを参照してください。 変数は静的変数でないといけません このプロシージャには、hFont,idFormat,pHello の3つの変数がありますが、3つとも static の静的変数でないといけません。自動変数では動作しません。なぜでしょうか。例えば、hFont は、作成は、WM_CREATE メッセージで、破棄は、WM_DESTROY メッセージです。使用は、WM_PAINT メッセージで行なっています。この様に各メッセージで共通に使う場合は、絶対に静的な変数でないといけません。Windowsは、1つのメッセージを処理したら、この関数を抜けるので、自動変数では値が保持されないからです。
|