表示関連 1. ウインドウの表示 / 非表示 2. ウインドウの有効化 / 無効化 3. ウインドウの最大化 / 最小化 / 元に戻す 4. ウインドウの最小化 / 元に戻す処理 5. ウインドウの最大化 / 最小化の状態 6. ウインドウの最大化 / 最小化 / 通常の状態
ウインドウの表示 / 非表示 ウインドウの表示と非表示は ShowWindow() 関数で行います この関数の第一引数に対象のウイ ンドウ ハンドルを指定して 第二引数に SW_SHOW で表示 SW_HIDE で非表示になります また 第一引数にダイアログ ハンドルを指定するとダイアログを表示 非表示にできます BOOL ShowWindow( HWND hwnd, // ウインドウ ハンドル int ncmdshow // 表示状態 それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 表示 ShowWindow( hwnd, SW_SHOW // 非表示 ShowWindow( hwnd, SW_HIDE ウインドウの表示と非表示の状態を調べるには IsWindowVisible() 関数を使います この関数の第 一引数に対象のウインドウ ハンドルを指定するだけで状態を調べられます 戻り値は BOOL 型 ですから 0(FALSE) なら非表示 1(TRUE) なら表示されてることを意味します BOOL IsWindowVisible( HWND hwnd // ウインドウ ハンドル こちらも使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します 調べた結 果は if 文などで表示状態に合わせた処理を記述します if ( IsWindowVisible(hWnd) ){ // ウインドウが表示されてる else{ // ウインドウは非表示である ShowWindow() 関数で表示 非表示の設定を行います IsWindowVisible() 関数で表示 非表示の状態を調査できます
ウインドウの有効化 / 無効化 ウインドウの有効化と無効化は EnableWindow() 関数で行います この関数の第一引数に対象のウ インドウ ハンドルを指定して 第二引数に TRUE で有効化 FALSE で無効化になります また 第一引数にダイアログ ハンドルを指定するとダイアログを有効化 無効化にできます BOOL EnableWindow( HWND hwnd, // ウインドウ ハンドル BOOL benable // 有効化 無効化のスイッチ それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 有効化 EnableWindow( hwnd, TRUE // 無効化 EnableWindow( hwnd, FALSE ウインドウの有効化と無効化の状態を調べるには IsWindowEnabled() 関数を使います この関数 の第一引数に対象のウインドウ ハンドルを指定するだけで状態を調べられます 戻り値は BOOL 型ですから 0(FALSE) なら無効化 1(TRUE) なら有効化してることを意味します BOOL IsWindowEnabled( HWND hwnd // ウインドウ ハンドル こちらも使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します 調べた結 果は if 文などで有効状態に合わせた処理を記述します if ( IsWindowEnabled(hWnd) ){ // ウインドウが有効化されてる else{ // ウインドウは無効化である EnableWindow() 関数で有効化 無効化の設定を行います IsWindowEnabled() 関数で有効化 無効化の状態を調査できます
ウインドウの最大化 / 最小化 / 元に戻す ウインドウの最大化 最小化 元に戻す操作をプログラミングで行うには ShowWindow() 関数を使います この関数の第一引数に対象のウインドウ ハンドルを指定して 第二引数に SW_MAXIMIZE で最大化 SW_MINIMIZE で最小化 SW_RESTORE で元に戻す処理を行います 以前にウインドウの表示 非表示で紹介した API 関数と同じです ただし 第二引数に渡す定数を変えることで違う動作になるわけです 面白いですね BOOL ShowWindow( HWND hwnd, // ウインドウ ハンドル int ncmdshow // 表示状態 それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 最大化 ShowWindow( hwnd, SW_MAXIMIZE // 最小化 ShowWindow( hwnd, SW_MINIMIZE // 元に戻す ShowWindow( hwnd, SW_RESTORE ShowWindow(hWnd,SW_MAXIMIZE) で最大化できます ShowWindow(hWnd,SW_MINIMIZE) で最小化できます ShowWindow(hWnd,SW_RESTORE) で元に戻す操作が行えます
ウインドウの最小化 / 元に戻す処理 ウインドウの最小化と元に戻す操作をプログラミングで行うには ShowWindow() 関数以外にも用意されてます それが CloseWindow() 関数と OpenIcon() 関数です この関数の第一引数に対象のウインドウ ハンドルを指定するだけで操作できます つまり CloseWindow() 関数で最小化 OpenIcon() 関数で元に戻す操作を行えます 名前からすると CloseWindow() 関数はウインドウをクローズ ( 破棄 ) するように想像しがちですが違います ウインドウを破棄する API は DestroyWindow() 関数ですから混同しないように気を付けましょう あと最小化のことをアイコン化されてると表現する場合があります このことから OpenIcon() 関数はタスクバーにあるタスク アイコンをオープンすると覚えれば良いでしょう 関数名の名づけ方に統一性がなくて非常に面白いですね マイクロソフト社は BOOL CloseWindow( HWND hwnd // ウインドウ ハンドル BOOL OpenIcon( HWND hwnd // ウインドウ ハンドル それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 最小化 CloseWindow( hwnd // 元に戻す OpenIcon( hwnd CloseWindow() 関数で最小化を行います OpenIcon() 関数で元に戻す操作を行えます その他 OpenIcon() 関数はウインドウに WM_QUERYOPEN メッセージを送信します このメッセージを処理すればウインドウが最小化から復帰 ( 元に戻るとき ) を操作できます 例えば WM_QUERYOPEN メッセージ内で CloseWindow() 関数を呼び出すとずっと最小化されたままにできます
ウインドウの最大化 / 最小化の状態 ウインドウの最大化と最小化の状態を調べるには次の 2 つの API 関数で行います IsZoomed() 関 数は最大化状態 IsIconic() 関数は最小化状態を調べる事ができます この 2 つの API 関数を使う ことで最大化と最小化でない状態 ( 普通の状態 ) も判定できます BOOL IsZoomed( HWND hwnd // ウィンドウのハンドル BOOL IsIconic( HWND hwnd // ウィンドウのハンドル それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します if ( IsZoomed(hWnd) ){ // 最大化の状態 else if ( IsIconic(hWnd) ){ // 最小化の状態 else{ // 普通の状態 IsZoomed() 関数で最大化状態を調べます IsIconic() 関数で最小化状態を調べます
ウインドウの最大化 / 最小化 / 通常の状態 ウインドウの最大化 最小化 通常の状態を調べる方法として GetWindowPlacement() 関数を使 うこともできます この関数なら IsZoomed() 関数 IsIconic() 関数の 2 つの API 関数を呼び出さな くても良いでしょう どの方法でも希望通りに最大化 最小化 普通の状態を判定できます BOOL GetWindowPlacement( WINDOWPLACEMENT *lpinfo // 位置情報の構造体 次は構造体を紹介します typedef struct tagwindowplacement { UINT length; // 構造体のサイズ ( 必ずセットすること ) UINT flags; // 制御フラグ UINT showcmd; // ウインドウの表示状態 POINT ptminposition; // 最小化されるときのウインドウ左上隅位置 POINT ptmaxposition; // 最大化されるときのウインドウ左上隅位置 RECT rcnormalposition; // 通常ウインドウの矩形領域 WINDOWPLACEMENT; それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します WINDOWPLACEMENT info; info.length = sizoef(windowplacement GetWindowPlacement( hwnd, &info switch ( info.showcmd ){ case SW_SHOWNORMAL: // 普通の状態 break; case SW_SHOWMINIMIZED: // 最小化の状態 break; case SW_SHOWMAXIMIZED: // 最大化の状態 break; default: // エラーの処理 GetWindowPlacement() 関数で showcmd メンバを調べます showcmd メンバが SW_SHOWNORMAL 定数なら普通の状態となります showcmd メンバが SW_SHOWMINIMIZED 定数なら最小化の状態となります showcmd メンバが SW_SHOWMAXIMIZED 定数なら最大化の状態となります
位置とサイズ関連 1. ウインドウの位置を取得 / 設定 2. ウインドウのサイズを取得 / 設定 3. ウインドウの通常サイズを取得 / 設定 4. ウインドウの最小化位置を取得 / 設定 5. ウインドウの最大化位置を取得 / 設定
ウインドウの位置を取得 / 設定 ウインドウの位置を取得するには GetWindowRect() 関数で行います この関数の第一引数に対象 のウインドウ ハンドルを指定して 第二引数に長方形情報の構造体へのポインタを指定します これでウインドウの矩形領域を RECT 構造体に取得します BOOL GetWindowRect( LPRECT lprect // ウィンドウの座標値 次は構造体を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; ウインドウの位置を設定するには SetWindowPos() 関数で行います BOOL SetWindowPos( HWND hwndinsertafter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uflags // ウィンドウ位置のオプション それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウ位置の取得 RECT rc; LONG cx; LONG cy; GetWindowRect( hwnd, &rc cx = (rc.left cy = (rc.top // ウインドウ位置の設定 cx = 600; cy = 200; SetWindowPos( hwnd, NULL, cx, cy, 0, 0, (SWP_NOZORDER SWP_NOOWNERZORDER SWP_NOSIZE) GetWindowRect() 関数でウインドウ位置を取得します SetWindowPos() 関数でウインドウ位置を設定します
ウインドウのサイズを取得 / 設定 ウインドウのサイズを取得するには GetWindowRect() 関数で行います この関数の第一引数に対 象のウインドウ ハンドルを指定して 第二引数に長方形情報の構造体へのポインタを指定し ます これでウインドウの矩形領域を RECT 構造体に取得します BOOL GetWindowRect( LPRECT lprect // ウィンドウの座標値 次は構造体を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; ウインドウのサイズを設定するには SetWindowPos() 関数で行います BOOL SetWindowPos( HWND hwndinsertafter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uflags // ウィンドウ位置のオプション それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウ サイズの取得 RECT rc; LONG sx; LONG sy; GetWindowRect( hwnd, &rc sx = (rc.right - rc.left sy = (rc.bottom - rc.top // ウインドウ サイズの設定 sx = 640; sy = 320; SetWindowPos( hwnd, NULL, 0, 0, sx, sy, (SWP_NOZORDER SWP_NOOWNERZORDER SWP_NOMOVE) GetWindowRect() 関数でウインドウ サイズを取得します SetWindowPos() 関数でウインドウ サイズを設定します
ウインドウの通常サイズを取得 / 設定 ウインドウが最小化状態や最大化状態でも正しくウインドウ サイズを取得 / 設定するには次の2 つの関数を利用します GetWindowPlacement() 関数で位置情報を取得 SetWindowPlacement() 関数で位置情報を設定します この関数の第一引数に対象のウインドウ ハンドルを指定して 第二引数に WINDOWPLACEMENT 構造体へのポインタを指定します これでウインドウの位置情報を WINDOWPLACEMENT 構造体を使って取得 / 設定できます BOOL GetWindowPlacement( WINDOWPLACEMENT *lpinfo // 位置情報の構造体 BOOL SetWindowPlacement( CONST WINDOWPLACEMENT *lpinfo // 位置情報の構造体 次は構造体を紹介します typedef struct tagwindowplacement { UINT length; // 構造体のサイズ ( 必ずセットすること ) UINT flags; // 制御フラグ UINT showcmd; // ウインドウの表示状態 POINT ptminposition; // 最小化されるときのウインドウ左上隅位置 POINT ptmaxposition; // 最大化されるときのウインドウ左上隅位置 RECT rcnormalposition; // 通常ウインドウの矩形領域 WINDOWPLACEMENT; それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウ サイズの取得 WINDOWPLACEMENT info; LONG sx; LONG sy; info.length = sizoef(windowplacement GetWindowPlacement( hwnd, &info sx = (info.rcnormalposition.right - info.rcnormalposition.left sy = (info.rcnormalposition.bottom - info.rcnormalposition.top // ウインドウ サイズの設定 sx = 640; sy = 320; info.length = sizoef(windowplacement info.rcnormalposition.right = (info.rcnormalposition.left + sx info.rcnormalposition.bottom = (info.rcnormalposition.top + sy SetWindowPlacement( hwnd, &info GetWindowPlacement() 関数でウインドウの通常サイズを取得します SetWindowPlacement() 関数でウインドウの通常サイズを設定します
ウインドウの最小化位置を取得 / 設定 ウインドウが最小化されるときのウインドウ左上隅位置を取得 / 設定するには次の2つの関数を利用します GetWindowPlacement() 関数で位置情報を取得 SetWindowPlacement() 関数で位置情報を設定します この関数の第一引数に対象のウインドウ ハンドルを指定して 第二引数に WINDOWPLACEMENT 構造体へのポインタを指定します これでウインドウの位置情報を WINDOWPLACEMENT 構造体を使って取得 / 設定できます BOOL GetWindowPlacement( WINDOWPLACEMENT *lpinfo // 位置情報の構造体 BOOL SetWindowPlacement( CONST WINDOWPLACEMENT *lpinfo // 位置情報の構造体 次は構造体を紹介します typedef struct tagwindowplacement { UINT length; // 構造体のサイズ ( 必ずセットすること ) UINT flags; // 制御フラグ UINT showcmd; // ウインドウの表示状態 POINT ptminposition; // 最小化されるときのウインドウ左上隅位置 POINT ptmaxposition; // 最大化されるときのウインドウ左上隅位置 RECT rcnormalposition; // 通常ウインドウの矩形領域 WINDOWPLACEMENT; それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウの最小化位置を取得 WINDOWPLACEMENT info; LONG cx; LONG cy; info.length = sizoef(windowplacement GetWindowPlacement( hwnd, &info cx = (info.ptminposition.x cy = (info.ptminposition.y // ウインドウの最小化位置を設定 cx = 600; cy = 200; info.length = sizoef(windowplacement info.ptminposition.x = cx; info.ptminposition.y = cy; SetWindowPlacement( hwnd, &info GetWindowPlacement() 関数でウインドウの最小化位置を取得します SetWindowPlacement() 関数でウインドウの最小化位置を設定します
ウインドウの最大化位置を取得 / 設定 ウインドウが最大化されるときのウインドウ左上隅位置を取得 / 設定するには次の2つの関数を利用します GetWindowPlacement() 関数で位置情報を取得 SetWindowPlacement() 関数で位置情報を設定します この関数の第一引数に対象のウインドウ ハンドルを指定して 第二引数に WINDOWPLACEMENT 構造体へのポインタを指定します これでウインドウの位置情報を WINDOWPLACEMENT 構造体を使って取得 / 設定できます BOOL GetWindowPlacement( WINDOWPLACEMENT *lpinfo // 位置情報の構造体 BOOL SetWindowPlacement( CONST WINDOWPLACEMENT *lpinfo // 位置情報の構造体 次は構造体を紹介します typedef struct tagwindowplacement { UINT length; // 構造体のサイズ ( 必ずセットすること ) UINT flags; // 制御フラグ UINT showcmd; // ウインドウの表示状態 POINT ptminposition; // 最大化されるときのウインドウ左上隅位置 POINT ptmaxposition; // 最大化されるときのウインドウ左上隅位置 RECT rcnormalposition; // 通常ウインドウの矩形領域 WINDOWPLACEMENT; それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウの最大化位置を取得 WINDOWPLACEMENT info; LONG cx; LONG cy; info.length = sizoef(windowplacement GetWindowPlacement( hwnd, &info cx = (info.ptmaxposition.x cy = (info.ptmaxposition.y // ウインドウの最大化位置を設定 cx = 600; cy = 200; info.length = sizoef(windowplacement info.ptmaxposition.x = cx; info.ptmaxposition.y = cy; SetWindowPlacement( hwnd, &info GetWindowPlacement() 関数でウインドウの最大化位置を取得します SetWindowPlacement() 関数でウインドウの最大化位置を設定します
スタイル関連 1. ウインドウ スタイルの動的変更 2. 拡張ウインドウ スタイルの動的変更 3. ウインドウの最前面表示を設定 / 解除 4. ウインドウのタスクボタンを表示 / 非表示 5. ウインドウのタイトルバーを表示 / 非表示
ウインドウ スタイルの動的変更 ウインドウ スタイルを動的に変更するには次の手順で行います 1. ウインドウ スタイルの取得 (GetWindowLong) 2. スタイル データのビットを動的に変更 (AND,OR) 3. ウインドウ スタイルの設定 (SetWindowLong) 4. ウインドウ スタイルの反映 (SetWindowPos) LONG GetWindowLong( int nindex // 取得するデータ値のインデックス LONG SetWindowLong( int nindex, // 設定するデータ値のインデックス LONG dwnewlong // 新しい値 BOOL SetWindowPos( HWND hwndinsertafter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uflags // ウィンドウ位置のオプション それでは変更例を簡単に紹介します hwnd にウインドウのハンドルを指定します // WS_THICKFRAME 属性の設定 LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_STYLE lstyle = WS_THICKFRAME; lstyle = SetWindowLong( hwnd, GWL_STYLE, lstyle SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_FRAMECHANGED) // WS_THICKFRAME 属性の解除 LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_STYLE lstyle &= ~WS_THICKFRAME; lstyle = SetWindowLong( hwnd, GWL_STYLE, lstyle SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_FRAMECHANGED) 上記のサンプルでは WS_THICKFRAME 属性を設定したり解除してます なお SetWindowLong() 関数でウインドウ スタイルを設定しただけでは反映しません 反映させるには必ず SetWindowPos() 関数で SWP_FRAMECHANGED オプションを実行します
拡張ウインドウ スタイルの動的変更 拡張ウインドウ スタイルを動的に変更するには次の手順で行います 1. 拡張ウインドウ スタイルの取得 (GetWindowLong) 2. 拡張スタイル データのビットを動的に変更 (AND,OR) 3. 拡張ウインドウ スタイルの設定 (SetWindowLong) 4. 拡張ウインドウ スタイルの反映 (SetWindowPos) LONG GetWindowLong( int nindex // 取得するデータ値のインデックス LONG SetWindowLong( int nindex, // 設定するデータ値のインデックス LONG dwnewlong // 新しい値 BOOL SetWindowPos( HWND hwndinsertafter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uflags // ウィンドウ位置のオプション それでは変更例を簡単に紹介します hwnd にウインドウのハンドルを指定します // WS_EX_TOOLWINDOW 属性の設定 LONG lexstyle; lexstyle = GetWindowLong( hwnd, GWL_EXSTYLE lexstyle = WS_EX_TOOLWINDOW; lexstyle = SetWindowLong( hwnd, GWL_EXSTYLE, lexstyle SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_FRAMECHANGED) // WS_EX_TOOLWINDOW 属性の解除 LONG lexstyle; lexstyle = GetWindowLong( hwnd, GWL_EXSTYLE lexstyle &= ~WS_EX_TOOLWINDOW; lexstyle = SetWindowLong( hwnd, GWL_EXSTYLE, lexstyle SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_FRAMECHANGED) 上記のサンプルでは WS_EX_TOOLWINDOW 属性を設定したり解除してます なお SetWindowLong() 関数でウインドウ スタイルを設定しただけでは反映しません 反映させるには必ず SetWindowPos() 関数で SWP_FRAMECHANGED オプションを実行します
ウインドウの最前面表示を設定 / 解除 指定ウインドウを最前面表示に設定したり 解除するには SetWindowPos() 関数を使います この API 関数はオプションが多く初心者には使いにくいかも知れません しかし お決まりパターンがありますから一度知ってしまえば簡単です また 最前面表示とは常に前面にウインドウが表示される状態のことです つまり 普通はアクティブ ウインドウのみが前面に表示されますが これよりも優先されて前面に表示させる状態を最前面表示と呼びます 応用としては小さい時計ソフトを常に表示させたい場合には 時計ソフトの起動時に最前面表示の設定を行えば良いのです BOOL SetWindowPos( HWND hwndinsertafter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uflags // ウィンドウ位置のオプション それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します さらに次の 操作を行うと必ずウインドウはアクティブ状態になります // 最前面表示の設定 SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE) // 最前面表示の解除 SetWindowPos( hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE) ウインドウを非アクティブ状態で設定や解除するには SWP_NOACTIVATE 定数を追加する必要が あります // 最前面表示の設定 SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE SWP_NOACTIVATE) // 最前面表示の解除 SetWindowPos( hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE SWP_NOACTIVATE) SetWindowPos() 関数で最前面表示を設定したり 最前面表示を解除します 非アクティブ化で設定と解除するときには SWP_NOACTIVATE 定数を追加します
ウインドウのタスクボタンを表示 / 非表示 普通のウインドウはタスクバーにタスク アイコン ( タスクボタン ) が表示されます このタスクボタンを表示したり 非表示にするにはウインドウ スタイルを動的に変更します 応用としては小さい時計ソフトを常に表示させたい場合には 時計ソフトの起動時にタスクボタンを非表示にすることで不要なタスク アイコンを1つ減らせます LONG GetWindowLong( int nindex // 取得するデータ値のインデックス LONG SetWindowLong( int nindex, // 設定するデータ値のインデックス LONG dwnewlong // 新しい値 BOOL ShowWindow( HWND hwnd, // ウインドウ ハンドル int ncmdshow // 表示状態 それでは変更例を簡単に紹介します hwnd にウインドウのハンドルを指定します // WS_EX_APPWINDOW 属性の設定 LONG lexstyle; lexstyle = GetWindowLong( hwnd, GWL_EXSTYLE lexstyle = WS_EX_APPWINDOW; ShowWindow( hwnd, SW_HIDE SetWindowLong( hwnd, GWL_EXSTYLE, lexstyle ShowWindow( hwnd, SW_SHOW // WS_EX_APPWINDOW 属性の解除 LONG lexstyle; lexstyle = GetWindowLong( hwnd, GWL_EXSTYLE lexstyle &= ~WS_EX_APPWINDOW; ShowWindow( hwnd, SW_HIDE SetWindowLong( hwnd, GWL_EXSTYLE, lexstyle ShowWindow( hwnd, SW_SHOW 上記のサンプルでは WS_EX_APPWINDOW 属性を設定したり解除してます なお SetWindowLong() 関数で拡張ウインドウ スタイルを設定しただけでは反映しません 反映させるには必ず ShowWindow() 関数でウインドウ非表示 スタイル変更 ウインドウ表示の順に実行します あと拡張ウインドウ スタイルに WS_EX_TOOLWINDOW 属性も追加されてないと正常に機能しません Windows OS の詳しい内部は公開されてないために 何故このような方法でないとタスク アイコン ( タスクボタン ) を表示したり 非表示にできないのか不明です しかし うまく組み合わせることで実現させるのが上級プログラマなのです
ウインドウのタイトルバーを表示 / 非表示 普通のウインドウはタイトルバーが表示されます このタイトルバーを表示したり 非表示にするにはウインドウ スタイルを動的に変更します 応用としては小さい時計ソフトを常に表示させたい場合には 時計ソフトの起動時にタイトルバーを非表示にすることで表示部分のみの時計ソフトが実現できます LONG GetWindowLong( int nindex // 取得するデータ値のインデックス LONG SetWindowLong( int nindex, // 設定するデータ値のインデックス LONG dwnewlong // 新しい値 それでは変更例を簡単に紹介します hwnd にウインドウのハンドルを指定します // WS_CAPTION 属性の設定 LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_STYLE lstyle = WS_CAPTION; lstyle = SetWindowLong( hwnd, GWL_STYLE, lstyle // WS_CAPTION 属性の解除 LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_STYLE lstyle &= ~WS_CAPTION; lstyle = SetWindowLong( hwnd, GWL_STYLE, lstyle 上記のサンプルでは WS_CAPTION 属性を設定したり解除してます この WS_CAPTION 属性はウインドウ スタイルを変更するだけで設定が有効になります このためウインドウ スタイルの動的変更で紹介したように SetWindowLong() 関数に SWP_FRAMECHANGED オプションを指定して実行する必要はありません むしろ実行すると正常に機能しません 注意しましょう
矩形領域関連 1. ウインドウの矩形領域を取得 2. ウインドウ情報から矩形領域を取得 3. タイトルバーの矩形領域を取得 4. タイトルバー情報から矩形領域を取得 5. デスクトップの矩形領域を取得
ウインドウの矩形領域を取得 ウインドウ画面の矩形領域とクライアント領域の矩形領域を取得する方法を紹介します ウインドウ画面は GetWindowRect() 関数で矩形領域を取得できます クライアント領域は GetClientRect() 関数で矩形領域を取得できます なお クライアント領域とはウインドウ画面からタイトルバーやメニュー領域を除いた作業領域のことです BOOL GetWindowRect( LPRECT lprect // ウィンドウの矩形領域 BOOL GetClientRect( LPRECT lprect // クライアントの矩形領域 次は構造体を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; ウインドウ画面やクライアント領域の矩形領域を取得するときに利用する長方形情報の構造体です この RECT 構造体は汎用的なので GetWindowRect() 関数や GetClientRect() 関数以外でも良く登場します それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // ウインドウの矩形領域を取得 RECT rc; GetWindowRect( hwnd, &rc // クライアントの矩形領域を取得 RECT rc; GetClientRect( hwnd, &rc GetWindowRect() 関数でウインドウの矩形領域を取得します GetClientRect() 関数でクライアントの矩形領域を取得します
ウインドウ情報から矩形領域を取得 ウインドウの矩形領域を取得するもう一つの方法を紹介します 今回は GetWindowInfo() 関数を利用して一発でウインドウの矩形領域を取得します この API 関数を利用するとウインドウ矩形領域 クライアント矩形領域 ウインドウ スタイル 拡張ウインドウ スタイルなど様々な情報を一発で取得できます BOOL GetWindowInfo( LPWINDOWINFO lpinfo // ウインドウ情報の構造体 次は構造体を紹介します typedef struct tagwindowinfo { DWORD cbsize; // 構造体のサイズ ( 必ずセットすること ) RECT rcwindow; // ウインドウの矩形領域 RECT rcclient; // クライアントの矩形領域 DWORD dwstyle; // ウインドウ スタイル DWORD dwexstyle; // 拡張ウインドウ スタイル DWORD dwwindowstatus; // ウインドウのアクティブ状態 UINT cxwindowborders; // ウインドウ境界の横幅 UINT cywindowborders; // ウインドウ境界の高さ ATOM atomwindowtype; // ウインドウ クラスのアトム値 WORD wcreatorversion; // ウインドウのバージョン WINDOWINFO, *LPWINDOWINFO; 上記の構造体にウインドウ情報が格納されます hwnd にウインドウのハンドルを指定します // ウインドウ情報の取得 WINDOWINFO info; info.cbsize = sizoef(windowinfo GetWindowInfo( hwnd, &info 上記の info.rcwindow メンバにウインドウの矩形領域が取得されます 上記の info.rcclient メンバにクライアントの矩形領域が取得されます 上記の info.dwstyle メンバにウインドウ スタイルが取得されます 上記の info.dwexstyle メンバに拡張ウインドウ スタイルが取得されます その他の情報は構造体を参考にして下さい GetWindowInfo() 関数でウインドウ情報を一括で取得します
タイトルバーの矩形領域を取得 タイトルバーの矩形領域を取得する方法を紹介します タイトルバーはウインドウ画面の矩形領域から計算できます BOOL GetWindowRect( LPRECT lprect // ウィンドウの矩形領域 int GetSystemMetrics( int nindex // システム メトリック番号 次は構造体を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; ウインドウ画面の矩形領域を取得するときに利用する長方形情報の構造体です GetSystemMetrics() 関数でタイトルバーの高さを取得します それでは計算方法 ( アルゴリズム ) を 紹介します hwnd にウインドウのハンドルを指定します // タイトルバーの矩形領域を取得 RECT rc; GetWindowRect( hwnd, &rc rc.bottom = rc.top; rc.bottom += GetSystemMetrics(SM_CYCAPTION rc.bottom += GetSystemMetrics(SM_CYFIXEDFRAME // 状況に応じて SM_CYSMCAPTION // 状況に応じて SM_CYSIZEFRAME 上記のサンプルはサイズ変更できないウインドウ スタイルの場合です サイズ変更可能なウインドウ スタイルの場合は SM_CYFIXEDFRAME を SM_CYSIZEFRAME に変更します また 小さいタイトルバーの矩形領域を取得するには SM_CYCAPTION を SM_CYSMCAPTION に変更します この辺を自動的に判断するには GetWindowLong() 関数でウインドウ スタイルを取得して WS_THICKFRAME 属性があればサイズ変更可能と判断 さらに GetWindowLong() 関数で拡張ウインドウ スタイルを取得して WS_EX_TOOLWINDOW 属性があれば小さいタイトルバーと判断できます GetWindowRect() 関数でウインドウの矩形領域を取得します GetSystemMetrics() 関数でタイトルバーの高さを取得します これらを組み合わせることでタイトルバーの矩形領域を求めます
タイトルバー情報から矩形領域を取得 タイトルバーの矩形領域を取得するもう一つの方法を紹介します 今回は GetTitleBarInfo() 関数を利用して一発でタイトルバーの矩形領域を取得します ただし タイトルバーにアイコンがある場合はアイコン部分を除いた矩形領域が取得されます BOOL GetTitleBarInfo( LPTITLEBARINFO lpinfo // タイトルバー情報の構造体 次は構造体を紹介します typedef struct tagtitlebarinfo { DWORD cbsize; // 構造体のサイズ ( 必ずセットすること ) RECT rctitlebar; // タイトルバーの矩形領域 DWORD rgstate[cchildren_titlebar + 1]; // 登録ステータス TITLEBARINFO, *LPTITLEBARINFO; 上記の構造体にタイトルバー情報が格納されます hwnd にウインドウのハンドルを指定し ます // タイトルバーの矩形領域を取得 TITLEBARINFO info; LONG sx; LONG sy; info.cbsize = sizoef(titlebarinfo GetTitleBarInfo( hwnd, &info sx = (info.rctitlebar.right - info.rctitlebar.left sy = (info.rctitlebar.bottom - info.rctitlebar.top 上記の info.rctitlebar メンバにタイトルバーの矩形領域が取得されます GetTitleBarInfo() 関数でタイトルバーの矩形領域を取得します ただし タイトルバーにアイコンがある場合はアイコン部分を除いた矩形領域が取得されます
デスクトップの矩形領域を取得 デスクトップ画面の矩形領域とワークエリア領域の矩形領域を取得する方法を紹介します デスクトップ画面は GetDesktopWindow() 関数でウインドウ ハンドルを取得してから GetWindowRect() 関数で矩形領域を取得できます ワークエリア領域は SystemParametersInfo() 関数に SPI_GETWORKAREA 定数を与えることで矩形領域を一発で取得可能です なお ワークエリアとはデスクトップ画面からタスクバー領域を除いた作業領域のことです HWND GetDesktopWindow( VOID // デスクトップのハンドル BOOL GetWindowRect( LPRECT lprect // ウィンドウの座標値 BOOL SystemParametersInfo( UINT uiaction, // 取得または設定するべきシステムパラメータ UINT uiparam, // 実施するべき操作によって異なる PVOID pvparam, // 実施するべき操作によって異なる UINT fwinini // ユーザープロファイルの更新オプション 次は構造体を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; デスクトップやワークエリアの矩形領域を取得するときに利用する長方形情報の構造体です この RECT 構造体は汎用的なので GetWindowRect() 関数や SystemParametersInfo() 関数以外でも良く登場します 覚えておくと便利でしょう それでは本題の GetDesktopRect() 関数と GetMonitorRect() 関数のソースを載せます hwnd に対象のウインドウ ハンドルを指定するだけで矩形領域を取得できます // デスクトップの矩形領域を取得 VOID GetDesktopRect( LPRECT lprc ) { GetWindowRect( GetDesktopWindow(), lprc // ワークエリアの矩形領域を取得 VOID GetMonitorRect( LPRECT lprc ) { SystemParametersInfo( SPI_GETWORKAREA, 0, lprc, 0 GetDesktopRect() 関数でデスクトップの矩形領域を取得します GetMonitorRect() 関数でワークエリアの矩形領域を取得します
アイコン関連 1. 大きいウインドウ アイコンの取得 / 設定 2. 小さいウインドウ アイコンの取得 / 設定
大きいウインドウ アイコンの取得 / 設定 ウインドウの起動後に大きいアイコンを取得したり 設定したりする方法を紹介します この方法を利用するとダイアログのウインドウに対しても左上隅にアイコンを設定できます また 既にウインドウにアイコンが設定されてる場合は変更することも可能です なお アイコンの取得と設定はアイコン ハンドルを使って操作します LRESULT SendMessage( UINT Msg, // メッセージ WPARAM wparam, // 最初のパラメータ LPARAM lparam // 後続のパラメータ BOOL DestroyIcon( HICON hicon // アイコンのハンドル HANDLE LoadImage( HINSTANCE hinst, // インスタンスのハンドル LPCTSTR lpszname, // イメージの名前または識別子 UINT utype, // イメージのタイプ int cx, // 希望する幅 int cy, // 希望する高さ UINT fuload // ロードのオプション それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 大きいアイコンの取得 HICON hicon; hicon = (HICON)SendMessage( hwnd, WM_GETICON, ICON_BIG, 0 // 大きいアイコンの設定 HICON hicon; hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SendMessage( hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon // 大きいアイコンの変更 HICON hicon; hicon = (HICON)SendMessage( hwnd, WM_GETICON, ICON_BIG, 0 DestroyIcon( hicon hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SendMessage( hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon SendMessage() 関数で大きいアイコンを設定します DestroyIcon() 関数で大きいアイコンを破棄します
小さいウインドウ アイコンの取得 / 設定 ウインドウの起動後に小さいアイコンを取得したり 設定したりする方法を紹介します この方法を利用するとダイアログのウインドウに対しても左上隅にアイコンを設定できます また 既にウインドウにアイコンが設定されてる場合は変更することも可能です なお アイコンの取得と設定はアイコン ハンドルを使って操作します LRESULT SendMessage( UINT Msg, // メッセージ WPARAM wparam, // 最初のパラメータ LPARAM lparam // 後続のパラメータ BOOL DestroyIcon( HICON hicon // アイコンのハンドル HANDLE LoadImage( HINSTANCE hinst, // インスタンスのハンドル LPCTSTR lpszname, // イメージの名前または識別子 UINT utype, // イメージのタイプ int cx, // 希望する幅 int cy, // 希望する高さ UINT fuload // ロードのオプション それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 小さいアイコンの取得 HICON hicon; hicon = (HICON)SendMessage( hwnd, WM_GETICON, ICON_SMALL, 0 // 小さいアイコンの設定 HICON hicon; hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SendMessage( hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon // 小さいアイコンの変更 HICON hicon; hicon = (HICON)SendMessage( hwnd, WM_GETICON, ICON_SMALL, 0 DestroyIcon( hicon hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SendMessage( hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon SendMessage() 関数で小さいアイコンを設定します DestroyIcon() 関数で小さいアイコンを破棄します
クラス関連 1. 大きいクラス アイコンの取得 / 設定 2. 小さいクラス アイコンの取得 / 設定
大きいクラス アイコンの取得 / 設定 ウインドウの起動後に大きいアイコンを取得したり 設定したりする方法を紹介します この方法はウインドウ クラスに設定されてるアイコンを操作します ウインドウ アイコンは1つのウインドウに対してのアイコン操作ですが クラス アイコンは同じウインドウ クラスなら全て同じアイコンに設定できます 複数のモードレス ダイアログのアイコンを一括で変更したい場合に利用します ULONG_PTR GetClassLongPtr( HWND hwnd, // ウインドウのハンドル int nindex // 取得するインデックス定数 ULONG_PTR SetClassLongPtr( HWND hwnd, // ウインドウのハンドル int nindex, // 設定するインデックス定数 LONG_PTR dwnewlong // 設定するクラスのデータ値 それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 大きいアイコンの取得 HICON hicon; hicon = (HICON)GetClassLongPtr( hwnd, GCLP_HICON // 大きいアイコンの設定 HICON hicon; hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SetClassLongPtr( hwnd, GCLP_HICON, (LONG_PTR)hIcon // 大きいアイコンの変更 HICON hicon; hicon = (HICON)GetClassLongPtr( hwnd, GCLP_HICON DestroyIcon( hicon hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SetClassLongPtr( hwnd, GCLP_HICON, (LONG_PTR)hIcon GetClassLongPtr() 関数で大きいアイコンを取得します SetClassLongPtr() 関数で大きいアイコンを設定します DestroyIcon() 関数で大きいアイコンを破棄します
小さいクラス アイコンの取得 / 設定 ウインドウの起動後に小さいアイコンを取得したり 設定したりする方法を紹介します この方法はウインドウ クラスに設定されてるアイコンを操作します ウインドウ アイコンは1つのウインドウに対してのアイコン操作ですが クラス アイコンは同じウインドウ クラスなら全て同じアイコンに設定できます 複数のモードレス ダイアログのアイコンを一括で変更したい場合に利用します ULONG_PTR GetClassLongPtr( HWND hwnd, // ウインドウのハンドル int nindex // 取得するインデックス定数 ULONG_PTR SetClassLongPtr( HWND hwnd, // ウインドウのハンドル int nindex, // 設定するインデックス定数 LONG_PTR dwnewlong // 設定するクラスのデータ値 それでは使用例を簡単に紹介します hwnd にウインドウのハンドルを指定します // 小さいアイコンの取得 HICON hicon; hicon = (HICON)GetClassLongPtr( hwnd, GCLP_HICONSM // 小さいアイコンの設定 HICON hicon; hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SetClassLongPtr( hwnd, GCLP_HICONSM, (LONG_PTR)hIcon // 小さいアイコンの変更 HICON hicon; hicon = (HICON)GetClassLongPtr( hwnd, GCLP_HICONSM DestroyIcon( hicon hicon = (HICON)LoadImage( hwnd, MAKEINTRESOURCE(IDI_ICON01), IMAGE_ICON, 0, 0, (LR_DEFAULTSIZE LR_SHARED) SetClassLongPtr( hwnd, GCLP_HICONSM, (LONG_PTR)hIcon GetClassLongPtr() 関数で小さいアイコンを取得します SetClassLongPtr() 関数で小さいアイコンを設定します DestroyIcon() 関数で小さいアイコンを破棄します
便利関数の付録 1. 便利関数の紹介 2. 便利関数のプロトタイプ宣言 3. GetWindowMove / SetWindowMove 4. GetWindowSize / SetWindowSize 5. ModifyWindowStyle / ModifyWindowStyleEx 6. GetWindowTopMost / SetWindowTopMost 7. GetTaskBar / SetTaskBar 8. GetTitleBar / SetTitleBar 9. GetTitleBarRect 10. GetWindowIcon / SetWindowIcon 11. DelWindowIcon 12. GetClassIcon / SetClassIcon 13. DelClassIcon
便利関数の紹介 この章では 今まで紹介したウインドウの基礎を基にした便利関数を紹介します 1. ウインドウ位置の取得 / 設定 (GetWindowMove SetWindowMove) 2. ウインドウ サイズの取得 / 設定 (GetWindowSize SetWindowSize) 3. ウインドウ スタイルの動的変更 (ModifyWindowStyle ModifyWindowStyleEx) 4. ウインドウの最前面表示を設定 / 解除 (GetWindowTopMost SetWindowTopMost) 5. ウインドウのタスクボタンを表示 / 非表示 (GetTaskBar SetTaskBar) 6. ウインドウのタイトルバーを表示 / 非表示 (GetTitleBar SetTitleBar) 7. ウインドウのタイトルバー領域を取得 (GetTitleBarRect) 8. ウインドウ アイコンの取得 / 設定 (GetWindowIcon SetWindowIcon) 9. ウインドウ アイコンの削除 (DelWindowIcon) 10. クラス アイコンの取得 / 設定 (GetClassIcon SetClassIcon) 11. クラス アイコンの削除 (DelClassIcon) 上記以外にも一連の操作手順を関数として用意することでプログラミングが楽しくなります C 言語 C++ 言語 その他のコンピュータ言語でも考え方は同じです 上級プログラマは独自の処理手順を関数として1つのオリジナル ライブラリとして用意します このような考え方をソフトウェア財産と呼ぶことがあります 一連の操作手順は関数として1つにます そして関数を1つ呼びだすだけで実現させるのがプログラミングのコツです なお 関数名も分かりやすく名付ける工夫も必要になります
便利関数のプロトタイプ宣言 便利関数のプロトタイプ宣言を載せます // ウインドウ位置の取得 / 設定 LONG GetWindowMove( HWND hwnd, LONG *cx, LONG *cy LONG SetWindowMove( HWND hwnd, LONG cx, LONG cy // ウインドウ サイズの取得 / 設定 LONG GetWindowSize( HWND hwnd, LONG *sx, LONG *sy LONG SetWindowSize( HWND hwnd, LONG sx, LONG sy // ウインドウ スタイルの動的変更 VOID ModifyWindowStyle( HWND hwnd, LONG lreset, LONG lset, BOOL bchanged VOID ModifyWindowStyleEx( HWND hwnd, LONG lreset, LONG lset, BOOL bchanged // ウインドウの最前面表示を設定 / 解除 BOOL GetWindowTopMost( HWND hwnd BOOL SetWindowTopMost( HWND hwnd, BOOL btopmost // ウインドウのタスクボタンを表示 / 非表示 BOOL GetTaskBar( HWND hwnd BOOL SetTaskBar( HWND hwnd, BOOL btaskbar // ウインドウのタイトルバーを表示 / 非表示 BOOL GetTitleBar( HWND hwnd BOOL SetTitleBar( HWND hwnd, BOOL btitlebar // ウインドウのタイトルバー領域を取得 LONG GetTitleBarRect( HWND hwnd, LPRECT lprc // ウインドウ アイコンの取得 / 設定 / 削除 VOID GetWindowIcon( HWND hwnd, HICON *hlarge, HICON *hsmall VOID SetWindowIcon( HWND hwnd, HICON hlarge, HICON hsmall VOID DelWindowIcon( HWND hwnd // クラス アイコンの取得 / 設定 / 削除 VOID GetClassIcon( HWND hwnd, HICON *hlarge, HICON *hsmall VOID SetClassIcon( HWND hwnd, HICON hlarge, HICON hsmall VOID DelClassIcon( HWND hwnd 上記の便利関数は 関数名だけで処理内容が伝わるように工夫してます また 関数名の名付け方にも一連の統一感を持たせてみました 読者の方も今後の関数作成で大いに参考に出来ることでしょう
GetWindowMove / SetWindowMove ウインドウ位置の取得関数を紹介します // ウインドウ位置の取得 LONG GetWindowMove( HWND hwnd, LONG *cx, LONG *cy ) { RECT rc; GetWindowRect( hwnd, &rc *cx = (rc.left *cy = (rc.top return MAKELONG( *cx, *cy hwnd にウインドウのハンドルを指定します cx cy にはウインドウ位置を受け取る LONG 型へのポインタを指定します NULL ポインタを渡すと実行時エラーになりますから注意しましょう 戻り値は上位 16 ビットが縦座標 下位 16 ビットが横座標となります ウインドウ位置の設定関数を紹介します // ウインドウ位置の設定 LONG SetWindowMove( HWND hwnd, LONG cx, LONG cy ) { SetWindowPos( hwnd, NULL, cx, cy, 0, 0, (SWP_NOZORDER SWP_NOOWNERZORDER SWP_NOSIZE) return MAKELONG( cx, cy hwnd にウインドウのハンドルを指定します cx cy にはウインドウ位置のスクリーン座標を指定します マイナス値を渡すと左側や上側にウインドウが移動します プラス値が大き過ぎると右側や下側にウインドウが移動して隠れたりします 戻り値は上位 16 ビットが縦座標 下位 16 ビットが横座標となります GetWindowMove() 関数でウインドウ位置を取得します SetWindowMove() 関数でウインドウ位置を設定します
GetWindowSize / SetWindowSize ウインドウ サイズの取得関数を紹介します // ウインドウ サイズの取得 LONG GetWindowSize( HWND hwnd, LONG *sx, LONG *sy ) { RECT rc; GetWindowRect( hwnd, &rc *sx = (rc.right - rc.left *sy = (rc.bottom - rc.top return MAKELONG( *sx, *sy hwnd にウインドウのハンドルを指定します sx sy にはウインドウ サイズを受け取る LONG 型へのポインタを指定します NULL ポインタを渡すと実行時エラーになりますから注意しましょう 戻り値は上位 16 ビットが縦サイズ 下位 16 ビットが横サイズとなります ウインドウ サイズの設定関数を紹介します // ウインドウ サイズの設定 LONG SetWindowSize( HWND hwnd, LONG sx, LONG sy ) { SetWindowPos( hwnd, NULL, 0, 0, sx, sy, (SWP_NOZORDER SWP_NOOWNERZORDER SWP_NOMOVE) return MAKELONG( sx, sy hwnd にウインドウのハンドルを指定します sx sy にはピクセル単位でウインドウ サイズを指定します マイナス値を渡したときの動作は保障できません プラス値が大き過ぎるとデスクトップからウインドウがはみ出します 戻り値は上位 16 ビットが縦サイズ 下位 16 ビットが横サイズとなります GetWindowSize() 関数でウインドウ サイズを取得します SetWindowSize() 関数でウインドウ サイズを設定します
ModifyWindowStyle / ModifyWindowStyleEx ウインドウ スタイルを動的に変更する関数を紹介します // ウインドウ スタイルの動的変更 VOID ModifyWindowStyle( HWND hwnd, LONG lreset, LONG lset, BOOL bchanged ) { LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_STYLE lstyle &= ~lreset; lstyle = lset; SetWindowLong( hwnd, GWL_STYLE, lstyle // ウインドウ スタイルの取得 // 削除するウインドウ スタイル // 追加するウインドウ スタイル // ウインドウ スタイルの設定 if ( bchanged ){ SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_NOACTIVATE SWP_FRAMECHANGED) hwnd にウインドウのハンドルを指定します lreset には削除したいウインドウ スタイルを指定します lset には追加したいウインドウ スタイルを指定します 拡張ウインドウ スタイルを動的に変更する関数を紹介します // 拡張ウインドウ スタイルの動的変更 VOID ModifyWindowStyleEx( HWND hwnd, LONG lreset, LONG lset, BOOL bchanged ) { LONG lstyle; lstyle = GetWindowLong( hwnd, GWL_EXSTYLE lstyle &= ~lreset; lstyle = lset; SetWindowLong( hwnd, GWL_EXSTYLE, lstyle // 拡張ウインドウ スタイルの取得 // 削除する拡張ウインドウ スタイル // 追加する拡張ウインドウ スタイル // 拡張ウインドウ スタイルの設定 if ( bchanged ){ SetWindowPos( hwnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_NOACTIVATE SWP_FRAMECHANGED) hwnd にウインドウのハンドルを指定します lreset には削除したい拡張ウインドウ スタイルを指定します lset には追加したい拡張ウインドウ スタイルを指定します ModifyWindowStyle() 関数でウインドウ スタイルを動的に変更します ModifyWindowStyleEx() 関数で拡張ウインドウ スタイルを動的に変更します
GetWindowTopMost / SetWindowTopMost 最前面表示状態の取得関数を紹介します // 最前面表示状態の取得 BOOL GetWindowTopMost( HWND hwnd ) { if ( GetWindowLong(hWnd,GWL_EXSTYLE) & WS_EX_TOPMOST ){ return TRUE; return FALSE; hwnd にウインドウのハンドルを指定します 戻り値は BOOL 型ですから FALSE なら最前面表示ではない TRUE なら最前面表示の状態であることを意味します 最前面表示状態の設定関数を紹介します // 最前面表示状態の設定 BOOL SetWindowTopMost( HWND hwnd, BOOL btopmost ) { if ( btopmost ){ SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE) else{ SetWindowPos( hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOOWNERZORDER SWP_NOMOVE SWP_NOSIZE) return GetWindowTopMost( hwnd hwnd にウインドウのハンドルを指定します btopmost には最前面表示状態を指定します TRUE なら最前面表示に設定して FALSE なら最前面表示を解除します 戻り値は BOOL 型ですから FALSE なら最前面表示ではない TRUE なら最前面表示の状態であることを意味します GetWindowTopMost() 関数で最前面表示状態を取得します SetWindowTopMost() 関数で最前面表示状態を設定します
GetTaskBar / SetTaskBar タスクボタン状態の取得関数を紹介します // タスクボタン状態の取得 BOOL GetTaskBar( HWND hwnd ) { if ( GetWindowLong(hDlg,GWL_EXSTYLE) & WS_EX_APPWINDOW ){ return TRUE; return FALSE; hwnd にウインドウのハンドルを指定します 戻り値は BOOL 型ですから FALSE ならタスクボタンは表示されてない TRUE ならタスクボタンが表示状態であることを意味します タスクボタン状態の設定関数を紹介します // タスクボタン状態の設定 BOOL SetTaskBar( HWND hwnd, BOOL btaskbar ) { LONG lexstyle = GetWindowLong(hWnd,GWL_EXSTYLE if ( btaskbar ){ lexstyle = WS_EX_APPWINDOW; else{ lexstyle &= ~WS_EX_APPWINDOW; ShowWindow( hwnd, SW_HIDE SetWindowLong( hwnd, GWL_EXSTYLE, lexstyle ShowWindow( hwnd, SW_SHOW return GetTaskBar( hwnd hwnd にウインドウのハンドルを指定します btaskbar にはタスクボタン状態を指定します TRUE ならタスクボタンを表示して FALSE ならタスクボタンを非表示にします 戻り値は BOOL 型ですから FALSE ならタスクボタンは表示されてない TRUE ならタスクボタンが表示状態であることを意味します GetTaskBar() 関数でタスクボタン状態を取得します SetTaskBar() 関数でタスクボタン状態を設定します 注意事項としては 拡張ウインドウ スタイルに WS_EX_TOOLWINDOW 属性が追加されてないと正常に機能しません
GetTitleBar / SetTitleBar タイトルバー状態の取得関数を紹介します // タイトルバー状態の取得 BOOL GetTitleBar( HWND hwnd ) { if ( (GetWindowLong(hWnd,GWL_STYLE) & WS_CAPTION) == WS_CAPTION ){ return TRUE; return FALSE; hwnd にウインドウのハンドルを指定します 戻り値は BOOL 型ですから FALSE ならタイトルバーは表示されてない TRUE ならタイトルバーが表示状態であることを意味します タイトルバー状態の設定関数を紹介します // タイトルバー状態の設定 BOOL SetTitleBar( HWND hwnd, BOOL btitlebar ) { LONG lstyle = GetWindowLong(hWnd,GWL_STYLE if ( btitlebar ){ lstyle = WS_CAPTION; else{ lstyle &= ~WS_CAPTION; SetWindowLong( hwnd, GWL_STYLE, lstyle return GetTitleBar( hwnd hwnd にウインドウのハンドルを指定します btitlebar にはタイトルバー状態を指定します TRUE ならタイトルバーを表示して FALSE ならタイトルバーを非表示にします 戻り値は BOOL 型ですから FALSE ならタイトルバーは表示されてない TRUE ならタイトルバーが表示状態であることを意味します GetTitleBar() 関数でタイトルバー状態を取得します SetTitleBar() 関数でタイトルバー状態を設定します
GetTitleBarRect タイトルバー領域の取得関数を紹介します typedef struct tagrect { LONG left; // 左上隅のX 座標 LONG top; // 左上隅のY 座標 LONG right; // 右下隅のX 座標 LONG bottom; // 右下隅のY 座標 RECT, *LPRECT; 上記の長方形情報の構造体にタイトルバーの矩形領域がセットされます // タイトルバーの矩形領域を取得 LONG GetTitleBarRect( HWND hwnd, LPRECT lprc ) { INT sx; INT sy; // ウインドウの矩形領域を取得 GetWindowRect( hwnd, &lprc lprc->bottom = lprc->top; // サイズ変更可能なウインドウの調査 if ( GetWindowLong(hWnd,GWL_STYLE) & WS_THICKFRAME ){ lprc->bottom += GetSystemMetrics(SM_CYSIZEFRAME else{ lprc->bottom += GetSystemMetrics(SM_CYFIXEDFRAME // 小さいタイトルバー ウインドウの調査 if ( GetWindowLong(hWnd,GWL_EXSTYLE) & WS_EX_TOOLWINDOW ){ lprc->bottom += GetSystemMetrics(SM_CYSMCAPTION else{ lprc->bottom += GetSystemMetrics(SM_CYCAPTION sx = (lprc->right - lprc->left sy = (lprc->bottom - lprc->top return MAKELONG( sx, sy // タイトルバーの横幅 // タイトルバーの高さ hwnd にウインドウのハンドルを指定します lprc にはタイトルバー領域を格納する RECT 型へのポインタを指定します 戻り値は上位 16 ビットが縦サイズ 下位 16 ビットが横サイズとなります GetTitleBarRect() 関数でタイトルバー領域の矩形領域を取得します 戻り値のデータ lret を次のマクロ関数で縦横サイズに分離できます LOWORD(lRet) でタイトルバーの横サイズが取得できます HIWORD(lRet) でタイトルバーの縦サイズが取得できます
GetWindowIcon / SetWindowIcon ウインドウ アイコンの取得関数を紹介します // ウインドウ アイコンの取得 VOID GetWindowIcon( HWND hwnd, HICON *hlarge, HICON *hsmall ) { *hlarge = (HICON)SendMessage( hwnd, WM_GETICON, ICON_BIG, 0 *hsmall = (HICON)SendMessage( hwnd, WM_GETICON, ICON_SMALL, 0 hwnd にウインドウのハンドルを指定します hlarge には大きいアイコン ハンドルを格納する HICON 型へのポインタを指定します hsmall には小さいアイコン ハンドルを格納する HICON 型へのポインタを指定します ウインドウ アイコンの設定関数を紹介します // ウインドウ アイコンの設定 VOID SetWindowIcon( HWND hwnd, HICON hlarge, HICON hsmall ) { HICON hicon; if ( hlarge!= NULL ){ if ( (hicon = (HICON)SendMessage(hWnd,WM_GETICON,ICON_BIG,0))!= NULL ){ DestroyIcon( hicon SendMessage( hwnd, WM_SETICON, ICON_BIG, (LPARAM)hLarge if ( hsmall!= NULL ){ if ( (hicon = (HICON)SendMessage(hWnd,WM_GETICON,ICON_SMALL,0))!= NULL ){ DestroyIcon( hicon SendMessage( hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hSmall hwnd にウインドウのハンドルを指定します hlarge には設定する大きいアイコン ハンドルを指定します hlarge が NULL なら設定しない hsmall には設定する小さいアイコン ハンドルを指定します hsmall が NULL なら設定しない GetWindowIcon() 関数でウインドウ アイコンを取得します SetWindowIcon() 関数でウインドウ アイコンを設定します
DelWindowIcon ウインドウ アイコンの削除関数を紹介します // ウインドウ アイコンの削除 VOID DelWindowIcon( HWND hwnd ) { DestroyIcon( (HICON)SendMessage(hWnd,WM_GETICON,ICON_BIG,0) DestroyIcon( (HICON)SendMessage(hWnd,WM_GETICON,ICON_SMALL,0) SendMessage( hwnd, WM_SETICON, ICON_BIG, NULL SendMessage( hwnd, WM_SETICON, ICON_SMALL, NULL hwnd にウインドウのハンドルを指定します DelWindowIcon() 関数でウインドウ アイコンを削除します
GetClassIcon / SetClassIcon クラス アイコンの取得関数を紹介します // クラス アイコンの取得 VOID GetClassIcon( HWND hwnd, HICON *hlarge, HICON *hsmall ) { *hlarge = (HICON)GetClassLongPtr( hwnd, GCLP_HICON *hsmall = (HICON)GetClassLongPtr( hwnd, GCLP_HICONSM hwnd にウインドウのハンドルを指定します hlarge には大きいアイコン ハンドルを格納する HICON 型へのポインタを指定します hsmall には小さいアイコン ハンドルを格納する HICON 型へのポインタを指定します クラス アイコンの設定関数を紹介します // クラス アイコンの設定 VOID SetClassIcon( HWND hwnd, HICON hlarge, HICON hsmall ) { HICON hicon; if ( hlarge!= NULL ){ if ( (hicon = (HICON)GetClassLongPtr(hWnd,GCLP_HICON))!= NULL ){ DestroyIcon( hicon SetClassLongPtr( hwnd, GCLP_HICON, (LONG_PTR)hLarge if ( hsmall!= NULL ){ if ( (hicon = (HICON)GetClassLongPtr(hWnd,GCLP_HICONSM))!= NULL ){ DestroyIcon( hicon SetClassLongPtr( hwnd, GCLP_HICONSM, (LONG_PTR)hSmall hwnd にウインドウのハンドルを指定します hlarge には設定する大きいアイコン ハンドルを指定します hlarge が NULL なら設定しない hsmall には設定する小さいアイコン ハンドルを指定します hsmall が NULL なら設定しない GetClassIcon() 関数でクラス アイコンを取得します SetClassIcon() 関数でクラス アイコンを設定します
DelClassIcon クラス アイコンの削除関数を紹介します // クラス アイコンの削除 VOID DelClassIcon( HWND hwnd ) { DestroyIcon( (HICON)GetClassLongPtr(hWnd,GCLP_HICON) DestroyIcon( (HICON)GetClassLongPtr(hWnd,GCLP_HICONSM) SetClassLongPtr( hwnd, GCLP_HICON, NULL SetClassLongPtr( hwnd, GCLP_HICONSM, NULL hwnd にウインドウのハンドルを指定します DelClassIcon() 関数でクラス アイコンを削除します
おわりに 1. 著者のプロフィール
著者のプロフィール ニックネーム 科学太郎 性別 男性 誕生日 1975 年 03 月 24 日生まれ 都道府県 長野県 職業 電脳プログラミング塾 ( 自営業 ) 自己紹介 日本では2003 年度より全国一律の高校で 情報 という教科書が導入されました しかし 文部省は パソコンに関する授業をすれば良い という手抜きルールを作りました これではワープロソフトやインターネットの使い方だけで終わる高校から ソフトウェア開発の基礎知識であるプログラミングの授業を行う高校が現れて 天と地 の差となります 分かりやすく 数学 で例えると文部省は 数学の授業に対して 数字を扱う授業をすれば良い という手抜きルー ルを作った事と同じです つまり 足し算と引き算を教える高校から微分と積分を教える高校が現れるという事です そこで全国の高校生諸君のために 勝手に プログラミング普及推進委員会 と名乗ってフリーソフトやフリーゲー ムの製作方法を電子書籍シリーズとして情報公開します なお 2009 年 2 月頃まで オンライン ショップ経営 を目指してた元プログラマである 今後は オンライン ショップ経営 ではなく 本格的に 電子書籍の普及 と ソフト制作知識の普及 を本業とするために 電脳プログラミング塾 を開講しました つまり 電子書籍シリーズこそ 元プログラマだった私 科学太郎 の新しい個人営業 ( 自営業 ) の晴れ舞台なのです ホームページ プログラミングのメモ帳 活動内容 インターネット上で 電脳プログラミング塾 という自営業で活動中です 元プログラマから フリーソフト制作塾 という位置づけでソフトウェアの技能 ( 技術能力 =ノウハウ ) を情報公開します 基本的な部分やプログラミング レッスンは無料版として ソフトウェアの製作方法のみ有料版とする方針です