4

MFCダイアログベースのアプリケーションには、Visual Studioリソースエディターで作成されたメインメニューがあり、1つの場所に、実行時に作成された動的メニューがあります。次の画像に示すように、Visual Studioで作成されたメニューのすべての部分はモダンな外観であり、動的に作成されたサブメニューは古い外観です。

ここに画像の説明を入力してください

動的サブメニューを作成するための私のコードは次のようなものです(実際のコードではありませんが、実際のコードはそれほど重要ではありません):

CMenu subMenu;
subMenu.CreateMenu();

for (...)
{
    subMenu.AppendMenu(
        MF_STRING | (isChecked ? MF_CHECKED : MF_UNCHECKED),
        <some menu ID>,
        <some menu text>);
}

このサブメニューをそれが属する場所に挿入するには、次のようにします(ほとんど実際のコード)。

TCHAR szMenuString[256];
MENUITEMINFO mii;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS |
    MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
mii.dwTypeData = szMenuString;
mii.cch = sizeof(szMenuString) / sizeof(szMenuString[0]);

GetMenu()->GetMenuItemInfo(ID_SUBMENU, &mii);
mii.fMask |= MIIM_SUBMENU;
mii.hSubMenu = subMenu.GetSafeHmenu();
GetMenu()->SetMenuItemInfo(ID_SUBMENU, &mii);

サブメニューを作成して、メインメニューの他の部分と同じスタイルで表示するにはどうすればよいですか?

私のコードはMFCで書かれていますが、あなたの答えはMFCである必要はありません(そしておそらくそうではありません)。

4

1 に答える 1

1

私は解決策を発見しましたが、何が起こっているのか本当に理解していません。解決策は、関数の最後でのデストラクタの呼び出しを防ぐことDestroyMenuです。subMenuこれは、を呼び出すか、へのポインタをsubMenu.Detach()作成することによって行われます。subMenuCMenu

私が理解していないのは、なぜDestroyMenu新しいスタイルのメニューを古いスタイルに変えているのかということです。メニューが破棄されて表示されないか、コピーされSetMenuItemInfoてスタイルが保持されると思います。これに答えを提供する人は誰でも私の投票を得ます:)

Detachまた、ここに電話してリソースリークが発生しているのか、メインメニューと一緒に動的サブメニューが破棄されているのかを知りたいです。ポイントは答えを提供する人を待っています。

于 2012-09-13T10:14:03.133 に答える