ホームに戻る
 5、ウィンドウ

ウィンドウには大きく分けて3つある。

(1)オーバーラップウィンドウ
(2)ポップアップウィンドウ
(3)子ウィンドウ

(1)はタイトルバーを持ち、メインウィンドウなどで使われる。
(2)は必ずしもタイトルバーを持たない。
(3)はメニューバーを持つことができない。

ウィンドウ間には親子関係と所有関係がある。
親子関係は WS_CHILD と親ウィンドウを指定した場合。
子ウィンドウは親ウィンドウのクライアント領域を出ることができない。
所有関係は WS_CHILD を指定せず親ウィンドウを指定した場合。
こちらは所有するウィンドウの外に出ても描画される。
どちらも親ウィンドウを破棄した場合に自動的に破棄される。
以下は親子関係の動作。

親ウィンドウ:子ウィンドウ 
破棄される時:親ウィンドウが破棄される前に自動的に破棄される。 
非表示にされる時:親ウィンドウが非表示にされる前に非表示に。
移動される時:親ウィンドウと共に移動し、子ウィンドウは再描画される。
表示される時:親ウィンドウが表示された後に、親よりも手前に表示される。 

親子関係は SetParent を用いて変更することができる。

所有関係は常に所有されるウィンドウが所有するウィンドウの常に上にくる。
最小化する場合にも所有されるウィンドウが共に最小化される。
破棄する場合も所有するウィンドウが自動的に所有されるウィンドウを破棄する。

所有するウィンドウを NULL にして指定しなかった場合は所有関係が成立しない。
新たな別ウィンドウという扱いなので、
閉じる場合には DestroyWindow で明示的に破棄する必要がある。

ウィンドウは作成時とマウスクリックにより Z オーダーの最上位にくる。
アクティブなウィンドウとは Z オーダーが最上位のウィンドウのことである。
位置やサイズは MoveWindow で変更し、Z オーダーは SetWindowPos で変更する。

 ウィンドウスタイル。

HWND CreateWindow(
  LPCTSTR lpClassName,  // 登録されているクラス名
  LPCTSTR lpWindowName, // ウィンドウ名
  DWORD dwStyle,        // ウィンドウスタイル
  int x,                // ウィンドウの横方向の位置
  int y,                // ウィンドウの縦方向の位置
  int nWidth,           // ウィンドウの幅
  int nHeight,          // ウィンドウの高さ
  HWND hWndParent,      // 親ウィンドウまたは所有するウィンドウのハンドル
  HMENU hMenu,          // メニューハンドルまたは子ウィンドウ ID
  HINSTANCE hInstance,  // アプリケーションインスタンスのハンドル
  LPVOID lpParam        // ウィンドウ作成データ
);

dwStyle:ウィンドウスタイルを定義。
hWndParent:子ウィンドウでは親ウィンドウを必ず定義。ポップアップでは無視される。
hMenu:子ウィンドウではコントロールIDを登録できる。

WS_BORDER:境界を持つウィンドウを作成します。 
WS_CAPTION:タイトルバーを持つ。WS_BORDER を含む。WS_DLGFRAME とは使えない。
WS_CHILD:子ウィンドウを作成します。WS_POPUP とは使えない。
WS_CHILDWINDOW:WS_CHILD と同じ。
WS_DISABLED:初期状態で使用禁止のウィンドウを作成します。 
WS_DLGFRAME:二重境界を持ち、タイトルを持たないウィンドウを作成。 
WS_CLIPCHILDREN:親ウィンドウ内部の子ウィンドウを描画しません。
WS_CLIPSIBLINGS:同じ親を持つ子ウィンドウ同士でクリップを行う。
WS_HSCROLL:水平スクロールバーを持つウィンドウを作成。 
WS_MAXIMIZE:最大表示されたウィンドウを作成。 
WS_MAXIMIZEBOX:最大表示ボタンを持つウィンドウを作成。 
WS_MINIMIZE:初期状態でアイコン化されたウィンドウを作成。WS_OVERLAPPED を指定すること。
WS_MINIMIZEBOX:アイコン化ボタンを持つウィンドウを作成。 
WS_OVERLAPPED:オーバラップ ウィンドウを作成。オーバラップ ウィンドウは、通常キャプションと境界を持ちます。 
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_SYSMENU:メニューボックスを使用。メニューを使用する場合は、WS_CAPTION をつける。
WS_THICKFRAME:ウィンドウのサイズ変更に使うことができる、太い枠を持つウィンドウを作成。 
WS_VISIBLE:初期状態で可視のウィンドウを作成します。 
WS_VSCROLL:垂直スクロール バーを持つウィンドウを作成します。

 ShowWindow

BOOL ShowWindow(
  HWND hWnd,     // ウィンドウハンドル
  int nCmdShow   // 表示状態
);

SW_HIDE:ウィンドウを非表示にして、他のウィンドウをアクティブにする。
SW_SHOWNORMAL:最小化または最大化を解除し、アクティブにする。
SW_SHOWMINIMIZED:アクティブにして、最小化されたウィンドウとして表示。
SW_SHOWMAXIMIZED, SW_MAXIMIZE:アクティブにして、最大化されたウィンドウとして表示。
SW_SHOWNOACTIVATE:ウィンドウをアクティブにはせずに表示します。
SW_SHOW:ウィンドウをアクティブにして、現在の位置とサイズで表示します。
SW_MINIMIZE:最小化して、次の Z オーダーにあるトップレベルウィンドウをアクティブにする。
SW_SHOWMINNOACTIVE:ウィンドウを最小化されたウィンドウとして表示。ウィンドウはアクティブ化されない。
SW_SHOWNA:ウィンドウを現在の位置とサイズで表示。ウィンドウはアクティブ化されない。
SW_RESTORE:アクティブにし、最小化または最大化を元に戻す。
SW_SHOWDEFAULT:状態を起動時のディフォルトに戻す。

 MoveWindow

BOOL MoveWindow(
  HWND hWnd,
  int x,
  int y,
  int nWidth,
  int nHeight,
  BOOL bRepaint
);

bRepaint:TRUE で WM_PAINT メッセージを送る。
失敗すると 0 を返す。

 SetWindowPos

BOOL SetWindowPos(
  HWND hWnd,
  HWND hWndInsertAfter,
  int x,
  int y,
  int nWidth,
  int nHeight,
  UINT uFlags
);

hWndInsertAfter:1つ上の Z オーダーのウィンドウを指定。

HWND_BOTTOM:Z オーダーの最下位に配置。
HWND_NOTOPMOST:最上位ウィンドウとして配置。
HWND_TOP:Z オーダーの最上位に配置。
HWND_TOPMOST:最下位ウィンドウとして配置。

uFlags:

SWP_HIDEWINDOW:ウィンドウを非表示に。
SWP_NOACTIVATE:ウィンドウをアクティブ化しない。
SWP_NOMOVE:現在の位置を維持。
SWP_NOOWNERZORDER:オーナーウィンドウの Z 順位を変えない。
SWP_NOREDRAW:変更結果を再描画しない。
SWP_NOREPOSITION:SWP_NOOWNERZORDER と同じ。
SWP_NOSENDCHANGING:ウィンドウに WM_WINDOWPOSCHANGING メッセージを送らない。
SWP_NOSIZE:現在のサイズを維持。
SWP_NOZORDER:現在の Z 順位を維持。
SWP_SHOWWINDOW:ウィンドウを表示。

inserted by FC2 system