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

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

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

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

ページ移動

2-2-4. ウィンドウの作成

 ここでは、CreateWindow,CreateWindowEx 関数でウィンドウを作成することについて詳しく説明します。CreateWindowEx の第一パラメータ(dwExStyle)を0とすると、CreateWindow のAPIとまったく同一なので、CreateWindowEx だけを説明します。WIN32では通常はこれを使用します。

CreateWindowEx のAPI

HWND CreateWindowEx(
    DWORD  dwExStyle;       拡張ウィンドウスタイル(WS_EX_XXのスタイル)
    LPCSTR lpszClassName;   登録されたクラス名の文字列(WS_XXのスタイル)
    LPCSTR lpszWindowName;  ウィンドウのタイトルの文字列
    DWORD  dwStyle;         ウィンドウスタイル
    int    x,y;             ウィンドウの水平と垂直座標の位置
    int    nWidth;          ウィンドウの幅
    int    nHeight;         ウィンドウの高さ
    HWND   hwndParent;      親ウィンドウのハンドル
    HMENU  hmenu;           メニューのハンドルか子ウィンドウのID
    HINSTANCE hinst;        アプリケーションインスタンスのハンドル
    LPVOID lpvCreateParams; ウィンドウ作成データのアドレス
);

CreateWindowEx のパラメータ

 dwExStyledwStyleは前項で説明しました。また、lpszClassNameは、RegisterClassExでクラスの登録を行ないますが、その時の名前を設定します。他のパラメータは下記に記します。

パラメータ 説明
lpszWindowName キャプションのあるウィンドウの場合は、ウィンドウのタイトルの文字列を指定します。コントロールなどの子ウィンドウの場合は、そのウィンドウが保持するテキストを設定します。ウィンドウを作成した後でも、SetWindowText 関数でこれらの内容を設定することができます。これらは変更することが多いので、SetWindowText を使用することが多いでしょう。その場合は、このパラメータは、NULLを指定します。
x,y ウィンドウの水平と垂直座標の位置を、スクリーン座標で指定します。x の値に、CW_USEDEFAULTを指定すると、Windowsはウィンドウの左上隅の位置としてデフォルトの位置を選択して、y パラメータを無視します。CW_USEDEFAULTはオーバーラップウィンドウに対してだけ有効です。これらの値は、0,0で、CreateWindowEx して、WM_SIZEメッセージで、MoveWindow 関数で設定することが子ウィンドの場合は良くあります。
nWidth,nHeight ウィンドウの幅と高さを、スクリーン座標で指定します。4隅の座標ではなく、幅と高さを設定します。nWidthが、CW_USEDEFAULTのとき、Windowsはウィンドウに対してデフォルトの幅と高さを選択します。デフォルトの幅は初期状態での x 座標位置からスクリーンの右端までの長さ、デフォルトの高さは初期状態での y 座標位置からアイコン領域の上端までの長さです。CW_USEDEFAULTは、オーバーラップウィンドウに対してだけ有効です。ポップアップウィンドウや子ウィンドウに対して、CW_USEDEFAULTを指定した場合、nWidthとnHeightはともに0に設定されます。これらの値は、0,0で、CreateWindowEx して、WM_SIZE,WM_MOVEメッセージで、MoveWindow 関数で設定することが子ウィンドの場合は良くあります。
hwndParent 作成されるウィンドウの親ウィンドウかオーナーウィンドウのハンドルを設定します。それに伴う動作は、ウィンドウの親子関係所有されているウィンドウをご覧ください。アプリケーションのトップウィンドウの場合は、NULLを指定します。
hmenu メニューのハンドル、またはウィンドウのスタイルに依存する子ウィンドウIDを指定します。オーバーラップウィンドウかポップアップウィンドウでは、このパラメータはウィンドウで使われるメニューを設定します。クラスの登録でメニューを設定しているときには、NULLでもかまいません。子ウィンドウの場合には、子ウィンドウIDで、親ウィンドウにイベントを通知するダイアログボックスコントロールが使う整数値になります。子ウィンドウIDはアプリケーションにより決められ、同じ親ウィンドウを持つすべての子ウィンドウに対して一意でなければなりません。
hinst アプリケーションインスタンスのハンドルを指定します。
lpvCreateParams WM_CREATEメッセージでは、lParamパラメータが、CREATESTRUCT構造体のポインタになります。この構造体のlpCreateParams メンバにここで指定した値を代入します。つまり、CreateWindowEx 関数のメイン側から、WM_CREATEを処理するプロシージャに何らかのパラメータを渡せます。この変数は色々な使用法があります。マルチドキュメントインターフェイス(MDI)の場合は、別の方式を取りますが、詳細は別で説明します。

オーバーラップウィンドウの作成

 アプリケーションのメインウィンドウとして動作する、オーバーラップウィンドウの作成例を以下に示します。普通は、WinMain関数内に記述します。
    HWND       hWndMain;
    WNDCLASSEX wc;
    static LPSTR pClassName = "ApHelloClass";
    static LPSTR pAppName = "ApHello";

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = (WNDPROC)ApHelloProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(hInstance,pAppName);
    wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = pAppName;
    wc.lpszClassName = pClassName;
    wc.hIconSm       = LoadImage(hInstance,pAppName,IMAGE_ICON
                                          ,16,16,LR_DEFAULTCOLOR);
    if (!RegisterClassEx(&wc)) return FALSE;
    hWndMain = CreateWindow(pClassName,pAppName,WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,0,CW_USEDEFAULT,0,
                            NULL,NULL,hInstance,NULL);
    if (!hWndMain) return FALSE;
    ShowWindow(hWndMain,nCmdShow);
    UpdateWindow(hWndMain);

子ウィンドウの作成

 メインウィンドウのクライアント上に、ツールバーとリストボックスコントロールを子ウィンドウとして作成する例を以下に示します。普通は、ウィンドウプロシージャの、WM_CREATEメッセージに記述します。
 ツールバーのサイズは、ツールバーコントロールに,WM_SIZEメッセージを送信することで自動的に決定します。リストボックスコントロールも作成時は、0,0,0,0の位置とサイズで、WM_SIZEメッセージ内で、ツールバーの残りのクライアント領域全体の大きさに設定します。
LRESULT CALLBACK ApMakeProc(HWND hWnd,UINT uMsg
                                     ,WPARAM wParam,LPARAM lParam)
{
    static HWND  hWndTb = NULL;  // Toolbar Control
    static HWND  hWndLi = NULL;  // LISTBOX Control

    switch (uMsg)
    {
        case WM_CREATE: // メインウィンドウの新規作成
        {
            InitCommonControls();
            hWndTb = CreateWindowEx(WS_EX_TOOLWINDOW,
                        TOOLBARCLASSNAME,NULL,
                        WS_CHILD|WS_VISIBLE|TBSTYLE_TOOLTIPS,
                        0,0,0,0,
                        hWnd,(HMENU)ID_TOOLBAR,hInstance,NULL);
            if (hWndTb)
            {
                :  (ツールバーの初期化)
            }
            hWndLi = CreateWindow("LISTBOX", NULL,
                        WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|
                        LBS_NOINTEGRALHEIGHT|LBS_NOTIFY,
                        0,0,0,0,
                        hWnd,(HMENU)ID_KIND,hInstance,NULL);
            break;
        }
        case WM_SIZE:   // ウィンドウのサイズを変更した
        {
            RECT rc,rc2;
            INT  h = 0;

            if (hWndTb) // ツールバーのサイズを自動設定
                SendMessage(hWndTb,WM_SIZE,wParam,lParam);
            if (hWndLi) // リストボックスのサイズを設定
            {
                GetClientRect(hWnd,&rc);
                if (hWndTb) // ツールバーの高さをhにする
                {
                    GetClientRect(hWndTb,&rc2); h = rc2.bottom;
                }
                MoveWindow(hWndLi,0,h+2,rc.right,rc.bottom-h-2,TRUE);
            }
            break;
        }
             : (他のメッセージ)
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

ページ移動