【C++】「ウィンドウ」を表示する方法

【C++】
「ウィンドウ」を表示する方法




「Windowsアプリ」で、
「ウィンドウ」を表示する方法をまとめています。


「ウィンドウ」を表示するまでの流れは、
・「ウィンドウ」の処理を記述した「ウィンドウプロシージャ(Window Procedure)」関数を定義
・「ウィンドウクラス(Windows Class)」を「WindowsOS」へ登録
・「ウィンドウ」の「インスタンス」を作成
・「ウィンドウ」を表示
・「メッセージループ」を回す
・「ウィンドウクラス」の登録を解除
という項目で形成されます。


覚えてしまえば簡単ですが、
各項目を設定することで、
「Windowsアプリ」の画面を作成し、
情報を表示することができます。



詳しくは、
下記をご参照ください。



INDEX


「ウィンドウ」とは
「Windows」の「ウィンドウ作成プログラム」を作成して表示する流れ


「ウィンドウプロシージャ」を定義する方法
「ウィンドウクラス」の登録
「ウィンドウ」の「インスタンス」を作成する方法
作成した「ウィンドウ」を見れるように可視化する方法
「メッセージループ」を設定する方法
「ウィンドウクラス」の登録を解除する方法

Gallery

「ウィンドウ」とは


「ウィンドウ」は、
何かの情報を表示するためのもので、
マウスを使って、ユーザーが操作することもできます。

大枠としての「ウィンドウ」から、
「ボタン」「テキストボックス」などの「GUI部品」も
「ウィンドウ」の一種とのこと。
画面上には「ウィンドウ」が溢れていることになります。


Back

「ウィンドウ」を表示するまでの流れ


「ウィンドウ」を表示するまでの流れは、
・「ウィンドウ」の処理を記述した「ウィンドウプロシージャ(Window Procedure)」関数を定義
・「ウィンドウクラス(Windows Class)」を「WindowsOS」へ登録
・「ウィンドウ」の「インスタンス」を作成
・作成した「ウィンドウ」を見えるように「可視化」する
・「メッセージループ」を回す
・「ウィンドウクラス」の登録を解除
という項目で形成されます。


複数の「ウィンドウ」を同時に作成・表示できるようにしているため、
「ウィンドウ」を表示するまでの流れが「複雑化」している。


Back

「Windows」の「ウィンドウ作成プログラム」を作成して表示する流れ





Windows「ウィンドウ作成プログラム」のサンプルコード

#include <windows.h>
#include <tchar.h>

// プロトタイプ宣言
HWND Create(HINSTANCE hInst);
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);


// 開始位置
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
HWND hWnd;
MSG msg;

// ウィンドウを作成する
hWnd = Create( hInst );
if( hWnd == NULL )
{
MessageBox( NULL, _T("ウィンドウの作成に失敗しました"), _T("エラー"), MB_OK );
return 1;
}

// ウィンドウを表示する
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );

// メッセージループ
while( bRet = GetMessage( &msg, NULL, 0, 0 ) )
{
// 「bRet = GetMessage( &msg, NULL, 0, 0 );」は、メッセージを取得するコード

if( bRet == 0 || bRet == -1 )
{
// アプリケーションを終了させるメッセージ
// 「GetMessage()」が失敗したときのメッセージ「-1」
// のいずれかであった場合、
// ループを抜ける
break;
}
else
{
// 他のメッセージを受け取った場合の処理
TranslateMessage( &msg ); // メッセージの変換
DispatchMessage( &msg ); // メッセージの転送
}
}

UnregisterClass(_T("Default Class Name"), hWnd);
return msg.wParam;

}



// ウィンドウを作成する
HWND Create(HINSTANCE hInst)
{
WNDCLASSEX wc;

// ウィンドウクラスの情報を設定
wc.cbSize = sizeof(wc); // 構造体サイズ
wc.style = CS_HREDRAW | CS_VREDRAW; // スタイル
wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ
wc.cbClsExtra = 0; // 拡張情報1
wc.cbWndExtra = 0; // 拡張情報2
wc.hInstance = hInst; // インスタンスハンドル
wc.hIcon = (HICON)LoadImage( // アイコン
NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
0, 0, LR_DEFAULTSIZE | LR_SHARED
);
wc.hIconSm = wc.hIcon; // 子アイコン
wc.hCursor = (HCURSOR)LoadImage( // マウスカーソル
NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
0, 0, LR_DEFAULTSIZE | LR_SHARED
);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景
wc.lpszMenuName = NULL; // メニュー名
wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名

// ウィンドウクラスを登録する
if( RegisterClassEx( &wc ) == 0 ){ return NULL; }

// ウィンドウを作成する
return CreateWindow(
wc.lpszClassName, // ウィンドウクラス名
_T("Sample Program"), // タイトルバーに表示する文字列
WS_OVERLAPPEDWINDOW, // ウィンドウの種類
CW_USEDEFAULT, // ウィンドウを表示する位置(X座標)
CW_USEDEFAULT, // ウィンドウを表示する位置(Y座標)
CW_USEDEFAULT, // ウィンドウの幅
CW_USEDEFAULT, // ウィンドウの高さ
NULL, // 親ウィンドウのウィンドウハンドル
NULL, // メニューハンドル
hInst, // インスタンスハンドル
NULL // その他の作成データ
);
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
break;

default:
return DefWindowProc( hWnd, msg, wp, lp );
}


return 0;
}



Back

「ウィンドウプロシージャ」を定義する方法


「ウィンドウプロシージャ」とは、
ウィンドウで発生したイベントを処理する「関数」。
「ウィンドウプロシージャ」の名前は、
「自由」に設定可能。
「書式」はルールに従って記述しなければならない。


「WinMain」関数と同じく、
「WindowsOS」から呼び出される関数で、
どちらも「_stdcall」を再定義したもの。

「WindowsOS」から呼び出してもらうための関数は、
「コールバック関数」といい、
「WINAPI」の代わりに「CALLBACK」と記述することもある。


「DefWindowProc」関数は、
「ウィンドウ」の「移動」などの基本的な動作をサポートする関数。
「デフォルト」の処理として、記述される。
記述のない動作に対する反応が、
あらかじめ「DefWindowProc」関数に記述されていることもあるので、
「DefWindowProc」関数を「デフォルト」に記述しておく。



「ウィンドウプロシージャ」の基本書式

LRESULT WINAPI MyWinProc(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);



「ウィンドウプロシージャ」の引数説明
HWND hWnd「ウィンドウ」の「ハンドル名」
UINT Msgメッセージの種類
WPARAM wParamメッセージの補足情報
LPARAM lParamメッセージの補足情報



「ウィンドウプロシージャ」の書式と記述

// 「インクルードファイル」の読み込み++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include <windows.h>
#include <tchar.h>


// プロトタイプ宣言
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 「ウィンドウプロシージャ」関数のプロトコル宣言
LRESULT WINAPI ウィンドウプロシージャ関数名(HWND, UINT, WPARAM, LPARAM);



// Start - 「WinMain」関数の記述ブロック++++++++++++++++++++++++++++++++++++++++++++++++++++ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
WinMain関数の記述場所
return 0; }



// Start - 「ウィンドウプロシージャ」関数の記述ブロック+++++++++++++++++++++++++++++++++++++++++ // 「ウィンドウプロシージャ」の関数内容の記述
ini WINAPI ウィンドウプロシージャ関数名(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch( msg )
{
case WM_LBUTTONDOWN: // 左クリックされた時の処理
MessageBox(hWnd, _T("左クリックがされました"), _T("Win App Message Box"), MB_OK); break;

default:
// デフォルトの処理
return DefWindowProc( hWnd, msg, wParam, lParam );
}


return 0;

}




「DefWindowProc」関数の書式
LRESULT DefWindowProc(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);


「DefWindowProc」関数を呼び出すのは、
「OS」の「Windows」なので、
イベントが発生した時に、この関数を呼び出すように
「ウィンドウクラス」に、「DefWindowProc」関数のポインタを渡す。

「ウィンドウプロシージャ」関数に記載されていない条件の場合は、
「DefWindowProc」関数にデフォルトで記載されている反応が採用される。



「DefWindowProc」関数の引数説明
HWND hWnd イベントハンドラ
UINT Msg 「ウィンドウメッセージ(Window Message)」を指定する引数。
「WM_・・・」などの定数を使用し、
情報を渡す引数。
どのボタンを押したかなどのアクション情報などが渡される。
WPARAM wParam メッセージの補足情報
LPARAM lParam メッセージの補足情報
返り値




「ウィンドウメッセージ(Window Message)」の値
定数説明
WM_CREATE  CreateWindow(Ex)が呼ばれたとき.この処理はCreateWindow(Ex)処理中で行われる.
wParam:0
lParam:(LPCREATESTRUCT) CREATESTRUCT構造体のポインタ.CreateWindow(Ex)の最後の引数.MDIとかで使われるが,普通使わない.
返り値:(int) 0:ウインドウの作成を継続する.-1:ウインドウを破棄する,このときCreateWindow(Ex)からはNULLが返される.

WM_CLOSE 閉じるボタンとかが押された時.ウインドウまたはアプリケーションの終了を示す.
wParam:0
IParam:0
システムに処理させると DestroyWindow() などが 呼ばれてウインドウが破棄される. その際 WM_DESTROY メッセージがポストされる.
何もしないで0Lを返すとウインドウは閉じられない.
WM_DESTROY  ウインドウが画面から削除された後.最初に破棄されようとしているウインドウに送られ, 次にその子ウインドウに送られる.
wParam:0
lParam:0
メインウインドウが閉じられたときなど,アプリケーションを終了したいときは PostQuitMessage() を呼ぶ.
WM_COMMAND ・メニューコマンドが選択されたとき,
・コントロール(ボタンとか)からその親ウインドウに通知メッセージが送られたとき,
・アクセラレータキー操作が変換されたとき.
WM_PAINT WM_PAINT
ウインドウ(の一部)をペイントしないといけない時. UpdateWindow()やRedrawWindow()が呼び出されたときにも送られる. Section2 で少しやってるのでそちらを参照.
wParam:(HDC) 一部のコモンコントロールでのみ使われるパラメタ. このデバイスコンテキストでの描画を可能にする. NULLの場合はデフォルトのデバイスコンテキストを使用.
lParam:0

WM_MOVE ウインドウが移動したとき
wParam:0
LOWORD(lParam):(WORD) クライアント領域左上隅のx座標※
HIWORD(lParam):(WORD) クライアント領域左上隅のy座標※
※オーバーラップウインドウとポップアップウインドウではスクリーン座標, 子ウインドウなら親ウインドウにおける相対座標.
WM_LBUTTONDOWN マウスの左ボタンが押されたときに送られてくる
LOWORD(wParam):(WORD) メニュー項目,コントロール,アクセラレータの識別子
HIWORD(wParam):(WORD) 通知コード(コントロールの時),1(アクセラレータ),0(メニュー)
lParam:(HWND) コントロールのハンドル(コントロールのとき),NULL(それ以外)
WM_SIZE ウインドウのサイズが変更されたとき.
wParam (WPARAM) ウインドウのサイズ変更タイプ
SIZE_MAXIMIZED ウインドウが最大化された.
SIZE_MINIMIZED
ウインドウが最小化された.
SIZE_RESTORED 最大化,最小化以外でウインドウサイズが変更された.
SIZE_MAXHIDE
他のウインドウのどれかが最大化された(このウインドウがポップアップの時)
SIZE_MAXSHOW 他のウインドウのどれかの最大化が解除された(〃)
LOWORD(lParam)
(WORD) クライアント領域の新しい幅
HIWORD(lParam)
(WORD) クライアント領域の新しい高さ
WM_KEYDOWN WM_KEYDOWN 非システムキーが押されたとき
WM_KEYUP WM_KEYUP 非システムキーが放されたとき
wParam : (int) 仮想キーコード.Section3.2参照.
Param:フラグとか. 手元の資料がビット単位で取り出せみたいな勢いなので省略.
LOWORD(lParam)? キー落下中に押されたことになった回数. WM_KEYUPでは常に「1」
WM_LBUTTONDOWN マウス左ボタンが押された
WM_MBUTTONDOWN 中が押された
WM_RBUTTONDOWN 右が押された
WM_LBUTTONUP 左が放された
WM_MBUTTONUP 中が放された
WM_RBUTTONUP 右が放された
WM_LBUTTONDBLCLK 左ダブルクリック
WM_MBUTTONDBLCLK 中ダブルクリック
WM_RBUTTONDBLCLK 右ダブルクリック
WM_MOUSEMOVE マウスカーソルが動いた
カーソルがウインドウクライアント領域にあるとき, マウスがキャプチャーされている場合はキャプチャーしたウインドウへ, それ以外はカーソルを含むウインドウへポストされる.
wParam (WPARAM) どの仮想キーが押されてるか.下表を|(OR)で組み合わせた値.
MK_CONTROL Ctrlキーが押されている.
MK_LBUTTON マウスの左ボタンが押されている.
MK_MBUTTON マウスの中央ボタンが押されている.
MK_RBUTTON マウスの右ボタンが押されている.
MK_SHIFT Shiftキーが押されている.
LOWORD(lParam)
(WORD)カーソルのx座標(クライアント領域の左上隅が原点)
HIWORD(lParam)
(WORD)カーソルのy座標(クライアント領域の左上隅が原点)
Section3.1で少しやってます.
WM_HSCROLL WM_HSCROLL 水平(横方向)
WM_VSCROLL WM_VSCROLL 垂直(縦方向)
・ウインドウの標準水平(垂直)スクロールバーでイベントが発生したとき,
・そのウインドウの子である水平(垂直)スクロールバーコントロールでイベントが発生したとき.
SB_LINELEFT(SB_LINEUP) 左(上)へ1単位だけスクロール.左(上)端の三角ボタンが押されたときなど.
SB_LINERIGHT(SB_LINEDOWN) 右(下)へ1単位だけスクロール.右(下)端の三角ボタンが押されたときなど.
SB_PAGELEFT(SB_PAGEUP) 左(上)へウインドウの幅に応じてスクロール.スクロールボックスの左(上)側が押されたときなど.
SB_PAGERIGHT(SB_PAGEDOWN) 右(下)へウインドウの幅に応じてスクロール.スクロールボックスの右(下)側が押されたときなど.
SB_THUMBTRACK スクロールボックスをドラッグした時.HIWORD(wParam)がその位置
SB_THUMBPOSITION 絶対位置でスクロール.HIWORD(wParam)が現在位置
SB_TOP 左上へスクロール
SB_BOTTOM 右下へスクロール
SB_ENDSCROLL スクロールを終了する
HIWORD(wParam)
(short int) LOWORD(wParam)がSB_THUMB***の時はスクロールボックスの現在地.
lParam
(LPARAM) スクロールバーコントロールから送られてきた場合は,そのハンドル.
WM_TIMER SetTimer()で指定した時間間隔が経過するたびに, タイマをインストールするようい指定したウインドウのコールバック関数か, 指定したタイマ用コールバック関数に送られる.
wParam:タイマの識別子
lParam:SetTimer()に渡されたアプリケーション定義のコールバック関数のポインタ


Back

「ウィンドウクラス」の登録


構造体「WNDCLASSEX」は、 構造体「_WNDCLASS」を「拡張」した「構造体」。

現在は、
拡張された構造体「_WNDCLASS」が
主に使用されている。




構造体「_WNDCLASS」の書式

typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;

構造体「WNDCLASSEX」の書式

typedef struct tagWNDCLASSEXW {
UINT cbSize;
// Win 3.x UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
// Win 4.0
HICON hIconSm;
} WHDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;





構造体「_WNDCLASS」の値



UINT style; ウィンドウクラスの基本スタイルを表す定数を指定
この場は、よく使われる CS_HREDRAW と CS_VREDRAWを用いましょう
CS_HREDRAW は水平に、ウィンドウサイズが変更されるとウィンドウの内容を再描画
CS_VREDRAW は垂直に、ウィンドウサイズが変更されるとウィンドウの内容を再描画

表示するウインドウのスタイルを設定します。CSで始まる値を指定。。"|"で複数指定することもできる。
例::CS_HREDRAW|CS_VREDRAW;
水平垂直方向にウインドウサイズが変更されたときウインドウを再作画する。 
WNDPROC lpfnWndProc; WNDPROC 型とは、ウィンドウプロシージャと呼ばれる関数のポインタ型です
lpfnWndProc にウィンドウプロシージャを設定します
ウィンドウプロシージャのアドレスを指定する。
(WNDPROC)プロシージャ名;等を代入する。
int cbClsExtra; 次の二つの引数 cbClsExtra と cbWndExtra は
クラス構造体、ウィンドウ構造体の追加領域をバイト単位で予約するものです
通常はその必要がないので、多くの場合ここは 0 を指定
int cbWndExtra; 次の二つの引数 cbClsExtra と cbWndExtra は
クラス構造体、ウィンドウ構造体の追加領域をバイト単位で予約するものです
通常はその必要がないので、多くの場合ここは 0 を指定
HANDLE hInstance; インスタンスハンドルを渡します WinMainのパラメータのインスタンスハンドルを設定。
HICON hIcon; タスクバーやタイトルバーに表示されるアイコンのビットマップを指定。
HICON 型は、アイコンのハンドルです
アイコンのビットマップを渡すにはLoadIcon()関数を使用します
使用するアイコンを指定する。LoadIcon関数を使用して行う。


HICON LoadIcon(HINSTANCE hInstance , LPCTSTR lpIconName);
hInstance には、アイコンのリソースが入っているモジュールのインスタンスを指定。が
システム定義のアイコンの場合は NULL にします


HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName)
第1パラメータは、Windowsがもっているアイコンを使うならNULL。自作のアイコンを使う場合は、インスタンスハンドル(WinMainの第1パラメータと同じ)を指定する。
第2パラメータはアイコンの名前を指定。
Windowsがもっているアイコンを使用する場合は以下のものを使用。
名称
説明
IDI_APPLICATION
アプリケーションアイコン
IDI_ASTERISK
アスタリスクのアイコン (吹き出しの中に i の文字)
IDI_EXCLAMATION
感嘆符のアイコン
IDI_HAND
ストップ印のアイコン
IDI_QUESTION
疑問符のアイコン
IDI_WINLOGO
Windows ロゴアイコン
自作の場合は、名前に(MAKEINTRESOURCE)をつけて型変換を行うこと。

wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
HCURSOR hCursor; ウィンドウのクライアントエリア上のマウスカーソルを指定。
HCURSOR 型 とは、カーソルのハンドルです
定義済みのカーソルは LoadCursor() 関数で取得します
マウスカーソルを指定する。
Windowsが提供するマウスカーソルを使う場合は以下のようにする。

HCURSOR LoadCursor(HINSTANCE hInstance , LPCTSTR lpCursorName);
カーソルのリソースが入っているモジュールのインスタンスを指定。
アイコン同様に、システム定義のカーソルの場合は NULL を指定。
カーソルの名前を指定。
第一引数が NULL であれば、定義されているマウスカーソルの定数を指定。


LoadCursor(NULL,IDC_ARROW);
自作したマウスカーソルを使用することも可能。
HBRUSH hbrBackground; クライアントエリアの背景色を指定。
「HBRUSH」型の、ブラシのハンドルを指定する。
ブラシのハンドルは、
「GetStockObject」関数を使用して指定する。
(HBRUSH)(COLOR_WINDOW + 1);
で、白色を表す。

「GetStockObject」関数の書式は、

HGDIOBJ GetStockObject( int fnObject );

「fnObject」に、取得したいハンドルの定数を指定。
この関数はブラシのほかにも、ペン、パレットといったハンドルも取得可能。
LPCTSTR lpszMenuName; クラスメニューを指定。が
今回のプログラムにメニューはないので、ここは NULL としましょう
Windowにつけるメニューを設定する。
メニューがなければNULLを設定。
LPCTSTR lpszClassName; 「ウィンドウクラス」の名前を表す文字列を指定する。
「CreateWindow」関数の「第一引数」で指定した文字列のこと。


これで、WNDCLASS 型変数の初期化ができますね
しかし、この時点ではまだウィンドウクラスは登録されていません
次に、ここで初期化した変数をRegisterClass()関数に渡します
この関数にウィンドウクラスを渡して、はじめて登録されます



構造体「WNDCLASSEX」の値

要素説明
UINT cbSize 構造体のサイズ。
「sizeof」関数を使用した構造体「WNDCLASSEX」のサイズを指定する
マシン語には引数の種類を判別できないため、指定する必要がある。
Win 3.x
UINT style クラススタイル
「ウィンドウ」の挙動を決める「クラススタイル」を表す定数を設定する。
WNDPROC lpfnWndProc ウィンドウプロシージャのメモリアドレス指定。

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM)

「ウィンドウプロシージャ」関数と同じ型。
int cbClsExtra 構造体の追加バイト数。
追加の特別情報を記憶させたいときに使用する。
不要の場合は、「OL」「0」「NULL」を指定。
int cbWndExtra 構造体の追加バイト数
追加の特別情報を記憶させたいときに使用する。
不要の場合は、「OL」「0」「NULL」を指定。
HINSTANCE hInstanceプログラムのインスタンスハンドル
HICON hIconアイコンのハンドル
HCURSOR hCursorカーソルのハンドル
HBRUSH hbrBackgroundウィンドウの背景色
LPCTSTR lpszMenuNameメニュー名
LPCTSTR lpszClassName「クラス名」または「ATOM」
Win 4.0
HICON hIconSm 縮小アイコンのハンドル
HICON hIconを参照。
「NULL」を指定すると、「hIcon」に指定したアイコン画像を縮小して使用される。
独自の「アイコン」「カーソル」を使用したい場合は、
「リソースエディタ(Resource Editor)」というプログラムで登録する。
「WindowsOS」に標準で用意されている「アイコン」「カーソル」の場合は、
「LoadIcon」関数と「LoadCursor」関数を利用して読み込む。
フリーソフトのリソースエディタmぽある。


Back

「ウィンドウ」の「インスタンス」を作成する方法


「CreateWindow」関数は、
「ウィンドウ」の「インスタンス」を作成するには、

・「CreateWindow」関数
・「CreateWindowEx」関数
・「CreateWindowA」関数
・「CreateWindowW」関数

のいずれかを利用する。


「CreateWindowEx」関数は、
「CreateWindow」関数の拡張版。
「CreateWindow」関数とほとんど同じ機能を持つつもので
引数が一つ増えたのが「CreateWindowEx」関数。
増えた「引数」は、
「第一引数」の「DWORD dwExStyle」。
他の「引数」は、「CreateWindow」関数と同じ。

現在は、
「CreateWindow」関数が主に使用されている。


「CreateWindow」関数は、
プロジェクトの「文字コード」の設定によって、
・「CreateWindowA」関数
・「CreateWindowW」関数
を使い分けている。
都合の良い方に「typedef」で名前を変更し、実行している。
プロジェクトアイコンをクリックしてプロパティで確認が可能。

・「マルチバイト文字セットを使用する」 = 「CreateWindowA関数」
・「Unicode文字セットを使用する」 = 「CreateWindowW関数」

が実行されます。
「CreateWindowA」関数と「CreateWindowW」関数を、
それぞれ指定して使用することも可能。

プロジェクトの「文字コード」の設定よって影響してくるものは、
「第一引数」「第二引数」。
「文字列」を指定する場合、
「マルチバイト文字セット」は、
単純に、「"test"」とダブルクオテーションで指定すれば良い。
「Unicode文字セット」では、
文字の前に「大文字のL」を置いて、
「L"test"」という書式で記述しなければいけない。


「マルチバイト文字セット」の場合は、
「第一引数」「第二引数」が「LPCSTR(const char)型」なのに対し、
「Unicode文字セット」では、
「第一引数」「第二引数」が「LPCWSTR(const w_char)型」になる。

他の「関数」でも同じ扱いになるので、
「文字列」関連のコンパイルエラーが出たら、
まず「文字コード」の違いを疑う。



「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
);
「CreateWindow」関数は、

・オーバーラップウィンドウ
・ポップアップウィンドウ
・子ウィンドウ

のいずれかを作成する。



「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() を参照してください



「CreateWindow」関数と「CreateWindowEx」関数の「値」

戻り値 HWND型
これはウィンドウハンドルと呼ばれるもの
HWND 変数名 = CreateWindow( 引数, 引数, 引数, ・・・);
と記述する。
DWORD dwExStyle 拡張型の「CreateWindowEx」関数で増えた「引数」。
他の引数は、「CreateWindow」関数と同じ。
LPCTSTR lpClassName 重要
「RegisterClass」関数でクラス登録した時に指定した「クラス名(ウィンドウクラス)」を指定


以前のRegisterClass関数またはRegisterClassEx関数の呼び出しにより作成されたウィンドウクラスの名前を表す文字列へのポインタまたはクラスアトムを指定します。アトムを指定する場合には、このパラメータの下位ワードがアトムとなるようにし、上位ワードはゼロになるようにしなければいけません。文字列を指定する場合には、ウィンドウクラス名を指定します。ウィンドウクラスの名前は、RegisterClass関数またはRegisterClassEx関数で登録されたクラス名か、システムの定義済みコントロールのクラス名を指定することができます。クラス名の大文字・小文字は区別されません。

システムの定義済みコントロールのクラス名は、以下のものがあります。

定数解説
定義済みウィンドウクラス
BUTTON ユーザーがクリックできるボタンを表す、小さな長方形の子ウィンドウです
ボタンコントロールは単独またはグループの両方で使え
ラベルを付けることもテキストなしで表示することもできます
COMBOBOX コンボボックスです
リストボックスの部分は、常に表示させておくか
ユーザーの指示によってドロップダウンするようにします
コンボボックスのスタイルによって、ユーザーが選択フィールドの内容を
編集できるかできないかが決まります
EDIT キーボードからテキストを入力できる、長方形の子ウィンドウです
エディットコントロールは可変ピッチのシステムフォントを使用し
ANSI 文字セットの文字を表示します
フォントを変更するよう、WM_SETFONT メッセージを
エディットコントロールに送ることもできます
エディットコントロールは、タブ文字をタブ長と同じ長さの空白文字列に展開します
タブストップは 8 文字間隔で設定されているものとみなされます
LISTBOX 文字列のリスト (一覧) です
クリックで文字列を選択できます
また、このとき、親ウィンドウに通知メッセージが送られます
コントロールウィンドウより長いリストをスクロールするには
リストボックスのスクロールバーを使います
リストボックスは、スクロールバーを必要に応じて
自動的に表示したり消したりします
MDICLIENT MDI クライアントウィンドウです
このウィンドウは、MDI アプリケーションの子ウィンドウを
制御するメッセージを受け取ります
推奨されるスタイルビットは、WS_CLIPCHILDREN と WS_CHILD です
スクロールバーを付けるときは、WS_HSCROLL と WS_VSCROLL を使います
SCROLLBAR つまみを持ち、両端に矢印ボタンがある長方形です
ユーザーがコントロールをクリックするたびに
スクロールバーは親ウィンドウに通知メッセージを送ります
つまみの位置の更新は、必要に応じて親ウィンドウが行います
スクロールバークラスは、サイズボックスコントロールも含みます
STATIC 簡単なテキストのフィールド、ボックス
または他のコントロールにラベルを付けたり、囲んだり
分離したりするときに使う長方形です
スタティックコントロールは入出力を行いません
dw パラメータでは、次のウィンドウスタイルが指定できます
スタイル


LPCTSTR lpWindowName 「ウィンドウの名前」を指定。
文字列でも入力が可能だが、
プロジェクトが採用しているも文字コードによって、
「"ウィンドウ名"」「L"ウィンドウ名"」のいずれかで入力可能。

「ウィンドウ名」を表す文字列への「ポインタ」で指定可能。

「タイトルバー」を持つ「ウィンドウスタイル」の場合、この文字列が「タイトルバー」に表示される。
「ボタン」「チェックボックス」「スタティックコントロール」などのコントロールを作成する場合、この文字列「ウィンドウの名前」がコントロールテキストになる。

「SS_ICON」スタイルを持つ「スタティックコントロール」を作成する場合、
この文字列を使用して「アイコン名」「ID」を指定する。

「ID」を指定する場合、「"#num"」(numはIDを表す整数)の形式で指定する。
DWORD dwStyle 重要
ウィンドウのスタイルを設定する「引数」。
複数指定可能。
複数指定をする場合は、
「|(パイプ)」で区切ることで、
複数指定が可能となる。
「定数 | 定数 | 定数 | 定数」
というように指定する。
ここには、用意されたたくさんの「定数」のいずれかを指定。
・境界線を持つウィンドウなら「WS_BORDER」
タイトルバーを持つウィンドウならWS_CAPTIONをここで指定する
int x ウィンドウの初期位置です。xはX軸、yはY軸を示す。
この初期位置は、デスクトップの左上を「0」としてピクセルで指定する
int y ウィンドウの初期位置です。xはX軸、yはY軸を示す。
この初期位置は、デスクトップの左上を「0」としてピクセルで指定する
int nWidth 「nWidth」は、「ウィンドウ幅」を「ピクセル単位」で指定する
int nHeight 「nHeight」は、「ウィンドウ高さ」を「ピクセル単位」で指定する
HWND hWndParent 親ウィンドウ、またはオーナーウィンドウとなるハンドルを指定。
親ウィンドウを持つ子ウィンドウの表示は、親ウィンドウのクライアントエリアに限定され
オーナーウィンドウを持つ場合、オーナーが破棄されるとそのウィンドウも破棄されます
ウィンドウの親子関係は、後ほど詳しく解説します
今はトップレベルのウィンドウだけなので NULL を指定してください
HMENU hMenu メニューのハンドルを渡す。
ない場合は、「NULL」を指定。
「HMENU型」は、「メニューのハンドル」。
HANDLE hInstance インスタンスハンドルを渡す
LPVOID lpParam ない場合は、「NULL」。
メッセージと呼ばれるものに渡されるパラメータを指定する。
「LPVOID型」は、「void *」に相当する「汎用ポインタ型」。



「CreateWindow」関数の「DWORD dwStyle」に指定する「定数」

定数解説
スタイル
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_ICONICWS_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_SIZEBOXWS_THICKFRAME スタイルと同じ。
WS_SYSMENU タイトルバー上にウィンドウメニューボックスを持つウィンドウを作成します
WS_CAPTION スタイルも指定する必要があります
WS_TABSTOP ユーザーが[Tab]キーを押すと
入力フォーカスを受け取るコントロールを指定。
[Tab]キーを押すと、WS_TABSTOP スタイルを持つ次のコントロールに
入力フォーカスが移動します
WS_THICKFRAME サイズ変更境界を持つウィンドウを作成します
WS_SIZEBOX スタイルと同じ。
WS_TILEDWS_OVERLAPPED スタイルと同じ。
WS_TILEDWINDOWWS_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_RIGHTBUTTONBS_LEFTTEXT スタイルと同じ。
BS_TEXTボタンがテキストを表示するよう指定します
BS_TOPボタンの最上部にテキストを置きます
BS_VCENTER ボタンの (垂直方向の) 中央にテキストを置きます
COMBOBOX専用スタイル
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専用スタイル
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専用スタイル
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専用スタイル
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専用スタイル
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_LOCALEDIT16 ビットのアプリケーションで使用します
DS_MODALFRAME モーダルダイアログボックスフレームを持つ
ダイアログボックスを作成。
DS_NOFAILCREATEエラーが発生してもダイアログボックスを作成。
DS_NOIDLEMSGダイアログボックスが表示されている間
WM_ENTERIDLE メッセージを抑制します
DS_RECURSE コントロールに似たダイアログボックスを作成。
DS_SETFONT ダイアログボックステンプレートが
フォント名とポイントサイズを持つことを示します
対応するフォントは、ダイアログボックスで
テキストを表示するために使われます
DS_SETFOREGROUND ダイアログボックスをフォアグラウンドにします
内部で Windows システムが
SetForegroundWindow 関数を呼び出します
このスタイルは、16 ビット版の Windows には適用できません
DS_SYSMODAL システムモーダルダイアログボックスを作成します
このスタイルを指定すると、ダイアログボックスが
最前面ウィンドウ (WS_EX_TOPMOST) になる
その他の点では、ダイアログボックス自身や
システム内の他のウィンドウの振る舞いに影響を与えません


Back


「CreateWindowEx」関数の「DWORD dwStyle」に指定する「定数」

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 ウィンドウが盛り上がった縁の境界線を持つことを指定。


Back

作成した「ウィンドウ」を見れるように可視化する方法


作成した「ウィンドウ」は、
見えるように「可視化」する必要がある。

作成された「ウィンドウ」は、
つまり、返された「ウィンドウハンドル」は、
「デフォルト」では、 「不可視」の状態となっている。

「ウィンドウ」は、
作成した段階では、画面に表示されない。
「ウィンドウ」の表示状態を変更するには、
「ShowWindow」関数を使用する。

表示状態を変更した後、
「ウィンドウ」を更新すると、
「ウィンドウ」が可視化される。

「ウィンドウ」の更新には、
「UpdateWindow」関数が使用される。



「ウィンドウ」を可視化して表示するサンプルコード
ShowWindow( hWnd, SW_SHOW ); UpdateWindow( hWnd );





「ShowWindow」関数の書式
BOOL ShowWindow( HWND hWnd , int nCmdShow );


「UpdateWindow」関数の書式
UpdateWindow( HWND hWnd );



「ShowWindow」関数の「引数」「返り値」
返り値 戻り値の BOOL 型 は、ブーリアンを格納するデータ型
0以外の「真」か、0の「偽」を格納します
ウィンドウが以前表示状態なら0以外、非表示だったのなら0を返します
hWnd対象となるウィンドウのハンドルを指定。
nCmdShow ウィンドウの表示状態を表す定数を指定。。SW_SHOW でウィンドウを表示します (下のリファレンス参照)
指定されたウィンドウの表示状態を設定します

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 ウィンドウをアクティブにして、表示します
ウィンドウが最小化または最大化されているときは、位置とサイズを元に戻します


Back

「メッセージループ」を設定する方法


・「メッセージループ」を回す
・「ウィンドウクラス」の登録を解除
「ウィンドウ」は、
「メッセージループ」を設定しないと、
「ウィンドウ」が表示された後すぐに消えてしまう。

「WinMain」関数の最後まで実行すると、
「プログラム」が終了してしまい、
「ウィンドウ」も閉じられる。


「ウィンドウ」を表示し続けるには、
「プログラム」を実行させ続ける必要がある。
そのために、「プログラム」を終わらせない
「メッセージループ」というものを記述する必要がある。


「メッセージループ」は、
繰り返し構文「while」を使用したシンプルなループで記述される。



「メッセージループ」に使用される関数は、

・「GetMessage」関数
・「TranslateMessage」関数
・「DispatchMessage」関数

の3つ。


「GetMessage」関数は、
「WindowsOS」の中にある
「メッセージキュー(Message Queue)」に貯められた
「ウィンドウメッセージ」を一つ取り出し、
構造体「MSG」に保存する。
「キュー(Queue)」は、「待ち行列」という意味。

「PC」では、ユーザーが操作した内容は、
「メッセージキュー(Message Queue)」に貯められ、
「GetMessage」関数によって1つずつ取り出すようになっている。
似ている動きをする関数には、
・「PeekMessage」関数
などがある。



「TranslateMessage」関数は、
「仮想キーメッセージ」を「文字メッセージに変換処理する関数。
「キーボード」の操作をすると、
「WM_KEYDOWN」「WM_KEYUP」などの
「仮想キーメッセージ」が「メッセージキュー」に保存される。
「TranslateMessage」関数は、
それらから、「大文字」「小文字」「記号」などを判別し、
「文字メッセージ」の「WM_CHAR」を作成する。

「仮想キーメッセージ」出ない場合は、
「TranslateMessage」関数は何もしない。


「DispatchMessage」関数は、
メッセージを「ウィンドウプロシージャ」に転送する。
「Dispatch」は、「発送する」「派遣する」という意味。


「メッセージループ」の記述方法
MSG msg;
BOOL bRet;

while( bRet = GetMessage( &msg, NULL, 0, 0 ) )
{
// 「bRet = GetMessage( &msg, NULL, 0, 0 )」は、メッセージを取得するコード

if( bRet == 0 || bRet == -1 )
{
// アプリケーションを終了させるメッセージ
// 「GetMessage()」が失敗したときのメッセージ「-1」
// のいずれかであった場合、
// ループを抜ける
break;
}
else
{
// 他のメッセージを受け取った場合の処理
TranslateMessage( &msg ); // メッセージの変換
DispatchMessage( &msg ); // メッセージの転送
}
}



「GetMessage」関数の書式

BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);



「GetMessage」関数の引数
引数説明
返り値 ・問題なくメッセージを受信 = 「1」
・プログラムの終了「WM_QUIT」を受信 = 「0」
・エラーが発生した時 = 「-1」
LPMSG lpMsg 構造体「MSG」の「メモリアドレス」を指定する。
HWND hWnd 「ウィンドウ」の「ハンドル」を指定する。
「NULL」を指定すると、プログラムで作成された、すべての「ウィンドウ」のメッセージがされる。
UINT wMsgFilterMin 最初のメッセージ
受診するメッセージの種類を制限したいときに「ウィンドウメッセージ」の定数を指定する。
「0」を指定すると、「制限」しないことになる。
UINT wMsgFilterMax 最後のメッセージ
受診するメッセージの種類を制限したいときに「ウィンドウメッセージ」の定数を指定する。
「0」を指定すると、「制限」しないことになる。



構造体「MSG」の定義
typedef struct {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;



構造体の要素説明
HWND hwndメッセージを受け取る「ウィンドウハンドル」
UINT messageウィンドウメッセ時の種類を示す「定数」
WPARAM wParam
LPARAM lParam
DWORD timeメッセージキューが保存された時間
POINT ptメッセージが記憶された時の「マウスポインタ」の座標
MSG, *PMSG構造体の名前。例は「MSG」「PMSGのポインタ」の2種類の名前


Back

「ウィンドウクラス」の登録を解除する方法


「Windowsアプリケーション」を終了するときには、
「ウィンドウクラス」の登録解除をする必要がある。
同時に、
終了時の操作方法の設定を行う必要がある。


「Windowsアプリケーション」を終了するときの設定は、

・「ウィンドウクラス」の登録解除
・「ウィンドウ」を閉じた時の「WM_DESTROY」メッセージを「WM_QUIT」メッセージに結びつける
の2つをする必要がある。
「ウィンドウクラス」の登録解除を忘れても、
プログラム終了時点で、すべて登録解除になる。



プログラムにとっては、

・「ウィンドウ」を閉じる
・「プログラム」を終了する

は、まったく別扱いになる。

「ウィンドウプロシージャ」に贈られてくるメッセージも、
違うものが贈られてくるので、
それぞれに対処コードを記述する必要がある。

「GetMessage」関数は、
「WM_QUIT」メッセージを受信すると、
プログラムが終了します。

「ウィンドウ」を閉じたときは、
「WM_DESTROY」を受信するが、
プログラムを終了しないので、
「WM_QUIT」を結びつける作業が必要。

「ウィンドウプロシージャ」で、
「WM_DESTROY」を認識した直後に、
「PostQuitMessage」関数を使用することで、
プログラムを終了させることができる。



「WinMain」関数の最後へ記述する「ウィンドウクラス」登録解除コード
UnregisterClass(_T("Default Class Name"), hWnd);
return msg.wParam;
「return msg.wParam;」と記述するのは、
「WinMain」関数の終了時に、
「メッセージループ」が始まる前の終了は、「0」
そうでない時は、「WM_QUIT」の「wParam」の値を返すことになっているため。


「ウィンドウプロシージャ」への条件追記
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
break;

default:
return DefWindowProc( hWnd, msg, wp, lp );
}


return 0;
}





「UnregisterClass」関数の書式
BOOL UnregisterClass(
LPCTSTR lpClassName,
HINSTANCE hInstance
);



引数説明
LPCTSTR lpClassNameクラス名
HINSTANCE hInstanceプログラムのインスタンスハンドル





終了操作とメッセージ定数の違い
WM_DESTROY「ウインドウ」を閉じる
WM_QUIT「プログラム」の終了命令


Back