Windowsデスクトップアプリケーション(1-2-1 st)ウィンドウを作成


ウィンドウクラスウィンドウクラスは、いくつかのウィンドウで共有可能な動作のセットを定義します.たとえば、ボタンのセットでは、ユーザーがボタンをクリックすると、各ボタンは似たような動作をします.もちろん、ボタンは完全に同じではありません.各ボタンには独自のテキスト文字列が表示され、独自の画面座標があります.各ウィンドウの一意のデータをインスタンスデータと呼びます.各ウィンドウは、プログラムがクラスのインスタンスを1つだけ作成しても、ウィンドウクラスに関連付けなければなりません.ウィンドウクラスがC++の意味での「クラス」ではないことを理解することが重要です.逆に、オペレーティングシステム内部で使用されるデータ構造です.ウィンドウクラスは、実行時にシステムに登録されます.新しいウィンドウクラスを登録するには、まずWNDCLASS構造を入力します.
// Register the window class.
const wchar_t CLASS_NAME[]=L"Sample Window Class";
WNDCLASS wc={};
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.lpszClassName=CLASS_NAME;

次の構造メンバーを設定する必要があります.
  • lpfnWndProcは、ウィンドウプロシージャまたは「window proc」と呼ばれるアプリケーション定義関数へのポインタです.ウィンドウ・プロシージャは、ウィンドウの動作の大部分を定義します.ウィンドウプロセスについては、後で詳しく検討します.今、それを前向きな参考にすればいい.
  • hInstanceはアプリケーションインスタンスのハンドルです.この値はwWinMainのhInstanceパラメータから取得します.
  • lpszClassNameは、ウィンドウクラスを識別する文字列です.

  • クラス名は現在のプロセスのローカル名であるため、名前はプロセス内で一意である必要があります.ただし、標準的なWindowsコントロールにもクラスがあります.これらのコントロールのいずれかを使用する場合は、コントロールクラス名と競合しないクラス名を選択する必要があります.たとえば、ボタンコントロールのウィンドウクラス名は「Button」です.WNDCLASS構造には他のメンバーがここに表示されていません.この例では、ゼロに設定したり、塗りつぶしたりできます.MSDNドキュメントには、構造が詳細に記載されています.次に、WNDCLASS構造のアドレスをRegisterClass関数に渡す.この関数は、オペレーティングシステムにウィンドウクラスを登録します.
    RegisterClass(&wc);

    ウィンドウを作成ウィンドウの新しいインスタンスを作成するには、CreateWindowEx関数を呼び出します.
    HWND hwnd=CreateWindowEx(
        0, // Optional window styles.
        CLASS_NAME, // Window class
        L"Learn to Program Windows", // Window text
        WS_OVERLAPPEDWINDOW, // Window style
        // Size and position
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL, // Parent window    
        NULL, // Menu
        hInstance, // Instance handle
        NULL // Additional application data
    );
    if(hwnd==NULL)
        return 0;

    MSDNの詳細なパラメータの説明を読むことができますが、ここでは簡単なまとめがあります.
  • 最初のパラメータでは、透明なウィンドウなどのウィンドウのオプションの動作を指定できます.このパラメータをデフォルトの動作にゼロに設定します.
  • CLASS_NAMEはウィンドウクラスの名前です.これにより、作成中のウィンドウのタイプが定義されます.
  • ウィンドウテキストは、異なるタイプのウィンドウによって異なる方法で使用される.ウィンドウにタイトルバーがある場合は、テキストがタイトルバーに表示されます.
  • ウィンドウスタイルは、ウィンドウの外観と感覚を定義するフラグのセットです.定数WS_OVERLPPEDWINDOWは、実際にはいくつかのフラグが組み合わせられた1つのビットまたはビットです.これらのタグは、ウィンドウにタイトルバー、枠線、システムメニュー、最小化および最大化ボタンを一緒に与えます.このフラグのセットは、トップレベルのアプリケーションウィンドウで最も一般的なスタイルです.
  • 位置とサイズについて、定数CW_USEDEFAULTはデフォルト値を使用することを意味します.
  • 次のパラメータは、新しいウィンドウの親ウィンドウまたは所有者ウィンドウを設定します.サブウィンドウを作成している場合は、親を設定します.最上位ウィンドウの場合はNULLに設定します.
  • アプリケーションウィンドウの場合、次のパラメータはウィンドウのメニューを定義します.この例ではメニューを使用しないので、値はNULLです.
  • hInstanceは、前述したインスタンスハンドルです.(WinMain:アプリケーションエントリポイントを参照).
  • の最後のパラメータは、void*タイプの任意のデータを指すポインタです.この値を使用して、ウィンドウ・プロシージャにデータ構造を渡すことができます.アプリケーションのステータスを管理するセクションで、可能な使用方法を示します.

  • CreateWindowExは新しいウィンドウのハンドルに戻り、関数が失敗した場合はゼロに戻ります.ウィンドウを表示するには、ウィンドウが表示されていても、ShowWindow関数のウィンドウハンドルを使用します.
    ShowWindow(hwnd,nCmdShow);

    hwndパラメータはCreateWindowExが返すウィンドウハンドルです.nCmdShowパラメータは、ウィンドウを最小化または最大化するために使用することができる.オペレーティングシステムは、wWinMain関数を使用してこの値をプログラムに渡します.ウィンドウを作成するための完全なコードです.WindowProcは依然として関数の前方宣言であることを覚えておいてください.
    // Register the window class.
    const wchar_t CLASS_NAME[]=L"Sample Window Class";
    WNDCLASS wc={};
    wc.lpfnWndProc=WindowProc;
    wc.hInstance=hInstance;
    wc.lpszClassName=CLASS_NAME;
    RegisterClass(&wc);
    // Create the window.
    HWND hwnd=CreateWindowEx(
        0, // Optional window styles.
        CLASS_NAME, // Window class
        L"Learn to Program Windows", // Window text
        WS_OVERLAPPEDWINDOW, // Window style
        // Size and position
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL, // Parent window    
        NULL, // Menu
        hInstance, // Instance handle
        NULL // Additional application data
    );
    if(hwnd==NULL)
        return 0;
    ShowWindow(hwnd,nCmdShow);

    おめでとうございます.窓口を作りました.これで、ウィンドウには何も含まれていないか、ユーザーと対話していません.実際のGUIアプリケーションでは、ウィンドウがユーザーおよびオペレーティングシステムからのイベントに応答します.次のセクションでは、ウィンドウ・メッセージがこのインタラクティビティを提供する方法について説明します.次のウィンドウメッセージ
    原文リンク:Creating a Window