メインウィンドウを作るとき、CreateWindowEx関数を使いました。 実は、この関数によってボタンなども作ることができます。 ボタンのようなものを、コントロールといいます。 ですから、CreateWindowEx関数を使いこなせば、Windows のアプリケーションらしくなります。 では、ボタンを例として説明していきます。
"MyApp.h" です。
// // MyApp.h // class MyApp : public MyMainWnd{ public: // WM_CREATE void wmCreate(){ CreateWindowEx( NULL, // 拡張スタイル TEXT("BUTTON"), // クラス名 TEXT("ボタン"), // キャプション WS_CHILD | WS_VISIBLE, // スタイル 10, 10, // 位置 100, 100, // サイズ hWnd, // 親ハンドル NULL, // メニュー hInst, // インスタンス NULL); } };
実行画面です。
ボタンは、メインウィンドウが出来た時、そのメインウィンドウに貼り付けます。 メインウィンドウが出来ると、Windows は WM_CREATE メッセージを送ってきます。 ですから、そこへ wmCreate を自作し、そこでボタンを作ります。
ボタンは、CreateWindowEx関数で作ります。 これは次のようになっています。
HWND CreateWindowEx( DWORD dwExStyle, // 拡張ウィンドウスタイル LPCTSTR lpClassName, // 登録されているクラス名 LPCTSTR lpWindowName, // ウィンドウ名 DWORD dwStyle, // ウィンドウスタイル int x, // ウィンドウの横方向の位置 int y, // ウィンドウの縦方向の位置 int nWidth, // ウィンドウの幅 int nHeight, // ウィンドウの高さ HWND hWndParent, // 親ウィンドウまたはオーナーウィンドウのハンドル HMENU hMenu, // メニューハンドルまたは子識別子 HINSTANCE hInstance, // アプリケーションインスタンスのハンドル LPVOID lpParam // ウィンドウ作成データ );
引数の説明です。
lpClassNameはクラス名です。 メインウィンドウのときは、アプリケーション名を入れると説明しました。 そのときは、CreateWindowEx関数を使う前に Windows にクラス名を登録しました。 しかし、既に登録されているクラス名があります。 それが "BUTTON" です。
ウィンドウスタイルの、WS_CHILD などは単に数値です。 複数のスタイルは、or でつなげます。 WS_VISIBLE を入れると表示されます。 これがないと見えません。 ところで、WS_CHILD は必ず入れます。 うっかり忘れるとメインウィンドウの外に飛び出してしまいます。 ボタンを貼り付ける=WS_CHILD と覚えておきます。 忘れると次のようになります。 メインウィンドウは別の位置にあります。 しかし、これでわかることがあります。 それは、ボタンもウィンドウだということです。
ところで、困ったことに、アプリケーションインスタンスのハンドル hInstance が必要となります。 これは、WinMain関数に送ってくれるだけです。 wmCreate はウィンドウプロシージャの中にあるのです。 これを取得する方法は3つあります。
値は、いつどこでも取得できるのです。 しかし、最初の方法を採用しました。