スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MFCのメニュー階層を取得するサンプルコード

MFCのメニューのハンドリングの練習を兼ねて、メニューのツリーをデバッグ出力する
機能を作ってみました。


早速ですが、サンプルコード

//! 現在のウィンドウのメインメニューのメニュー階層をデバッグ出力する
void CMainFrame::PlotCurrentWndMainMenuTree(void)
{
    CWnd* pMain = AfxGetMainWnd();
    if (pMain == NULL)
        return;

    CMenu* pMenu = pMain->GetMenu();
    if (pMenu == NULL)
        return;

    PlotMenuTree(pMenu, _T(""));
}

//! 指定メニュー, および下層のメニュー階層をデバッグ出力する
void CMainFrame::PlotMenuTree(CMenu* menu, CString indent)
{
    int num_sub = menu->GetMenuItemCount();
    for (int i = 0; i < num_sub; ++i)
    {
        PlotSubmenuCaption(menu, i, indent);

        CMenu* m = menu->GetSubMenu(i);
        if (m != NULL)
            PlotMenuTree(m, indent + _T("\t"));
    }
}

//! 指定メニューのサブメニューのキャプションをデバッグ出力する
void CMainFrame::PlotSubmenuCaption(CMenu* menu, int submenu_idx, CString indent)
{
    CString s = GetSubmenuCaption(menu, submenu_idx);
    if (s == "")
        OutputDebugString(indent + _T("---- SEPARATOR ----\n"));
    else
        OutputDebugString(indent + s + _T("\n"));
}

//! 指定したメニューのサブメニューのキャプションを取得する
CString CMainFrame::GetSubmenuCaption(CMenu* parnet, int child_idx)
{
    static const int cache_len = 1024;
    TCHAR s[cache_len];
    parnet->GetMenuString(child_idx, s, cache_len, MF_BYPOSITION);
    return s;
}



で、これを下記のようなMFCのスケルトンに対して適用すると、


snapshot_271_140504_134039.png


次のような文字列がデバッグ出力に表示されます。

ファイル(&F)
    新規作成    Ctrl+N(&N)
    開く...    Ctrl+O(&O)
    上書き保存    Ctrl+S(&S)
    名前を付けて保存(&A)...
    ---- SEPARATOR ----
    印刷...    Ctrl+P(&P)
    印刷プレビュー(&V)
    プリンタの設定(&R)...
    ---- SEPARATOR ----
    最近使ったファイル
    ---- SEPARATOR ----
    アプリケーションの終了(&X)
編集(&E)
    元に戻す    Ctrl+Z(&U)
    ---- SEPARATOR ----
    切り取り    Ctrl+X(&T)
    コピー Ctrl+C(&C)
    貼り付け    Ctrl+V(&P)
表示(&V)
    ツール バー(&T)
    ステータス バー(&S)
ヘルプ(&H)
    バージョン情報 MFC_MenuTest(&A)...
Test
    PlotMenuTree



どうにもMFCというのは意味不明な設計になっているとしか思えない部分が多数あるように感じてしまいます。

たとえば、今回非常に以外に思ったのは、MFCではCMenuというクラスがメニューを表しているようなのですが、
メニューのキャプションを取得する場合、そのオブジェクトが表すテキストは表示できず、上記例の
CMainFrame::GetSubmenuCaption
のように、CMenuの親メニュー経由でしか情報を取得できないようです。


スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。