「ファイル検索ツールを作ってみた – C++Builder好きの秘密基地」で公開されているファイル検索ツールのソースコードを読んで勉強します。
メインフォームのOnCreateイベントでウィンドウメニューにメニューを追加。
HMENU hMenu = GetSystemMenu(Handle, FALSE);
AppendMenu(hMenu, MF_SEPARATOR,0, NULL);
AppendMenu(hMenu, MF_STRING, ID_MENUITEM_HELP, _T("Help..."));
AppendMenu(hMenu, MF_STRING, ID_MENUITEM_ABOUT, _T("About..."));
GetSystemMenuでウィンドウメニュー(システムメニュー)のハンドルを取得し、AppendMenuでメニューを追加しています。
こうすることで、ウィンドウメニューに任意のメニューを追加することができます。
msdnを見ると、AppendMenu 関数はInsertMenuItem 関数に代わったようです。
この関数は InsertMenuItem 関数に取って代わられましたが、まだ使用できます。
InsertMenuItem関数を使うとこんな感じかな。とても面倒です。
MENUITEMINFO mi;
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIIM_ID | MIIM_TYPE;
mi.fType = MFT_STRING;
mi.wID = ID_MENUITEM_ABOUT;
mi.dwTypeData = _T("About...");
InsertMenuItem(hMenu, 7, TRUE, &mi);
なお、ID_MENUITEM_HELPとID_MENUITEM_ABOUTは定数として定義されています。
const int ID_MENUITEM_HELP = 128;
const int ID_MENUITEM_ABOUT = 129;
ウィンドウメニューに追加したメニューをクリックしたときのイベントの処理は、次のようになっています。
TfrmMain.hではメッセージハンドラを定義してます。
private:
void __fastcall OnSysCommand(TWMSysCommand& mess);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, OnSysCommand)
END_MESSAGE_MAP(TForm)
TfrmMain.cppで受け取ったメッセージの処理を実装しています。
void __fastcall TfrmMain::OnSysCommand(TWMSysCommand& mess)
{
switch (mess.CmdType) {
case ID_MENUITEM_ABOUT:
frmAbout->ShowModal();
break;
case ID_MENUITEM_HELP:
Application->HelpShowTableOfContents();
break;
default:
// デフォルトメニューの処理
TForm::Dispatch(&mess);
}
}
ということで、ウィンドウメニューにメニューを追加する処理を見ました。
次回に続く。
Pingback: ファイル検索ツールのソースコードを読んで勉強する(2) « 山本隆の開発日誌