アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

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つのメッセージを処理したら、この関数を抜けるので、自動変数では値が保持されないからです。

ページ移動