|
|
|||||||||||||||||||||||||||
|
2-4-11. ウィンドウメニューのコードウィンドウメニューは、MDIスタイルのアプリケーションには、無くてはならないものです。ここでは、その内容と働き、そしてプログラムコードを説明します。ウィンドウメニューの内容 ApMdisysではウィンドウメニューに以下のコマンドを用意しました。ほぼすべてモーラしています。
ウィンドウメニューのプログラムコード ApMdisysのウィンドウメニュー関係のプログラムコードを以下に示します。大部分が、1行で済んでいます。 case WM_COMMAND: // メニューやアクセラレータのコマンド
{
switch (LOWORD(wParam))
{
: (他のコード)
//
// ウィンドウ(W) Menu
//
case IDM_CASCADE: // 重ねて表示
SendMessage(hWndClient,WM_MDICASCADE,0L,0L);
return 0L;
case IDM_VTILE: // 上下に並べて表示
SendMessage(hWndClient,WM_MDITILE
,MDITILE_HORIZONTAL,0L);
return 0L;
case IDM_HTILE: // 左右に並べて表示
SendMessage(hWndClient,WM_MDITILE
,MDITILE_VERTICAL,0L);
return 0L;
case IDM_ARRANGE: // すべて最小化する
EnumChildWindows(hWndClient,CloseEnumProc,1);
return 0L;
case IDM_REARRANGE: // すべて元に戻す
EnumChildWindows(hWndClient,CloseEnumProc,2);
return 0L;
case IDM_ICONSORT: // アイコンを整列する
SendMessage(hWndClient,WM_MDIICONARRANGE,0L,0L);
return 0L;
case IDM_ALLCLOSE: // すべて閉じる
EnumChildWindows(hWndClient,CloseEnumProc,0);
return 0L;
}
break;
}
: (他のコード)
//
// MDI子ウィンドウを列挙してすべてのウィンドウをクローズ・アイコン化・復帰する。
//
static BOOL CALLBACK CloseEnumProc(HWND hWnd,LONG lParam)
{
if (GetParent(hWnd) != hWndClient) return 1;
if (lParam == 0) // Close
{
if (!SendMessage(hWnd,WM_QUERYENDSESSION,0,0L)) return 1;
SendMessage(hWndClient,WM_MDIDESTROY,(WPARAM)hWnd,0L);
}
else if (lParam == 1) // Icon
ShowWindow(hWnd,SW_MINIMIZE);
else if (lParam == 2) // Restore
SendMessage(hWndClient,WM_MDIRESTORE,(WPARAM)hWnd,0L);
return 1;
}
「重ねて表示、上下に並べて表示、左右に並べて表示、アイコンを整列する」などは、すべてのMDI子ウィンドウやアイコンが対象になるので、MDIクライアントウィンドウに,WM_MDIxxx メッセージを送信するだけで済みます。
「すべて閉じる、すべて最小化する、すべて元に戻す」は、EnumChildWindows 関数を使って、MDI子ウィンドウを列挙することで、すべての子ウィンドウに操作を行なっています。列挙してコールする関数は、CloseEnumProc です。この lParam が EnumChildWindows の最後の番号になります。よって0なら閉じる、1なら最小化する、2なら元に戻すになります。 これらの関数は、1度作ったらほぼすべてのMDIのアプリケーションで応用ができます。この上記のコードも、原版はいつ作成したのか分からないくらい前にコーディングしたものです。
|