アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-4-11. ウィンドウメニューのコード

 ウィンドウメニューは、MDIスタイルのアプリケーションには、無くてはならないものです。ここでは、その内容と働き、そしてプログラムコードを説明します。

ウィンドウメニューの内容

 ApMdisysではウィンドウメニューに以下のコマンドを用意しました。ほぼすべてモーラしています。

コマンド 番号の定義 内 容
重ねて表示 IDM_CASCADE すべてのMDI子ウィンドウを重ねて(カスケード)表示します。位置は右下に次々と表示し、サイズもデフォルト値になります。
上下に並べて表示 IDM_VTILE すべてのMDI子ウィンドウを上下に並べて(タイル)表示します。すべてのウィンドウが同じ大きさで、左右はウィンドウ一杯に、上下は2つなら1/2に、3つなら、1/3になります。ただしウィンドウ数が多い場合は、行列に配置します。
左右に並べて表示 IDM_HTILE すべてのMDI子ウィンドウを左右に並べて(タイル)表示します。すべてのウィンドウが同じ大きさで、上下はウィンドウ一杯に、左右は2つなら1/2に、3つなら、1/3になります。ただしウィンドウ数が多い場合は、行列に配置します。
すべて閉じる IDM_ALLCLOSE すべてのMDI子ウィンドウをクロースします。これはMDI子ウィンドウの破棄作業を行ないます。必要があれば、確認メッセージなどを表示します。
すべて最小化する IDM_ARRANGE すべてのMDI子ウィンドウを最小化してアイコンにしてMDIクライアントウィンドウの下部に配置します。
すべて元に戻す IDM_REARRANGE 最小化または最大化している、すべてのMDI子ウィンドウを元に戻し、通常のウィンドウ状態にします。
アイコンを整列する IDM_ICONSORT 最小化しているアイコンをきちんと整列します。
(ウィンドウ名) -- オープン中のMDI子ウィンドウのタイトルを表示しますので、それを実行すると、アクティブをそのウィンドウに移動します。また現在アクティブのウィンドウにはチェックマークを表示します。

 最後の(ウィンドウ名)の表示は10個までです。もし10個以上のMDI子ウィンドウを表示すると、ウィンドウメニューの最後に、「その他のウィンドウ(M)...」のコマンドを表示します。これを実行すると、「ウィンドウの選択」ダイアログボックスを表示します。ここでは、すべてのMDI子ウィンドウのタイトルを表示しますので、その中の1つを選ぶと、それを表示してアクティブ化します。

ウィンドウメニューのプログラムコード

 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のアプリケーションで応用ができます。この上記のコードも、原版はいつ作成したのか分からないくらい前にコーディングしたものです。

ページ移動