Section1.3 ウインドウを作る 細かい事
WNDCLASSEX 構造体でウインドウクラスのパラメタを指定してRegisterClassEx()で
そのウインドウクラスを登録,
CreateWindow()で登録したクラスを元にウインドウを作って
ShowWindow()で表示する.というのが一連の流れ.
終わるときはDestroyWindow()やPostQuitMessage()やUnregisterClass()などを使ったりします.
WNDCLASSEX 構造体
.cbSize | : |
UINT |
構造体のサイズ.sizeof(WNDCLASSEX). |
.style | : |
UINT |
ウインドウスタイル. 使うのは CS_HREDRAW | CS_VREDRAW ぐらい. |
.lpfnWndProc | : |
WNDPROC |
そのウインドウのメッセージを処理するコールバック関数へのポインタ |
.cbClsExtra | : |
int |
ウインドウクラス構造体の後ろに割り当てる補足バイト数.普通0. |
.cbWndExtra | : |
int |
ウインドウインスタンスの後ろに割り当てる補足バイト数.普通0. |
.hInstance | : |
HINSTANCE |
このクラスのためのウインドウプロシージャがあるインスタンスハンドル. |
.hIcon | : |
HICON |
アイコンのハンドル |
.hCursor | : |
HCURSOR |
マウスカーソルのハンドル.LoadCursor( NULL, IDC_ARROW )とか. |
.hbrBackground | : |
HBRUSH |
ウインドウ背景色(背景描画用ブラシのハンドル). |
.lpszMenuName | : |
LPCTSTR |
デフォルトメニュー名(MAKEINTRESOURCE(メニューID)) |
.lpszClassName | : |
LPCTSTR |
このウインドウクラスにつける名前 |
.hIconSm | : |
HICON |
16×16の小さいサイズのアイコン |
|
.style ウインドウクラススタイル
CS_HREDRAW | : | 横サイズが変わったとき,ウインドウ全体を再描画する |
CS_VREDRAW | : | 縦サイズが変わったとき,ウインドウ全体を再描画する |
CS_DBLCLKS | : | ダブルクリックが発生したことをウインドウに通知する |
CS_NOCLOSE | : | システムメニューの[閉じる]コマンドを使用不可にする |
CS_CLASSDC | : | このクラスのウインドウ同士で1つのデバイスコンテキストを共有する |
CS_OWNDC | : | ウインドウ毎にデバイスコンテキストを1つづつ持つ |
CS_PARENTDC | : | 親ウインドウのデバイスコンテキストを使用する |
CS_GLOBALCLASS | : | このクラスを作成したアプリケーションが実行されていれば,
他のアプリケーションからでもこのクラスを利用できるようになる.
一般的にDLLでカスタムコントロールを作成するときに使うらしい. |
|
.hbrBackground 背景色
システムカラーを使う場合とか,GetStockObject()を使う場合とか,
自分で作ったブラシも使えるかもしれません(あまりよくない気がする).
(HBRUSH)( *** +1) | : | システムカラー |
COLOR_APPWORKSPACE | : | MDIクライアントウインドウの背景色.よくある灰色. |
COLOR_BACKGROUND | : | デスクトップ背景色 |
COLOR_BTNFACE | : | ボタンとかの色 |
COLOR_BTNHILIGHT | : | ボタンとかの縁の明るい所の色 |
COLOR_BTNSHADOW | : | ボタンとかの縁の暗い所の色 |
COLOR_ACTIVECAPTION | : | アクティブウインドウの上のバーの色 |
COLOR_INACTIVECAPTION | : | 非アクティブウインドウの上のバーの色 |
(HBRUSH)GetStockObject( *** ) | : | 定義済みブラシ |
BLACK_BRUSH | : | 黒 |
DKGRAY_BRUSH | : | 暗い灰色 |
GRAY_BRUSH | : | 灰色 |
LTGRAY_BRUSH | : | 明るい灰色 |
WHITE_BRUSH | : | 白 |
NULL_BRUSH | : | 塗りつぶさない(けして透明にあらず) |
|
自分で作ったブラシを使うときは,
HBRUSH hmyb; //グローバルあたりで宣言
…
hmyb = CreateSolidBrush( RGB( int r, int g, int b ) ); //ブラシを作って
***.hbrBackground = hmyb; //代入
…
DeleteObject(hmyb); //忘れずにアプリケーション終了前にブラシを開放
ブラシについてはSection2.4でちょっとやってます.
ウインドウクラス登録
ATOM RegisterClassEx( CONST WNDCLASS *lpwc );
lpwc | : | WNDCLASSEXデータ構造体へのポインタ. |
返り値 | : | 登録されたクラスを表すアトム.失敗したら0. |
|
.hIconSmだけがないWNDCLASS構造体もある.
WNDCLASS構造体は ATOM RegisterClass( CONST WNDCLASS *lpwc )を使って登録する.
ウインドウ作成
HWND CreateWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu,
HANDLE hinst, LPVOID lpvParam );
lpszClassName | : | RegisterClassEx()で登録したクラスの名前(WNDCLASS.lpszClassName)か,定義済みのクラス. |
lpszWindowName | : | タイトルバーとかに表示する文字列 |
dwStyle | : | ウインドウスタイル.いろいろありすぎ. |
x | : | ウインドウ左上x座標(画面左上が0).適当でいい時はCW_USEDEFAULT |
y | : | ウインドウ左上y座標(画面左上が0).適当でいい時はCW_USEDEFAULT |
nWidth | : | ウインドウ幅.適当でいい時はCW_USEDEFAULT |
nHeight | : | ウインドウ高さ.適当でいい時はCW_USEDEFAULT |
hwndParent | : | 親ウインドウのハンドル.なければNULL.dwStyleでDW_CHILDを指定したときは必須. |
hmenu | : | メニューのハンドル.デフォルト(WNDCLASS.lpszMenuName)を使う場合はNULL. |
hinst | : | ウインドウとかを作成するモジュールのインスタンスのハンドル |
lpvParam | : | WM_CREATEでLPARAMに渡したい値.だいたいNULL. |
返り値 | : | 作成されたウインドウのハンドル.失敗したらNULL. |
|
よく使うウインドウスタイル
ただのメインウインドウ | : | WS_OVERLAPPEDWINDOW |
メインウインドウ(親) | : | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN |
子ウインドウ(ウインドウ枠etcつき) | : | WS_CHILD | WS_THICKFRAME | WS_SYSMENU | WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX |
スクロールバー(上と組み合わせて) | : | | WS_HSCROLL | WS_VSCROLL |
|
ウインドウスタイル
WS_OVERLAPPED | : | タイトルバー,境界線つきオーバーラップウインドウ |
WS_OVERLAPPEDWINDOW | = | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIMZEBOX |
WS_CHILD | : | 子ウインドウ.WS_POPUPとは併用できない |
WS_POPUP | : | ポップアップウインドウ.WS_CHILDとは併用できない |
WS_POPUPWINDOW | = | WS_BORDER | WS_POPUP | WS_SYSMENU |
WS_CLIPCHILDREN | : | 親の描画で子ウインドウの部分をクリッピング |
WS_CLIPSIBLINGS | : | 子の描画で兄弟ウインドウの部分をクリッピング |
WS_CAPTION | : | タイトルバー(WS_DLGFRAMEも一緒についてくる) |
WS_SYSMENU | : | タイトルバーにシステムメニュー(閉じるボタンとアイコン)つける |
WS_MINIMIZEBOX | : | システムメニューに最小化ボタン加える |
WS_MAXIMIZEBOX | : | システムメニューに最大化ボタン加える |
WS_BORDER | : | 細い境界線 |
WS_DLGFRAME | : | サイズ変更できない境界線 |
WS_THICKFRAME | : | サイズ変更できる境界線 |
WS_HSCROLL | : | horizon scroll,つまり水平方向スクロール |
WS_VSCROLL | : | vertical scroll,つまり垂直方向スクロール |
WS_VISIBLE | : | 初期状態で表示される |
WS_DISABLED | : | 初期状態が使用不可 |
WS_MAXIMIZE | : | 初期状態で最大化 |
WS_MINIMIZE | : | 初期状態で最小化 |
WS_TABSTOP | : | ダイアログのコントロールにつかう.Tabでフォーカスを当てられるようにする. |
WS_GROUP | : | 主にダイアログのラジオボタンのグループ設定に使う |
|
ウインドウ作成その2
HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu,
HANDLE hinst, LPVOID lpvParam );
拡張スタイル,dwExStyle(下表)が増えただけで他はCreateWindow()と同じ.
拡張スタイルを使いたい時に使う.
拡張ウインドウスタイル
WS_EX_ABSPOTION | : | ウインドウが絶対位置を持つ |
WS_EX_ACCEPTFILES | : | ドラッグアンドドロップでファイルを受け付ける |
WS_EX_CLIENTEDGE | : | へこんだ縁の境界線 |
WS_EX_CONTEXTHELP | : | タイトルバーに疑問符(ヘルプ)ボタンがつく(最小化,最大化ボタンがない時) |
WS_EX_LEFTSCROLLBAR | : | 垂直スクロールバーがあれば左に持ってくる |
WS_EX_MDICHILD | : | MDI子ウインドウ |
WS_EX_NOPARENTNOTIFY | : | WM_PARENTNOTIFYメッセージをオフにする |
WS_EX_TOOLWINDOW | : | ツールウインドウ(小さいタイトルバー) |
WS_EX_TOPMOST | : | どのウインドウよりも手前に表示 |
WS_EX_TRANSPARENT | : | 透明ウインドウ |
|
ウインドウの表示状態の設定
BOOL ShowWindow( HWND hwnd, int nCmdShow );
hwnd | : | ウインドウのハンドル |
nCmdShow | : | 表示方法.SW_SHOWなど.下表参照 |
返り値 | : | それまで可視状態だったらTRUE,そうでなければFALSE |
|
nCmdShow 表示方法
SW_HIDE | : | 表示しない |
SW_SHOW | : | 現在の位置とサイズで表示 |
SW_SHOWDEFAULT | : | アプリケーション起動時にSTARTUPINFO構造体のSW_フラグに基づいて表示 |
SW_SHOWNORMAL | : | 通常サイズで表示 |
SW_SHOWMAXIMIZED | : | 最大化 |
SW_SHOWMINIMIZED | : | 最小化 |
SW_MINIMIZE | : | 最小化して他のウインドウをアクティブにする |
SW_SHOWMINNOACTIVE | : | アクティブウインドウを変えずに最小化 |
SW_RESTORE | : | 最小化,最大化を元に戻してアクティブにする |
SW_SHOWNA | : | アクティブウインドウを変えずに,現在の状態で表示 |
SW_SHOWNOACTIVATE | : | アクティブウインドウを変えずに,直前のサイズと位置で表示 |
|
ウインドウを閉じる
BOOL DestroyWindow( HWND hWnd );
CreateWindow(Ex)やCreateDialogと対になる関数です.
この関数はウインドウを破棄する前にWM_DESTROYメッセージを投げます.
lpwc | : | ウインドウのハンドル. |
返り値 | : | 破棄されればTRUE,失敗すればFALSE. |
|
アプリケーション終了
VOID PostQuitMessage(int nExitCode );
WM_QUITメッセージがキューの最後に入れられ,普通に処理をしていればメッセージループを抜けます.
そのアプリケーションのメインウインドウにWM_DESTROYが投げられたときなどに使います.
nExitCode | : | WM_QUITのwParamになる |
|
ウインドウクラス解放
BOOL UnregisterClass( LPCTSTR lpszClass, HINSTANCE hinst );
RegisterClass(Ex)で登録したクラスを解放する関数です.
このクラスを使ったウインドウを全て閉じてから使うこと.
lpszClass | : | クラス名 |
hinst | : | クラスを作成したモジュールのインスタンスハンドル |
返り値 | : | 破棄されればTRUE,失敗すればFALSE. |
|
|