システムメニューに独自メニューアイテムを追加するには
ウィンドウのタイトルバーの左上のアイコンをクリックしたときに表示されるメニューをシステムメニューといいます。
このメニューにメニューアイテムを追加するためには、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;
}
|
|