ウィンドウを作る


用意されたウィンドウ

さて、いよいよウィンドウ作りに取りかかりたいと思う
これが終わらないと、グラフィカルなプログラミングの説明には入れない

Windowsプログラミングでは、ウィンドウの生成は二つの作業にわかれる
一つはウィンドウクラスの登録です
比較的汎用的な設定を行い、これを登録して使いまわすことができます

もう一つは、直接的なウィンドウの生成作業です
登録されているウィンドウクラスを基盤に、ウィンドウを生成します

まずこの場では、そのうち後者のウィンドウの生成作業を説明します
この作業にはウィンドウクラスが必要なのですが
あらかじめ用意されているウィンドウクラスがいくつかあるので、それを利用しましょう

ウィンドウの生成にはCreateWindow()関数を使用します
この関数は次の引数を受け取ります
HWND CreateWindow(
	LPCTSTR lpClassName , LPCTSTR lpWindowName,
	DWORD dwStyle ,
	int x , int y , int nWidth , int nHeight ,
	HWND hWndParent , HMENU hMenu ,
	HANDLE hInstance , LPVOID lpParam
);
この関数は、戻り値として HWND型 の値を返します
これはウィンドウハンドルと呼ばれるものです
オブジェクト指向経験者には、ウィンドウオブジェクトへの参照と言うと簡単でしょう
ウィンドウハンドルとは、個々のウィンドウを識別するための値のようなものです

Windows の全てのウィンドウにはハンドルが存在します
ウィンドウを操作するには、関数にハンドルを渡すことで
どのウィンドウを操作するのかを知らせることができる仕組みになっているのです
CreateWindow() 関数はウィンドウの生成に失敗すると NULL を返します

lpClassName は、先ほど説明したウィンドウクラスの名前を指定します
ウィンドウクラスは、いくつか用意されたものがあるのでこの場はそれを使います
今は、テキストフィールド用のウィンドウクラスSTATICを使用します
ここで指定した文字列で、その名前を持つウィンドウクラスと生成するウィンドウとを関連付けます

lpWindowName は、ウィンドウの名前を指定します
ボタンウィンドウなどは、この名前をラベルとして張付けたりもします

dwStyle は、ウィンドウのスタイルを設定します
これは用意された多くの定数パラメータのいずれかを指定します
例えば、境界線を持つウィンドウならWS_BORDER
タイトルバーを持つウィンドウならWS_CAPTIONをここで指定します

ここで出てきたDWORDという型は、32ビット符号なし整数です

x , y , は、ウィンドウの初期位置です。xはX軸、yはY軸を表します
この初期位置は、デスクトップの左上を 0 , 0 としてピクセルで指定します
nWidth , nHeight は、ウィンドウ幅をピクセルで指定します
nWidth は横幅、nHeight は縦幅です

hWndParent は、親ウィンドウ、またはオーナーウィンドウとなるハンドルを指定します
親ウィンドウを持つ子ウィンドウの表示は、親ウィンドウのクライアントエリアに限定され
オーナーウィンドウを持つ場合、オーナーが破棄されるとそのウィンドウも破棄されます
ウィンドウの親子関係は、後ほど詳しく解説します
今はトップレベルのウィンドウだけなので NULL を指定してください

hMenu は、メニューのハンドルを渡します
メニューについても後記します。今はないので NULL を指定してください
因みに HMENU 型 は、メニューのハンドルです

hInstance には、インスタンスハンドルを渡します

最後の lpParam は、今は NULL とします
これは、メッセージと呼ばれるものに渡されるパラメータを指定するものです
LPVOID 型 は、 void * に相当する汎用ポインタ型 です

さて、長かったですが頭の中をまとめてくださいね
重要なのは最初の引数 lpClassName と 第三引数 dwStyle です
これで、生成されるウィンドウの性質がほぼ決まります

しかし、デフォルトで返されたウィンドウハンドルは 不可視 状態です
つまり、まだ画面には表示されていません
ウィンドウの表示状態の変更には ShowWindow() 関数を使用します

BOOL ShowWindow( HWND hWnd , int nCmdShow );

hWnd には、対象となるウィンドウのハンドルを指定します
nCmdShow は、ウィンドウの表示状態を表す定数を指定します
SW_SHOW でウィンドウを表示します (下のリファレンス参照)

戻り値の BOOL 型 は、ブーリアンを格納するデータ型です
0以外の「真」か、0の「偽」を格納します
ウィンドウが以前表示状態なら0以外、非表示だったのなら0を返します
#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	HWND hwnd = CreateWindow(
			TEXT("STATIC") , TEXT("Kitty on your lap") ,
			WS_CAPTION ,
			100 , 100 , 200 , 200 , NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return 0;

	ShowWindow(hwnd , SW_SHOW);
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			TEXT("Kitty") , MB_ICONINFORMATION);

	return 0;
}


CreateWindow() 関数の後に、hwnd が NULL かどうか調べ、エラーチェックします
その後、ShowWindow() 関数を用いてウィンドウを画面に表示します

メッセージボックスをその後に意味もなく呼び出していますが
これをやらなければ、WinMain() 関数が終了してプログラムが終わってしまいます
それを阻止するため、メッセージボックスを出現させて一時的にプログラムを停止させています

もしメッセージボックスを表示しなかった場合は、ウィンドウが一瞬表示され
すぐにプログラムは終了してしまいます
この解決方法は、もう少しウィンドウの基本を説明してからにしましょう


拡張スタイル

CreateWindow() 関数には、ほとんど同じ機能を持つもので
引数が一つ増えた CreateWindowEx() 関数があります

この関数では、CreateWindow() 関数の機能をそのままに
さらに拡張スタイルが指定できるようになったものです
HWND CreateWindowEx(
	DWORD dwExStyle,
	LPCTSTR lpClassName , LPCTSTR lpWindowName,
	DWORD dwStyle ,
	int x , int y , int nWidth , int nHeight ,
	HWND hWndParent , HMENU hMenu ,
	HANDLE hInstance , LPVOID lpParam
);
第一引数以降は、全て CreateWindow() 関数と同じです
最初の引数に、拡張されたウィンドウスタイルを指定します

たとえば、WS_EX_TOOLWINDOW でツールウィンドウを作成することができます
ツールウィンドウは、タスクバーに表示されない、タイトルバーが小さいウィンドウです
#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
		 PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;

	hwnd = CreateWindowEx(WS_EX_TOOLWINDOW ,
			TEXT("STATIC") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW ,
			100 , 100 , 200 , 200 , NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return 0;

	ShowWindow(hwnd , SW_SHOW);
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			TEXT("Kitty") , MB_ICONINFORMATION);
	return 0;
}
拡張スタイルが設定できることを除いて
この関数は CreateWindow() と同じなので簡単でしょう


CreateWindow()

HWND CreateWindow(
	LPCTSTR lpClassName ,
	LPCTSTR lpWindowName,
	DWORD dwStyle ,
	int x ,
	int y ,
	int nWidth ,
	int nHeight ,
	HWND hWndParent ,
	HMENU hMenu ,
	HANDLE hInstance ,
	LPVOID lpParam
);
オーバーラップウィンドウ、ポップアップウィンドウ
子ウィンドウのいずれかを作成します

lpClassName - ウィンドウクラス名を指定します
lpWindowName - ウィンドウ名を指定します。タイトルバーなどに表示されます
dwStyle - ウィンドウのスタイルを定数で指定します
x - ウィンドウの初期位置のX座標を指定します
y - ウィンドウの初期位置のY座標を指定します
nWidth - ウィンドウの横幅を指定します
nHeight 0 ウィンドウの縦幅を指定します
hWndParend - 作成されるウィンドウのオーナー、または親ウィンドウを指定します
hMenu - メニューまたは子ウィンドウ ID を指定します
hInstance - ウィンドウに関連付けられたインスタンスハンドルを指定します
lpParam - WM_CREATE メッセージの lParam パラメータとして渡される構造体ポインタを指定します

戻り値 - 成功すると作成されたウィンドウハンドル、失敗するとNULL

定数解説
定義済みウィンドウクラス
BUTTON ユーザーがクリックできるボタンを表す、小さな長方形の子ウィンドウです
ボタンコントロールは単独またはグループの両方で使え
ラベルを付けることもテキストなしで表示することもできます
COMBOBOX コンボボックスです
リストボックスの部分は、常に表示させておくか
ユーザーの指示によってドロップダウンするようにします
コンボボックスのスタイルによって、ユーザーが選択フィールドの内容を
編集できるかできないかが決まります
EDIT キーボードからテキストを入力できる、長方形の子ウィンドウです
エディットコントロールは可変ピッチのシステムフォントを使用し
ANSI 文字セットの文字を表示します
フォントを変更するよう、WM_SETFONT メッセージを
エディットコントロールに送ることもできます
エディットコントロールは、タブ文字をタブ長と同じ長さの空白文字列に展開します
タブストップは 8 文字間隔で設定されているものとみなされます
LISTBOX 文字列のリスト (一覧) です
クリックで文字列を選択できます
また、このとき、親ウィンドウに通知メッセージが送られます
コントロールウィンドウより長いリストをスクロールするには
リストボックスのスクロールバーを使います
リストボックスは、スクロールバーを必要に応じて
自動的に表示したり消したりします
MDICLIENT MDI クライアントウィンドウです
このウィンドウは、MDI アプリケーションの子ウィンドウを
制御するメッセージを受け取ります
推奨されるスタイルビットは、WS_CLIPCHILDREN と WS_CHILD です
スクロールバーを付けるときは、WS_HSCROLL と WS_VSCROLL を使います
SCROLLBAR つまみを持ち、両端に矢印ボタンがある長方形です
ユーザーがコントロールをクリックするたびに
スクロールバーは親ウィンドウに通知メッセージを送ります
つまみの位置の更新は、必要に応じて親ウィンドウが行います
スクロールバークラスは、サイズボックスコントロールも含みます
STATIC 簡単なテキストのフィールド、ボックス
または他のコントロールにラベルを付けたり、囲んだり
分離したりするときに使う長方形です
スタティックコントロールは入出力を行いません
dw パラメータでは、次のウィンドウスタイルが指定できます
スタイル
WS_BORDER 境界線を持つウィンドウを作成します
WS_CAPTION タイトルバーを持つウィンドウを作成します
WS_BORDER スタイルも含みます
WS_CHILD 子ウィンドウを定義します
WS_POPUP スタイルとは使えません
WS_CHILDWINDOW WS_CHILD スタイルと同じです
WS_CLIPCHILDREN 親ウィンドウ内部を描画するとき
子ウィンドウが占める領域を除外します
このスタイルは、親ウィンドウを作成するときに使います
WS_CLIPSIBLINGS 兄弟関係にある子ウィンドウをクリップします
つまり、ある特定の子ウィンドウが WM_PAINT メッセージを受け取ると
WS_CLIPSIBLINGS スタイルは、更新する子ウィンドウの領域から
オーバーラップする他のすべての子ウィンドウをクリップします
WS_CLIPSIBLINGS が指定されていない場合に
子ウィンドウがオーバーラップしていると
子ウィンドウのクライアント領域内を描画するときに
重なっている子ウィンドウのクライアント領域内にも描画されます
WS_DISABLED 無効 (使用不能) なウィンドウを作成します
無効なウィンドウは、有効にするまで
ユーザーからの入力を受け取りません
WS_DLGFRAME ダイアログボックスで一般的に使われるスタイルの
境界を持つウィンドウを作成します
WS_GROUP コントロールグループの最初のコントロールを指定します
このコントロールから、次に WS_GROUP スタイルの
コントロールがくるまでに定義されたコントロールが
コントロールグループになります
各グループの最初のコントロールは
たいてい、グループからグループへユーザーが移動できるよう
WS_TABSTOP スタイルを持ちます
ユーザーは、方向キーで、グループ内のあるコントロールから
次のコントロールに入力フォーカスを変更できます
WS_HSCROLL 水平スクロールバーを持つウィンドウを作成します
WS_ICONIC WS_MINIMIZE スタイルと同じです
WS_MAXIMIZE ウィンドウを最大化の状態で作成します
WS_MAXIMIZEBOX 最大化ボタンを持つウィンドウを作成します
WS_SYSMENU スタイルも指定する必要があります
WS_EX_CONTEXTHELP スタイルと組み合わせることはできません
WS_MINIMIZE ウィンドウを最小化の状態で作成します
WS_ICONIC スタイルと同じです
WS_MINIMIZEBOX 最小化ボタンを持つウィンドウを作成します
WS_SYSMENU スタイルも指定する必要があります
WS_EX_CONTEXTHELP スタイルと組み合わせることはできません
WS_OVERLAPPED オーバーラップウィンドウを作成します
オーバーラップウィンドウはタイトルと枠を持ちます
WS_TILED スタイルと同じです
WS_OVERLAPPEDWINDOW WS_OVERLAPPED スタイル、WS_CAPTION スタイル
WS_SYSMENU スタイル、WS_THICKFRAME スタイル
WS_MINIMIZEBOX スタイル、WS_MAXIMIZEBOX スタイルを持つ
オーバーラップウィンドウを作成します
WS_POPUP ポップアップウィンドウを作成します
このスタイルは、WS_CHILD スタイルと一緒には使えません
WS_POPUPWINDOW WS_BORDER スタイル、WS_POPUP スタイル
WS_SYSMENU スタイルを持つポップアップウィンドウを作成します
ウィンドウメニューを可視化するには、WS_CAPTION スタイルと
WS_POPUPWINDOW スタイルを組み合わせる必要があります
WS_SIZEBOX WS_THICKFRAME スタイルと同じです
WS_SYSMENU タイトルバー上にウィンドウメニューボックスを持つウィンドウを作成します
WS_CAPTION スタイルも指定する必要があります
WS_TABSTOP ユーザーが[Tab]キーを押すと
入力フォーカスを受け取るコントロールを指定します
[Tab]キーを押すと、WS_TABSTOP スタイルを持つ次のコントロールに
入力フォーカスが移動します
WS_THICKFRAME サイズ変更境界を持つウィンドウを作成します
WS_SIZEBOX スタイルと同じです
WS_TILED WS_OVERLAPPED スタイルと同じです
WS_TILEDWINDOW WS_OVERLAPPEDWINDOW スタイルと同じです
WS_VISIBLE 可視状態のウィンドウを作成します
WS_VSCROLL 垂直スクロールバーを持つウィンドウを作成します
BUTTON専用スタイル
BS_3STATE 選択された状態、選択されていない状態
グレー表示の状態を持つチェックボックスを作成します
グレーの状態は、チェックボックスの状態が
決められていないことを示すときなどに使います
BS_AUTO3STATE BS_3STATE と同じボタンを作成します
ただし、ユーザーがチェックボックスを選択すると
ボックスの状態が自動的に変わります
BS_AUTOCHECKBOX チェックボックスを作成します
ただし、ユーザーがチェックボックスを選択すると
ボックスの状態が自動的に変わります
BS_AUTORADIOBUTTON ラジオボタンを作成します
ただし、ユーザーがボタンを選択すると
Windows が自動的にボタンを選択状態にし
同じグループのほかのボタンを非選択状態にします
BS_CHECKBOX チェックボックスを作成します
デフォルトでは、テキストはボックスの右側に表示されます
テキストをボックスの左側に表示するには
このフラグと BS_LEFTTEXT スタイル
または BS_RIGHTBUTTON スタイル を組み合わせます
BS_DEFPUSHBUTTON プッシュボタンを作成します
ただし、黒色の太い境界も持ちます
このボタンがダイアログボックスにある場合は
ボタンが入力フォーカスを持っていなくても
[Enter]キーを押せばボタンを選択できます
BS_GROUPBOX グループボックスを作成します
ほかのコントロールを、このコントロールの中にグループ化できます
BS_LEFTTEXT ラジオボタンスタイルやチェックボックススタイルと組み合わせると
ラジオボタンの円やチェックボックスの四角の左側にテキストが置かれます
BS_RIGHTBUTTON スタイルを同じです
BS_OWNERDRAW オーナー描画ボタンを作成します
オーナーウィンドウは、ボタンが作成されると
WM_MEASUREITEM メッセージを受け取り
ボタンの外観が変わると
WM_DRAWITEM メッセージを受け取ります
他のボタンスタイルと組み合わせることはできません
BS_PUSHBUTTON プッシュボタンを作成します
ユーザーがボタンを選択すると
オーナーウィンドウに WM_COMMAND メッセージがポストされます
BS_RADIOBUTTON ラジオボタンを作成します
デフォルトでは、テキストはボタンの右側に表示されます
テキストをボタンの左側に表示するには
このフラグと BS_LEFTTEXT スタイル
または BS_RIGHTBUTTON スタイル を組み合わせます
BS_USERBUTTON 使われなくなりました
BS_OWNERDRAW スタイルを使ってください
BS_BITMAP ビットマップを表示するボタンを作成します
BS_BOTTOM ボタンの下部にテキストを置きます
BS_CENTER ボタンの中央にテキスト置きます
BS_ICON アイコンを表示するボタンを作成します
BS_LEFT ボタンの中にテキストを左寄せします
ボタンが BS_RIGHTBUTTON スタイルを持たない
チェックボックス (またはラジオボタン) の場合
テキストはチェックボックスやラジオボタンの右側に左寄せされます
BS_MULTILINE テキストが長すぎてボタンの中に一行で収まらないとき
テキストを複数行に折り返します
BS_NOTIFY 親ウィンドウに、ボタンが BN_DBLCLK
BN_KILLFOCUS 、BN_SETFOCUS 通知メッセージを送ることを可能にします
このスタイルを持つかどうかに関わらず
ボタンは BN_CLICKED 通知メッセージを送ります
BS_PUSHLIKE プッシュボタンのような概観と機能を持つ
チェックボックスまたはラジオボタンを作ります
BS_RIGHT ボタンの中にテキストを右寄せします
ボタンが BS_RIGHTBUTTON スタイルを持たない
チェックボックス (またはラジオボタン) の場合は
テキストはチェックボックスやラジオボタンの右側に右寄せされます
BS_RIGHTBUTTON BS_LEFTTEXT スタイルと同じです
BS_TEXT ボタンがテキストを表示するよう指定します
BS_TOP ボタンの最上部にテキストを置きます
BS_VCENTER ボタンの (垂直方向の) 中央にテキストを置きます
COMBOBOX専用スタイル
CBS_AUTOHSCROLL ユーザーが行末に文字を入力すると
エディットコントロール内のテキストが自動的に右スクロールします
CBS_DISABLENOSCROLL スクロールするほどの項目数がない場合
リストボックスの垂直方向のスクロールバーが無効状態で表示されます
通常は表示されません
CBS_DROPDOWN ドロップダウンコンボボックスを作成します
CBS_SIMPLE に似ていますが
ユーザーがエディットコントロールの
横にあるアイコンを選択しないとリストボックスが表示されません
CBS_DROPDOWNLIST ドロップダウンリストボックスを作成します
CBS_DROPDOWN に似ていますが
テキストの編集はできません
CBS_HASSTRINGS オーナー描画コンボボックスの持つ項目が
文字列であることを指定します
コンボボックスが文字列用のメモリとアドレスを管理するので
アプリケーションは CB_GETLBTEXT メッセージを使用して
特定項目のテキストを取り出すことができます
CBS_LOWERCASE コンボボックスのエディットコントロールに入力された大文字を
小文字に変換します
CBS_NOINTEGRALHEIGHT コンボボックスのサイズを指定します
通常は、項目が途中で切れないように
Windows システムがコンボボックスのサイズを調整します
CBS_OEMCONVERT コンボボックスのエディットコントロールに
入力されたテキストを変換します
テキストは Windows 文字セットから OEM 文字セットに変換され
その後にまた Windows 文字セットに変換されます
この動作は、CharToOem 関数の変換が正しく行われることを保証します
このスタイルはファイル名を項目とする
コンボボックスにおいて便利ですが
CBS_SIMPLE か CBS_DROPDOWN スタイルにしか適用できません
CBS_OWNERDRAWFIXED 各項目の高さがすべて同じ
オーナー描画コンボボックスを作成します
オーナーウィンドウは、コンボボックスが作成されると
WM_MEASUREITEM メッセージを受け取り、コンボボックスの外観が変わると
WM_DRAWITEM メッセージを受け取ります
CBS_OWNERDRAWVARIABLE 各項目の高さが可変の
オーナー描画コンボボックスを作成します
オーナーウィンドウは、コンボボックスの各項目について
WM_MEASUREITEM メッセージを受け取り、コンボボックスの外観が変わると
WM_DRAWITEM メッセージを受け取ります
CBS_SIMPLE 常時リストボックスが表示されるコンボボックスを作成します
リストボックス内の現在の選択項目は
エディットコントロール内に表示されます
CBS_SORT リストボックスに追加された文字列を自動的に並べ替えます
CBS_UPPERCASE コンボボックスのエディットコントロールに入力された小文字を
大文字に変換します
EDIT専用スタイル
ES_AUTOHSCROLL ユーザーが行末に文字を入力すると
エディットコントロール内のテキストが自動的に右スクロールします
ES_AUTOVSCROLL ユーザーが最下行で[Enter]キーを押すと
テキストを自動的に上にスクロールします
ES_CENTER 複数行エディットコントロールにおいて
テキストを中央揃えで表示します
ES_LEFT テキストを左揃えで表示します
ES_LOWERCASE エディットコントロールに入力された文字を小文字に変換します
ES_MULTILINE 複数行エディットコントロールを作成します
デフォルトは一行のエディットコントロールです
ダイアログボックス内の複数行エディットコントロールで[Enter]キーを押すと
デフォルトのボタンがアクティブになります
[Enter]キーを改行のために使うには
ES_WANTRETURN スタイルを使用します
ES_NOHIDESEL エディットコントロール内の
選択文字列のデフォルトの動作を無効にします
デフォルトでは、コントロールが
入力フォーカスを失うと選択項目が表示されなくなり
入力フォーカスを受け取ると反転表示されます
ES_NOHIDESEL を指定すると、選択されたテキストは
コントロールがフォーカス持っていない場合も反転表示されます
ES_NUMBER 数字だけが入力できるようにします
ES_OEMCONVERT エディットコントロールに入力されたテキストを変換します
テキストは Windows 文字セットから OEM 文字セットに変換され
その後にまた Windows 文字セットに変換されます
この動作は、CharToOem 関数の変換が正しく行われることを保証します
このスタイルはファイル名を項目とするコンボボックスにおいて便利です
ES_PASSWORD エディットコントロールに入力された文字を
アスタリスク (*) で置き換えて表示します
表示する文字を変更するには
EM_SETPASSWORDCHAR メッセージを使います
ES_READONLY ユーザーによるテキストの入力や編集をできなくします
ES_RIGHT 複数行エディットコントロールにおいて、テキストを右揃えで表示します
ES_UPPERCASE エディットコントロールに入力された文字を、大文字に変換します
ES_WANTRETURN ダイアログボックス内の複数行エディットコントロールに
テキストを入力しているときに[Enter]キーが押されると
改行が挿入されるようにします
このスタイルを指定していないと
ダイアログボックスのデフォルトのプッシュボタンが押されます
このスタイルは、一行のエディットコントロールでは効果がありません
LISTBOX専用スタイル
LBS_DISABLENOSCROLL スクロールするほどの項目数がない場合
リストボックスの垂直スクロールバーが無効状態で表示されます
通常はスクロールバーは表示されません
LBS_EXTENDEDSEL [Shift]キーとマウス、または特殊なキーの組み合わせで
複数の項目を選択できるようにします
LBS_HASSTRINGS リストボックスの項目が、文字列であることを指定します
リストボックスが文字列用のメモリとアドレスを管理するので
アプリケーションは LB_GETTEXT メッセージを使用して
特定項目のテキストを取り出すことができます
デフォルトでは、オーナー描画のリストボックス以外の
すべてのリストボックスが、このスタイルを持ちます
LBS_MULTICOLUMN 水平にスクロールする複数列のリストボックスを指定します
LB_SETCOLUMNWIDTH メッセージで列の幅を設定します
LBS_MULTIPLESEL 項目をクリックまたはダブルクリックして
複数の項目を選択できるようにします
LBS_NODATA データを持たないリストボックスを指定します
リストボックス内の項目数が
1000 を超えるときにこのスタイルを指定します
データを持たないリストボックスには
LBS_OWNERDRAWFIXED スタイルが必要です
LBS_SORT スタイルや LBS_HASSTRINGS スタイルは設定できません
項目に文字列やビットマップデータを持たないことを除くと
データを持たないリストボックスはオーナー描画リストボックスに似ています
項目の追加、挿入、削除のコマンドは常に無視されます
文字列の検索は、常に失敗します
Windows は、項目を描画する必要があると
オーナーウィンドウに WM_DRAWITEM メッセージを送ります
WM_DELETEITEM メッセージと一緒に送られる
DRAWITEMSTRUCT 構造体の itemID メンバは
描画する項目の行数を指定します
データを持たないリストボックスは
WM_DELETEITEM メッセージを送りません
LBS_NOINTEGRALHEIGHT リストボックスのサイズを指定します
通常は、項目が途中で切れないように
Windows システムがリストボックスのサイズを調整します
LBS_NOREDRAW 項目が変更されても
リストボックスの外観を更新しないように指定します
このスタイルは、WM_SETREDRAW メッセージを送ることでいつでも変更できます
LBS_NOSEL 表示するだけで選択できない項目を持つリストボックスを指定します
LBS_NOTIFY ユーザーがリストボックス内の
文字列をクリック (またはダブルクリック) するたびに
親ウィンドウに入力メッセージを通知します
LBS_OWNERDRAWFIXED 各項目の高さがすべて同じ
オーナー描画リストボックスを作成します
オーナーウィンドウは、リストボックスが作成されると
WM_MEASUREITEM メッセージを受け取り
リストボックスの外観が変わると WM_DRAWITEM メッセージを受け取ります
LBS_OWNERDRAWVARIABLE 各項目の高さがすべて可変の
オーナー描画リストボックスを作成します
オーナーウィンドウは、リストボックス内の各項目について
WM_MEASUREITEM メッセージを受け取り
リストボックスの外観が変わると WM_DRAWITEM メッセージを受け取ります
LBS_SORT リストボックス内の文字列をアルファベット順にソートします
LBS_STANDARD リストボックス内の文字列をアルファベット順にソートします
ユーザーが文字列をクリック (またはダブルクリック) するたびに
親ウィンドウは入力メッセージを受け取ります
リストボックスは四方に境界を持ちます
LBS_USETABSTOPS 文字列を描画するときに
リストボックスがタブ文字を認識し、展開できるようにします
デフォルトのタブ位置は 32 ダイアログボックス単位です
GetDialogBaseUnits 関数は、ダイアログボックスで
使用される単位をピクセル単位で返します
LBS_WANTKEYBOARDINPUT ユーザーがキーを押してリストボックスが入力フォーカスを持つたびに
リストボックスのオーナーが WM_VKEYTOITEM メッセージを受けるようにします
これにより、キーボード入力に特殊な処理を行えるようになります
SCROLLBAR専用スタイル
SBS_BOTTOMALIGN スクロールバーの下端をCreateWindow 関数の
x、y、nWidth、nHeight パラメータで
指定した長方形の下端にそろえます
スクロールバーの高さはデフォルトの高さになります
このスタイルは SBS_HORZ スタイルと一緒に使います
SBS_HORZ 水平スクロールバーを作成します
SBS_BOTTOMALIGN スタイルも
SBS_TOPALIGN スタイルも指定しないと
スクロールバーは CreateWindow 関数の
x、y、nWidth、nHeight パラメータで
指定した位置とサイズになります
SBS_LEFTALIGN スクロールバーの左端を
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した長方形の左端にそろえます
スクロールバーの幅は、デフォルトの幅になります
このスタイルは SBS_VERT スタイルと一緒に使います
SBS_RIGHTALIGN スクロールバーの右端を
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した長方形の右端にそろえます
スクロールバーの幅は、デフォルトの幅になります
このスタイルは SBS_VERT スタイルと一緒に使います
SBS_SIZEBOX サイズボックスを作成します
SBS_SIZEBOXBOTTOMRIGHTALIGN スタイルも
SBS_SIZEBOXTOPLEFTALIGN スタイルも指定しないとサイズボックスは
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した位置とサイズになります
SBS_SIZEBOXBOTTOMRIGHTALIGN サイズボックスの右下隅を
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した長方形の右下隅にそろえます
サイズボックスのサイズは、デフォルトのサイズになります
このスタイルは SBS_SIZEBOX スタイルと一緒に使います
SBS_SIZEBOXTOPLEFTALIGN サイズボックスの左上隅を
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した長方形の左上隅にそろえます
サイズボックスのサイズは、デフォルトのサイズになります
このスタイルは SBS_SIZEBOX スタイルと一緒に使います
SBS_SIZEGRIP SBS_SIZEBOX スタイルと同じです
ただし、縁が盛り上がります
SBS_TOPALIGN スクロールバーの上端を
CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した長方形の上端にそろえます
スクロールバーの高さは、デフォルトの高さになります
このスタイルは SBS_HORZ スタイルと一緒に使います
SBS_VERT 垂直スクロールバーを作成します
SBS_RIGHTALIGN スタイルも
SBS_LEFTALIGN スタイルも指定しないと
スクロールバーは CreateWindow 関数の x、y、nWidth、nHeight パラメータで
指定した位置とサイズになります
STATIC専用スタイル
SS_BITMAP ビットマップを表示するスタティックコントロールを作成します
nWidth と nHeight パラメータは無視され
ビットマップに合わせてコントロールのサイズが調整されます
SS_BLACKFRAME ウィンドウの枠と同じ色の枠を持つボックスを作成します
Windows のデフォルトの配色は黒です
SS_BLACKRECT ウィンドウの枠と同じ色で塗りつぶされた長方形を作成します
Windows のデフォルトの配色は黒です
SS_CENTER テキストを中央揃えで表示します
テキストが行末を超える場合は自動的に折り返されます
SS_CENTERIMAGE コントロールのサイズが変更されても
SS_BITMAP や SS_ICON スタイルを持つ
スタティックコントロールの中心点は変えないようにします
SS_GRAYFRAME 画面の背景 (デスクトップ) と同じ色の枠を持つボックスを作成します
Windows のデフォルトの配色は灰色です
SS_GRAYRECT 画面の背景 (デスクトップ) と同じ色で塗りつぶされた長方形を作成します
Windows のデフォルトの配色は灰色です
SS_ICON アイコンを表示するスタティックコントロールを作成します
nWidth と nHeight パラメータは無視され
アイコンに合わせてコントロールのサイズが調整されます
SS_LEFT テキストを左揃えで表示します
テキストが行末を超える場合は自動的に折り返されます
SS_LEFTNOWORDWRAP テキストを左揃えで表示します
タブは展開されますが、テキストは折り返されません
行末を超えるテキストはクリップされます
SS_METAPICT メタファイルを表示するスタティックコントロールを作成します
メタファイルは、コントロールのサイズに
合わせた大きさで表示されます
SS_NOPREFIX コントロールのテキスト中のアンパサント (&) 文字を
アクセラレータのプリフィックス文字として
解釈しないように指定します
このスタティックコントロールスタイルは、定義されている
どのようなスタティックコントロールとも組み合わせて指定できます
アプリケーションは、ビット演算子 OR (|) 使って
SS_NOPREFIX スタイルを他のスタイルと組み合わせることができます
ダイアログボックスのスタティックコントロール内に
アンパサント (&) を含むファイル名や
その他の文字列を表示する必要があるときに便利です
SS_NOTIFY ユーザーがコントロールを
クリック (またはダブルクリック) するたびに
親ウィンドウに STN_CLICKED 通知メッセージ
または STN_DBLCLK 通知メッセージを送ります
SS_RIGHT テキストを右揃えで表示します
テキストが行末を超える場合は自動的に折り返されます
SS_RIGHTIMAGE コントロールのサイズが変更されても
SS_BITMAP スタイルや SS_ICON スタイルを持つ
スタティックコントロールの右下隅は変えないようにします
SS_SIMPLE 単一行のテキストを左揃えで表示します
このコントロールの親ウィンドウやダイアログボックスは
WM_CTLCOLORSTATIC メッセージを処理してはいけません
SS_WHITEFRAME ウィンドウの背景と同じ色の枠を持つボックスを作成します
Windows のデフォルトの配色は白です
SS_WHITERECT ウィンドウの背景と同じ色の
枠で塗りつぶされた長方形を作成します
Windows のデフォルトの配色は白です
ダイアログボックススタイル
DS_3DLOOK ダイアログボックスを立体的に表示します
現在のバージョンの Windows 用にコンパイルされた
アプリケーションが作成するダイアログボックスには
自動的に立体的な外観が適用されます
DS_ABSALIGN ダイアログボックスの座標系を、スクリーン座標にします
デフォルトでは、クライアント座標になります
DS_CENTER デスクトップの作業領域の中央に
ダイアログボックスを配置します
作業領域は、タスクバーに覆われていない領域です
DS_CENTERMOUSE ダイアログボックスの中央にマウスポインタを配置します
DS_CONTEXTHELP ダイアログボックスのタイトルバーに[?]ボタンを追加します
ユーザーがこの[?]ボタンをクリックすると
マウスポインタに疑問符が付きます
その後、ユーザーがダイアログボックス内のコントロールをクリックすると
コントロールは WM_HELP メッセージを受け取ります
コントロールはダイアログの処理にそのメッセージを送ります
このダイアログの処理は、HELP_WM_HELP コマンドを使った WinHelp 関数です
ヘルプアプリケーションは、通常、コントロールのヘルプを持つ
ポップアップウィンドウを表示します
DS_CONTEXTHELP は、プレースホルダーでしかありません
ダイアログボックスが作成されると
システムは DS_CONTEXTHELP があることを確認し
もしあれば、ダイアログボックスの拡張スタイルに
WS_EX_CONTEXTHELP を追加します
WS_EX_CONTEXTHELP は WS_MAXIMIZEBOX や
WS_MINIMIZEBOX スタイルとは一緒に使用できません
DS_CONTROL 他のダイアログボックスの子ウィンドウとして適切に機能する
プロパティシート内のページのような
ダイアログボックスを作成します
DS_FIXEDSYS SYSTEM_FONT の代わりに
SYSTEM_FIXED_FONT を使用します
DS_LOCALEDIT 16 ビットのアプリケーションで使用します
DS_MODALFRAME モーダルダイアログボックスフレームを持つ
ダイアログボックスを作成します
DS_NOFAILCREATE エラーが発生してもダイアログボックスを作成します
DS_NOIDLEMSG ダイアログボックスが表示されている間
WM_ENTERIDLE メッセージを抑制します
DS_RECURSE コントロールに似たダイアログボックスを作成します
DS_SETFONT ダイアログボックステンプレートが
フォント名とポイントサイズを持つことを示します
対応するフォントは、ダイアログボックスで
テキストを表示するために使われます
DS_SETFOREGROUND ダイアログボックスをフォアグラウンドにします
内部で Windows システムが
SetForegroundWindow 関数を呼び出します
このスタイルは、16 ビット版の Windows には適用できません
DS_SYSMODAL システムモーダルダイアログボックスを作成します
このスタイルを指定すると、ダイアログボックスが
最前面ウィンドウ (WS_EX_TOPMOST) になります
その他の点では、ダイアログボックス自身や
システム内の他のウィンドウの振る舞いに影響を与えません

CreateWindowEx()

HWND CreateWindowEx(
  DWORD dwExStyle,
  LPCTSTR lpClassName ,
  LPCTSTR lpWindowName,
  DWORD dwStyle ,
  int x ,
  int y ,
  int nWidth ,
  int nHeight ,
  HWND hWndParent ,
  HMENU hMenu ,
  HANDLE hInstance ,
  LPVOID lpParam
);
拡張スタイルが指定できること以外は CreateWindow() と同じです
dwExStyle 以外の引数については CreateWindow() を参照してください

dwExStyle - 拡張スタイルを指定します

定数解説
拡張スタイル
WS_EX_ACCEPTFILES ドラッグアンドドロップで、ファイルを受け入れます
WS_EX_APPWINDOW ウィンドウが最小化されると
トップレベルウィンドウがタスクバー上に置かれます
WS_EX_CLIENTEDGE 縁が沈んで見える境界線を持つウィンドウを指定します
WS_EX_CONTEXTHELP ダイアログボックスのタイトルバーに[?]ボタンを追加します
ユーザーがこの[?]ボタンをクリックすると
マウスポインタに疑問符が付きます
その後、ユーザーがダイアログボックス内のコントロールをクリックすると
コントロールは WM_HELP メッセージを受け取ります
コントロールはダイアログの処理にそのメッセージを送ります
このダイアログの処理は、HELP_WM_HELP コマンドを使った WinHelp 関数です
ヘルプアプリケーションは、通常
コントロールのヘルプを持つポップアップウィンドウを表示します
WS_EX_CONTEXTHELP は WS_MAXIMIZEBOX や
WS_MINIMIZEBOX スタイルとは一緒に使用できません
WS_EX_CONTROLPARENT ユーザーが[Tab]キーを使って子ウィンドウ間を移動できるようにします
WS_EX_DLGMODALFRAME 二重の境界線を持つウィンドウを作成します
dwStyle パラメータに WS_CAPTION スタイルを指定することで
タイトルバーを持つようにも作成できます
WS_EX_LEFT 左揃えされたプロパティを持つウィンドウを作成します。デフォルトです
WS_EX_LEFTSCROLLBAR 垂直スクロールバーがクライアント領域の左側に置かれます
ヘブライ語やアラビア語をサポートしているシステムで有効です
他の言語では、このスタイルは無視され、エラーとして扱われます
WS_EX_LTRREADING 垂直スクロールバーがクライアント領域の左側に置かれます
ヘブライ語やアラビア語をサポートしているシステムで有効です
他の言語では、このスタイルは無視され、エラーとして扱われます
WS_EX_MDICHILD MDI 子ウィンドウを作成します
WS_EX_NOPARENTNOTIFY このスタイルで作成された
子ウィンドウが作成されたり破棄されたりするときに
その親ウィンドウにWM_PARENTNOTIFY メッセージを送らないように指定します
WS_EX_OVERLAPPEDWINDOW WS_EX_CLIENTEDGE と WS_EX_WINDOWEDGE スタイルの組み合わせです
WS_EX_PALETTEWINDOW WS_EX_WINDOWEDGE 、WS_EX_TOOLWINDOW
WS_EX_TOPMOST スタイルの組み合わせです
WS_EX_RIGHT 右揃えされたプロパティを持つウィンドウを作成します
ヘブライ語やアラビア語をサポートしているシステムで有効です
他の言語では、このスタイルは無視され、エラーとして扱われます
WS_EX_RIGHTSCROLLBAR 垂直スクロールバーがクライアント領域の右側に置かれます
デフォルトです
WS_EX_RTLREADING 右から左への読み取り順序を持つプロパティを持ったウィンドウを作成します
ヘブライ語やアラビア語をサポートしているシステムで有効です
他の言語では、このスタイルは無視され、エラーとして扱われます
WS_EX_STATICEDGE ユーザーの入力を受け付けない項目用の
立体的に見える境界スタイルを持つウィンドウを作成します
WS_EX_TOOLWINDOW ツールウィンドウを作成します
これは、フローティングツールバー用のウィンドウです
ツールウィンドウは通常のタイトルバーより小さいタイトルバーを持ちます
タスクバーには表示されません
ユーザーが[Alt]キーと[Tab]キーを
同時に押すと現れるダイアログ内にも、表示されません
WS_EX_TOPMOST 最前面ウィンドウを作成します
ウィンドウが非アクティブな状態でも、ほかのウィンドウの前面に表示されます
SetWindowPos 関数を使用すると、非最前面ウィンドウに変更できます
WS_EX_TRANSPARENT 透過ウィンドウを作成します
このウィンドウの下にあるどのようなウィンドウも、遮られることなく表示されます
このスタイルで作成されたウィンドウは、その下にある兄弟ウィンドウが
すべて更新されたときにだけ、WM_PAINT メッセージを受け取ります
WS_EX_WINDOWEDGE ウィンドウが盛り上がった縁の境界線を持つことを指定します

ShowWindow()

BOOL ShowWindow( HWND hWnd , int nCmdShow );

指定されたウィンドウの表示状態を設定します

hWndM - 対象のウィンドウのハンドルを指定します
nCmdShow - ウィンドウの表示状態を表す定数を指定します

戻り値 - 以前に表示されていたときは 0 以外、非表示にされていたときは 0

nCmdShow には以下の定数を指定します

定数解説
SW_HIDE ウィンドウを非表示にし、他のウィンドウをアクティブにします
SW_MAXIMIZE ウィンドウを最大化します
SW_MINIMIZE ウィンドウを最小化し、Z 順位が次のトップレベルウィンドウをアクティブにします
SW_RESTORE ウィンドウをアクティブにし、表示します
ウィンドウが最小化されていたり最大化されていたりすると
元の位置とサイズに戻ります
SW_SHOW ウィンドウをアクティブにして、現在の位置とサイズで表示します
SW_SHOWDEFAULT アプリケーションを起動させたプログラムが
CreateProcess 関数に渡す
STARTUPINFO 構造体の wShowWindow メンバで指定された
SW_ フラグを基にして、表示状態を設定します
SW_SHOWMAXIMIZED ウィンドウをアクティブにして、最大化します
SW_SHOWMINIMIZED ウィンドウをアクティブにして、最小化します
SW_SHOWMINNOACTIVE ウィンドウを最小化します
アクティブなウィンドウは、アクティブな状態を維持します
非アクティブなウィンドウは、非アクティブなままです
SW_SHOWNA ウィンドウを現在の状態で表示します
アクティブなウィンドウはアクティブな状態を維持します
SW_SHOWNOACTIVATE ウィンドウを直前の位置とサイズで表示します
アクティブなウィンドウはアクティブな状態を維持します
SW_SHOWNORMAL ウィンドウをアクティブにして、表示します
ウィンドウが最小化または最大化されているときは、位置とサイズを元に戻します




前のページへ戻る次のページへ