ファイル検索ツールのソースコードを読んで勉強する(1)

ファイル検索ツールを作ってみた – 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 関数に取って代わられましたが、まだ使用できます。

AppendMenu 関数

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);
  }
}

ということで、ウィンドウメニューにメニューを追加する処理を見ました。

次回に続く。

コメント

  1. Pingback: ファイル検索ツールのソースコードを読んで勉強する(2) « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください