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

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

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

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

ページ移動

2-2-9. 初期化はWM_CREATEメッセージで行ないます

 あるウィンドウに、子ウィンドウを作成する場合は、CreateWindow した後に作成する方法と、ウィンドウプロシージャの WM_CREATE メッセージで作成する方法の2つがあります。これらの2つの方法を検証してみたいと思います。

CreateWindow 関数後に子ウィンドウを作成する

 アプリケーションのメインウィンドウを作成した後に、そのウィンドウで使用する子ウィンドウを作成する例を以下に示します。
    HWND hMain,hEdit;

         :(他のコード)
    hMain = CreateWindow("ApHelloClass","ApHello",WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT,0,CW_USEDEFAULT,0,
                         NULL,NULL,hInstance,NULL);
    if (!hMain) return FALSE;
    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"RICHEDIT",NULL,
                           ES_AUTOVSCROLL|WS_VSCROLL|WS_CHILD|
                           WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
                           WS_VISIBLE|ES_MULTILINE|ES_NOHIDESEL|
                           ES_DISABLENOSCROLL,
                           0,0,0,0,
                           hMain,(HMENU)ID_RTF,hInstance,NULL);
    ShowWindow(hMain,nCmdShow);
    UpdateWindow(hMain);
         :(他のコード)
    DestroyWindow(hEdit);
 しかし通常、hEditウィンドウは、リサイズへの対応や各種処理が必要なので、グローバル変数化しないと実際には対処できません。また、"ApHello"ウィンドウを1つだけ作成するのから関係ありませんが、もし複数個作成する場合は、その度に "RICHEDIT" ウィンドウを作成する必要があります。

WM_CREATE メッセージで子ウィンドウを作成する

 アプリケーションのメインウィンドウのウィンドウプロシージャ内で、そのウィンドウで使用する子ウィンドウを作成する例を以下に示します。
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg
                                  ,WPARAM wParam,LPARAM lParam)
{
    static HWND  hEdit = NULL;  // RichEdit Control

    switch (uMsg)
    {
        case WM_CREATE: // メインウィンドウの新規作成
        {
            InitCommonControls();
            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                          "RICHEDIT",NULL,
                          ES_AUTOVSCROLL|WS_VSCROLL|WS_CHILD|
                          WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
                          WS_VISIBLE|ES_MULTILINE|ES_NOHIDESEL|
                          ES_DISABLENOSCROLL,
                          0,0,0,0,
                          hMain,(HMENU)ID_RTF,hInstance,NULL);
             :(他のコード)
            break;
        }
        case WM_SIZE:   // ウィンドウのサイズを変更した
        {
            if (hEdit)  // リッチテキストエディタのサイズを設定
                MoveWindow(hEdit,0,0,
                           LOWORD(lParam),HIWORD(lParam),TRUE);
            break;
        }
        case WM_DESTROY:
            DestroyWindow(hEdit);
            break;
             : (他のメッセージ)
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
 WM_CREATE で作成し、WM_SIZE で子ウィンドウの位置と大きさを設定します。そして、WM_DESTROY メッセージで子ウィンドウを破棄します。この場合は、すべての hEdit ウィンドウの操作がプロシージャ内にありますので、static 宣言でも不都合はありません。しかもスコープが明確で、コードが優れています。
 残念ながら、このコードでも複数のウィンドウを同時にオープンする場合には使用できません。しかし方法はあります。ウィンドウの補足メモリブロックを使用するのが、一番優れた方法です。次の項目でその方法を述べます。

ページ移動