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

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

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

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

ページ移動

1-3-9. WM_CREATEとWM_DESTROY

 ApHelloのプロシージャの、WM_CREATE と WM_DESTROY メッセージの処理を説明します。
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:         // メインウィンドウの新規作成
        {
            LOGFONT lf;
            HMENU   hMenu;

            ZeroMemory(&lf,sizeof(LOGFONT));
            lf.lfHeight = 32;
            lf.lfCharSet = ANSI_CHARSET;
            lstrcpy(lf.lfFaceName,"Arial");
            hFont = CreateFontIndirect(&lf);
            hMenu = GetMenu(hWnd);
            if (hMenu)
                hMenu = GetSubMenu(hMenu,1);
            if (hMenu)
                CheckMenuItem(hMenu,IDM_CENTER,MF_BYCOMMAND|MF_CHECKED);
            break;
        }
        case WM_DESTROY:
        {
            if (hFont) DeleteObject(hFont);
            PostQuitMessage(0);
            return 0;
        }
                 :

WM_CREATE メッセージ

 WM_CREATE メッセージは、CreateWindow 関数をコールしたときに、1度だけ発生(コール)します。ここでは、通常初期化作業を行ないます。子ウィンドウを使うときは良くこのメッセージで処理します。ApHelloでは、フォントを作成して、表示メニューの「中央に表示」の左にチェックマークを表示します。

 ZeroMemory から、CreateFontIndirect の5行がフォントの生成に関したコードです。この辺は、GDIと描画の分野ですので、詳細は省きますが、高さが32でArialの書体のフォントを作成します。実際に描画するのは、WM_PAINT ですので、その時に作成する方法もあります。しかし、WM_CREATE で作成しておけば、毎回作成する手間が省けて、高速な表示を期待できます。ペンとかブラシとかと同じ描画するための道具でオブジェクトとも言います。オブジェクトは頻繁に作成と破棄を繰り返すと、具合の悪いこともありますので、WM_CREATE で一括して作成しておくことは良くあります。

 表示メニューには、左側に表示、中央に表示、右側に表示の3つのサブメニューがありますが、これは「Hello World.」の表示をウィンドウのどのサイドに表示するか決定します。同時に、この3つのサブメニューには、チェックマークを表示して、現在の表示がどのサイドにあるか明示します。GetMenu から、CheckMenuItem までの5行のコードがこの処理に対応します。

WM_DESTROY メッセージ

 WM_DESTROY メッセージは、ファイルメニューの「ApHello の終了」を実行するか、[X]のクローズボタンを押すと、このメッセージが発生します。ここでは、フォントを破棄し、PostQuitMessage 関数をコールしてシステムを終了します。この関数は、WM_QUIT メッセージをポストします。すると、WinMain関数のメッセージループの、GetMessage 関数が、偽を返し、ループを抜け出ます。

ページ移動