Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> 基本 >> システムメニューに独自メニューアイテムを追加するには

システムメニューに独自メニューアイテムを追加するには

  ウィンドウのタイトルバーの左上のアイコンをクリックしたときに表示されるメニューをシステムメニューといいます。
  このメニューにメニューアイテムを追加するためには、GetSystemMenu () APIを呼び出します。

  あとは通常のメニューのように追加すればいいのですが、 ひとつ注意する点があります。

  システムメニューに追加するメニューアイテムのIDは、16の倍数である必要があります。
  下位4ビットをWindows自体がシステム領域として使用しているためです。

  このメニューアイテムをユーザーが選択したときは、WM_SYSCOMMANDメッセージが発行されます。これはWM_COMMANDと似ていて、wParamの下位WORDにメニューIDが入ってきます。

  以下、サンプルになります。ダイアログアプリケーションですが、システムメニューが表示できるスタイルとしています。

■■■ sysmenu プロジェクト
resource.h
#define IDD_MAIN_DIALOG 101
resrc.rc

#include <winres.h>
#include "resource.h"

IDD_MAIN_DIALOG DIALOG DISCARDABLE 0, 0, 114, 55
STYLE WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "システムメニュー"
FONT 9, "MS Pゴシック"
BEGIN
    PUSHBUTTON "終了(&X)",IDCANCEL,30,20,50,14
END

main.cpp

#include <windows.h>
#include <tchar.h>

#include "resource.h"

//   下位4ビットはWindowsがシステム領域として使用しているため、16の倍数で
const UINT IDM_ABOUT = 0x10;

BOOL CALLBACK DialogFunc ( HWND hWnd,
    UINT nMessage,
    WPARAM wParam,
    LPARAM lParam )
{
    switch ( nMessage ) {
    case WM_INITDIALOG:
        {
            // 現在のシステムメニューを取得
            HMENU hSystemMenu;
            hSystemMenu = GetSystemMenu ( hWnd, FALSE );

            // メニューの数を取得
            int nMenuItemCount;
            nMenuItemCount = GetMenuItemCount ( hSystemMenu );

            // メニューを システムメニューの「閉じる」の前に追加

            //   .....
            //   最大化
            //   -------------------------
            //   システムメニューについて
            //   -------------------------
            //   閉じる

            DWORD dwMenuItemInfoSize;
            dwMenuItemInfoSize = sizeof ( MENUITEMINFO );

            MENUITEMINFO mii;
            memset ( &mii, 0, dwMenuItemInfoSize );
            mii.cbSize = dwMenuItemInfoSize;

            mii.fMask = MIIM_TYPE;
            mii.fType = MFT_SEPARATOR;
            // セパレータを追加
            InsertMenuItem ( hSystemMenu, nMenuItemCount -1, TRUE, &mii );

            mii.fMask = MIIM_TYPE;
            mii.fType = MFT_SEPARATOR;

            _TCHAR g_cszAbout[] = _TEXT ( "システムメニューについて(&A)" );
            mii.fMask = MIIM_TYPE | MIIM_ID;
            mii.fType = MFT_STRING;
            mii.wID = IDM_ABOUT;
            mii.dwTypeData = g_cszAbout;
            mii.cch = lstrlen ( g_cszAbout );

            // IDM_ABOUT を追加
            InsertMenuItem ( hSystemMenu, nMenuItemCount - 1, TRUE, &mii );

        }
        return TRUE;
    case WM_COMMAND:
        switch ( LOWORD ( wParam ) ) {
        case IDCANCEL:
            EndDialog ( hWnd, 0 );
            return TRUE;
        }
        break;
    // システムメニューに対応
    case WM_SYSCOMMAND:
        switch ( LOWORD ( wParam ) ) {
        case IDM_ABOUT:
            MessageBox ( hWnd,
                _TEXT ( "システムメニューのサンプルです。" ),
                _TEXT ( "システムメニュー" ),
                MB_OK | MB_ICONINFORMATION );
            return TRUE;
        }
        break;
    }

    return FALSE;
}

// エントリポイント
int WINAPI _tWinMain ( HINSTANCE hThisInstance,
    HINSTANCE,
    _TCHAR *,
    int )
{
    DialogBox ( hThisInstance,
        MAKEINTRESOURCE ( IDD_MAIN_DIALOG ),
        NULL,
        DialogFunc );

    return 0;
}
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita