VC++ トップページ

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_APPWORKSPACEMDIクライアントウインドウの背景色.よくある灰色.
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 );
lpwcWNDCLASSEXデータ構造体へのポインタ.
返り値登録されたクラスを表すアトム.失敗したら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 );
lpszClassNameRegisterClassEx()で登録したクラスの名前(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ウインドウとかを作成するモジュールのインスタンスのハンドル
lpvParamWM_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_HSCROLLhorizon scroll,つまり水平方向スクロール
WS_VSCROLLvertical 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_MDICHILDMDI子ウインドウ
WS_EX_NOPARENTNOTIFYWM_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が投げられたときなどに使います.
nExitCodeWM_QUITのwParamになる


ウインドウクラス解放
BOOL UnregisterClass( LPCTSTR lpszClass, HINSTANCE hinst );
RegisterClass(Ex)で登録したクラスを解放する関数です. このクラスを使ったウインドウを全て閉じてから使うこと.
lpszClassクラス名
hinstクラスを作成したモジュールのインスタンスハンドル
返り値破棄されればTRUE,失敗すればFALSE.


VC++ トップページ