• 検索結果がありません。

ウインドウの基礎編

N/A
N/A
Protected

Academic year: 2021

シェア "ウインドウの基礎編"

Copied!
48
0
0

読み込み中.... (全文を見る)

全文

(1)
(2)

表示関連

1. ウインドウの表示/非表示

2. ウインドウの有効化/無効化

3. ウインドウの最大化/最小化/元に戻す

4. ウインドウの最小化/元に戻す処理

5. ウインドウの最大化/最小化の状態

6. ウインドウの最大化/最小化/通常の状態

(3)

ウインドウの表示

/非表示

ウインドウの表示と非表示は

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() 関数で表示、非表示の状態を調査できます。

(4)

ウインドウの有効化

/無効化

ウインドウの有効化と無効化は

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() 関数で有効化、無効化の状態を調査できます。

(5)

ウインドウの最大化

/最小化/元に戻す

ウインドウの最大化、最小化、元に戻す操作をプログラミングで行うには

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) で元に戻す操作が行えます。

(6)

ウインドウの最小化

/元に戻す処理

ウインドウの最小化と元に戻す操作をプログラミングで行うには

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() 関数を呼び出すとずっと最小化されたままに

できます。

(7)

ウインドウの最大化

/最小化の状態

ウインドウの最大化と最小化の状態を調べるには次の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() 関数で最小化状態を調べます。

(8)

ウインドウの最大化

/最小化/通常の状態

ウインドウの最大化、最小化、通常の状態を調べる方法として

GetWindowPlacement() 関数を使

うこともできます。この関数なら

IsZoomed() 関数、IsIconic() 関数の2つの API 関数を呼び出さな

くても良いでしょう。どの方法でも希望通りに最大化、最小化、普通の状態を判定できます。

BOOL GetWindowPlacement( HWND hWnd, // ウィンドウのハンドル 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 定数なら最大化の状態となります。

(9)

位置とサイズ関連

1. ウインドウの位置を取得/設定

2. ウインドウのサイズを取得/設定

3. ウインドウの通常サイズを取得/設定

4. ウインドウの最小化位置を取得/設定

5. ウインドウの最大化位置を取得/設定

(10)

ウインドウの位置を取得

/設定

ウインドウの位置を取得するには

GetWindowRect() 関数で行います。この関数の第一引数に対象

のウインドウ・ハンドルを指定して、第二引数に長方形情報の構造体へのポインタを指定します

。これでウインドウの矩形領域を

RECT 構造体に取得します。

BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル LPRECT lpRect // ウィンドウの座標値 );

次は構造体を紹介します。

typedef struct tagRECT {

LONG left; // 左上隅のX座標

LONG top; // 左上隅のY座標

LONG right; // 右下隅のX座標

LONG bottom; // 右下隅のY座標

} RECT, *LPRECT;

ウインドウの位置を設定するには

SetWindowPos() 関数で行います。

BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル 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() 関数でウインドウ位置を設定します。

(11)

ウインドウのサイズを取得

/設定

ウインドウのサイズを取得するには

GetWindowRect() 関数で行います。この関数の第一引数に対

象のウインドウ・ハンドルを指定して、第二引数に長方形情報の構造体へのポインタを指定し

ます。これでウインドウの矩形領域を

RECT 構造体に取得します。

BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル LPRECT lpRect // ウィンドウの座標値 );

次は構造体を紹介します。

typedef struct tagRECT {

LONG left; // 左上隅のX座標

LONG top; // 左上隅のY座標

LONG right; // 右下隅のX座標

LONG bottom; // 右下隅のY座標

} RECT, *LPRECT;

ウインドウのサイズを設定するには

SetWindowPos() 関数で行います。

BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル 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() 関数でウインドウ・サイズを設定します。

(12)

ウインドウの通常サイズを取得

/設定

ウインドウが最小化状態や最大化状態でも正しくウインドウ・サイズを取得

/設定するには次の2

つの関数を利用します。

GetWindowPlacement() 関数で位置情報を取得、SetWindowPlacement()

関数で位置情報を設定します。この関数の第一引数に対象のウインドウ・ハンドルを指定して、

第二引数に

WINDOWPLACEMENT 構造体へのポインタを指定します。これでウインドウの位置情

報を

WINDOWPLACEMENT 構造体を使って取得/設定できます。

BOOL GetWindowPlacement( HWND hWnd, // ウィンドウのハンドル WINDOWPLACEMENT *lpInfo // 位置情報の構造体 ); BOOL SetWindowPlacement( HWND hWnd, // ウィンドウのハンドル

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() 関数でウインドウの通常サイズを設定します。

(13)

ウインドウの最小化位置を取得

/設定

ウインドウが最小化されるときのウインドウ左上隅位置を取得

/設定するには次の2つの関数を利

用します。

GetWindowPlacement() 関数で位置情報を取得、SetWindowPlacement() 関数で位置情

報を設定します。この関数の第一引数に対象のウインドウ・ハンドルを指定して、第二引数に

WINDOWPLACEMENT 構造体へのポインタを指定します。これでウインドウの位置情報を

WINDOWPLACEMENT 構造体を使って取得/設定できます。

BOOL GetWindowPlacement( HWND hWnd, // ウィンドウのハンドル WINDOWPLACEMENT *lpInfo // 位置情報の構造体 ); BOOL SetWindowPlacement( HWND hWnd, // ウィンドウのハンドル

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() 関数でウインドウの最小化位置を設定します。

(14)

ウインドウの最大化位置を取得

/設定

ウインドウが最大化されるときのウインドウ左上隅位置を取得

/設定するには次の2つの関数を利

用します。

GetWindowPlacement() 関数で位置情報を取得、SetWindowPlacement() 関数で位置情

報を設定します。この関数の第一引数に対象のウインドウ・ハンドルを指定して、第二引数に

WINDOWPLACEMENT 構造体へのポインタを指定します。これでウインドウの位置情報を

WINDOWPLACEMENT 構造体を使って取得/設定できます。

BOOL GetWindowPlacement( HWND hWnd, // ウィンドウのハンドル WINDOWPLACEMENT *lpInfo // 位置情報の構造体 ); BOOL SetWindowPlacement( HWND hWnd, // ウィンドウのハンドル

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() 関数でウインドウの最大化位置を設定します。

(15)

スタイル関連

1. ウインドウ・スタイルの動的変更

2. 拡張ウインドウ・スタイルの動的変更

3. ウインドウの最前面表示を設定/解除

4. ウインドウのタスクボタンを表示/非表示

5. ウインドウのタイトルバーを表示/非表示

(16)

ウインドウ・スタイルの動的変更

ウインドウ・スタイルを動的に変更するには次の手順で行います。

1. ウインドウ・スタイルの取得(GetWindowLong)

2. スタイル・データのビットを動的に変更(AND,OR)

3. ウインドウ・スタイルの設定(SetWindowLong)

4. ウインドウ・スタイルの反映(SetWindowPos)

LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得するデータ値のインデックス ); LONG SetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex, // 設定するデータ値のインデックス LONG dwNewLong // 新しい値 ); BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル 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 オプションを実行します。

(17)

拡張ウインドウ・スタイルの動的変更

拡張ウインドウ・スタイルを動的に変更するには次の手順で行います。

1. 拡張ウインドウ・スタイルの取得(GetWindowLong)

2. 拡張スタイル・データのビットを動的に変更(AND,OR)

3. 拡張ウインドウ・スタイルの設定(SetWindowLong)

4. 拡張ウインドウ・スタイルの反映(SetWindowPos)

LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得するデータ値のインデックス ); LONG SetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex, // 設定するデータ値のインデックス LONG dwNewLong // 新しい値 ); BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル 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 オプションを実行します。

(18)

ウインドウの最前面表示を設定

/解除

指定ウインドウを最前面表示に設定したり、解除するには

SetWindowPos() 関数を使います。

この

API 関数はオプションが多く初心者には使いにくいかも知れません。しかし、お決まりパタ

ーンがありますから一度知ってしまえば簡単です。また、最前面表示とは常に前面にウインドウ

が表示される状態のことです。つまり、普通はアクティブ・ウインドウのみが前面に表示されま

すが、これよりも優先されて前面に表示させる状態を最前面表示と呼びます。応用としては小さ

い時計ソフトを常に表示させたい場合には、時計ソフトの起動時に最前面表示の設定を行えば良

いのです。

BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル 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 定数を追加します。

(19)

ウインドウのタスクボタンを表示

/非表示

普通のウインドウはタスクバーにタスク・アイコン

(タスクボタン)が表示されます。このタスクボ

タンを表示したり、非表示にするにはウインドウ・スタイルを動的に変更します。応用としては

小さい時計ソフトを常に表示させたい場合には、時計ソフトの起動時にタスクボタンを非表示に

することで不要なタスク・アイコンを1つ減らせます。

LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得するデータ値のインデックス ); LONG SetWindowLong( HWND hWnd, // ウィンドウのハンドル 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 の詳しい内部は公開されてないために、何故このような方法でな

いとタスク・アイコン

(タスクボタン)を表示したり、非表示にできないのか不明です。しかし、う

まく組み合わせることで実現させるのが上級プログラマなのです。

(20)

ウインドウのタイトルバーを表示

/非表示

普通のウインドウはタイトルバーが表示されます。このタイトルバーを表示したり、非表示にす

るにはウインドウ・スタイルを動的に変更します。応用としては小さい時計ソフトを常に表示さ

せたい場合には、時計ソフトの起動時にタイトルバーを非表示にすることで表示部分のみの時計

ソフトが実現できます。

LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得するデータ値のインデックス ); LONG SetWindowLong( HWND hWnd, // ウィンドウのハンドル 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 オプションを指定し

て実行する必要はありません。むしろ実行すると正常に機能しません。注意しましょう。

(21)

矩形領域関連

1. ウインドウの矩形領域を取得

2. ウインドウ情報から矩形領域を取得

3. タイトルバーの矩形領域を取得

4. タイトルバー情報から矩形領域を取得

5. デスクトップの矩形領域を取得

(22)

ウインドウの矩形領域を取得

ウインドウ画面の矩形領域とクライアント領域の矩形領域を取得する方法を紹介します。ウイン

ドウ画面は

GetWindowRect() 関数で矩形領域を取得できます。クライアント領域は

GetClientRect() 関数で矩形領域を取得できます。なお、クライアント領域とはウインドウ画面か

らタイトルバーやメニュー領域を除いた作業領域のことです。

BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル LPRECT lpRect // ウィンドウの矩形領域 ); BOOL GetClientRect( HWND hWnd, // ウィンドウのハンドル 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() 関数でクライアントの矩形領域を取得します。

(23)

ウインドウ情報から矩形領域を取得

ウインドウの矩形領域を取得するもう一つの方法を紹介します。今回は

GetWindowInfo() 関数を

利用して一発でウインドウの矩形領域を取得します。この

API 関数を利用するとウインドウ矩形

領域、クライアント矩形領域、ウインドウ・スタイル、拡張ウインドウ・スタイルなど様々な情

報を一発で取得できます。

BOOL GetWindowInfo( HWND hWnd, // ウィンドウのハンドル 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() 関数でウインドウ情報を一括で取得します。

(24)

タイトルバーの矩形領域を取得

タイトルバーの矩形領域を取得する方法を紹介します。

タイトルバーはウインドウ画面の矩形領域から計算できます。

BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル 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); // 状況に応じて SM_CYSMCAPTION

rc.bottom += GetSystemMetrics(SM_CYFIXEDFRAME); // 状況に応じて SM_CYSIZEFRAME

上記のサンプルはサイズ変更できないウインドウ・スタイルの場合です。サイズ変更可能なウイ

ンドウ・スタイルの場合は

SM_CYFIXEDFRAME を SM_CYSIZEFRAME に変更します。また、小

さいタイトルバーの矩形領域を取得するには

SM_CYCAPTION を SM_CYSMCAPTION に変更し

ます。この辺を自動的に判断するには

GetWindowLong() 関数でウインドウ・スタイルを取得して

WS_THICKFRAME 属性があればサイズ変更可能と判断。さらに GetWindowLong() 関数で拡張ウ

インドウ・スタイルを取得して

WS_EX_TOOLWINDOW 属性があれば小さいタイトルバーと判断

できます。

まとめ

GetWindowRect() 関数でウインドウの矩形領域を取得します。

GetSystemMetrics() 関数でタイトルバーの高さを取得します。

これらを組み合わせることでタイトルバーの矩形領域を求めます。

(25)

タイトルバー情報から矩形領域を取得

タイトルバーの矩形領域を取得するもう一つの方法を紹介します。

今回は

GetTitleBarInfo() 関数を利用して一発でタイトルバーの矩形領域を取得します。

ただし、タイトルバーにアイコンがある場合はアイコン部分を除いた矩形領域が取得されます。

BOOL GetTitleBarInfo( HWND hWnd, // ウィンドウのハンドル 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() 関数でタイトルバーの矩形領域を取得します。

ただし、タイトルバーにアイコンがある場合はアイコン部分を除いた矩形領域が取得されます。

(26)

デスクトップの矩形領域を取得

デスクトップ画面の矩形領域とワークエリア領域の矩形領域を取得する方法を紹介します。デス

クトップ画面は

GetDesktopWindow() 関数でウインドウ・ハンドルを取得してから

GetWindowRect() 関数で矩形領域を取得できます。ワークエリア領域は SystemParametersInfo()

関数に

SPI_GETWORKAREA 定数を与えることで矩形領域を一発で取得可能です。なお、ワーク

エリアとはデスクトップ画面からタスクバー領域を除いた作業領域のことです。

HWND GetDesktopWindow( VOID ); // デスクトップのハンドル BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル 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() 関数でワークエリアの矩形領域を取得します。

(27)

アイコン関連

1. 大きいウインドウ・アイコンの取得/設定

2. 小さいウインドウ・アイコンの取得/設定

(28)

大きいウインドウ・アイコンの取得

/設定

ウインドウの起動後に大きいアイコンを取得したり、設定したりする方法を紹介します。この方

法を利用するとダイアログのウインドウに対しても左上隅にアイコンを設定できます。また、既

にウインドウにアイコンが設定されてる場合は変更することも可能です。なお、アイコンの取得

と設定はアイコン・ハンドルを使って操作します。

LRESULT SendMessage( HWND hWnd, // ウィンドウのハンドル 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() 関数で大きいアイコンを破棄します。

(29)

小さいウインドウ・アイコンの取得

/設定

ウインドウの起動後に小さいアイコンを取得したり、設定したりする方法を紹介します。この方

法を利用するとダイアログのウインドウに対しても左上隅にアイコンを設定できます。また、既

にウインドウにアイコンが設定されてる場合は変更することも可能です。なお、アイコンの取得

と設定はアイコン・ハンドルを使って操作します。

LRESULT SendMessage( HWND hWnd, // ウィンドウのハンドル 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() 関数で小さいアイコンを破棄します。

(30)

クラス関連

1. 大きいクラス・アイコンの取得/設定

2. 小さいクラス・アイコンの取得/設定

(31)

大きいクラス・アイコンの取得

/設定

ウインドウの起動後に大きいアイコンを取得したり、設定したりする方法を紹介します。この方

法はウインドウ・クラスに設定されてるアイコンを操作します。ウインドウ・アイコンは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() 関数で大きいアイコンを破棄します。

(32)

小さいクラス・アイコンの取得

/設定

ウインドウの起動後に小さいアイコンを取得したり、設定したりする方法を紹介します。この方

法はウインドウ・クラスに設定されてるアイコンを操作します。ウインドウ・アイコンは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() 関数で小さいアイコンを破棄します。

(33)

便利関数の付録

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

(34)

便利関数の紹介

この章では、今まで紹介したウインドウの基礎を基にした便利関数を紹介します。

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つ呼びだすだけで実現させるのがプログラミングのコツです。なお、関数名も分かりやす

く名付ける工夫も必要になります。

(35)

便利関数のプロトタイプ宣言

便利関数のプロトタイプ宣言を載せます。

// ウインドウ位置の取得/設定

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 );

上記の便利関数は、関数名だけで処理内容が伝わるように工夫してます。

また、関数名の名付け方にも一連の統一感を持たせてみました。

(36)

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() 関数でウインドウ位置を設定します。

(37)

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() 関数でウインドウ・サイズを設定します。

(38)

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() 関数で拡張ウインドウ・スタイルを動的に変更します。

(39)

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() 関数で最前面表示状態を設定します。

(40)

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 属性が追加されてない

と正常に機能しません。

(41)

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() 関数でタイトルバー状態を設定します。

(42)

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) でタイトルバーの縦サイズが取得できます。

(43)

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() 関数でウインドウ・アイコンを設定します。

参照

関連したドキュメント

l 「指定したスキャン速度以下でデータを要求」 : このモード では、 最大スキャン速度として設定されている値を指 定します。 有効な範囲は 10 から 99999990

納付日の指定を行った場合は、指定した日の前日までに預貯金口座の残

また、JR東日本パス (本券) を駅の指定席券売機に

編﹁新しき命﹂の最後の一節である︒この作品は弥生子が次男︵茂吉

QRコード読込画面 が表示されたら、表 示された画面を選択 してウインドウをアク ティブな状態にした 上で、QRコードリー

ハンドルを回し、チョウセツバネをたわ ませるとダイヤフラムが湾曲し、Pベン

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を

市民的その他のあらゆる分野において、他の 者との平等を基礎として全ての人権及び基本