コントロール

メインウィンドウを作るとき、CreateWindowEx関数を使いました。 実は、この関数によってボタンなども作ることができます。 ボタンのようなものを、コントロールといいます。 ですから、CreateWindowEx関数を使いこなせば、Windows のアプリケーションらしくなります。 では、ボタンを例として説明していきます。

ボタンを作る(win631)

"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つあります。

値は、いつどこでも取得できるのです。 しかし、最初の方法を採用しました。


[目次] [次]