【发布时间】:2017-07-24 15:55:54
【问题描述】:
我有一个继承自 MFC CMenu 类的菜单类:MyMenu : public CMenu。
MyMenu 从资源文件加载,然后更改为所有者绘制的菜单(使用来自CodeGuru 的代码示例,它适用于菜单项的样式)。现在我想激活菜单项左侧的复选框。
MyMenu menu;
menu.LoadMenu(IDR_MYCONTEXT_MENU);
MyMenu* subm = ef_cast<MyMenu*>(menu.GetSubMenu(0));
if (subm == nullptr) return;
subm->ChangeToOwnerDraw(*subm);
subm->CheckMenuItem(ID_COPY_ITEM, m_ItemCopied ? MF_CHECKED : MF_UNCHECKED);
subm->CheckMenuItem(ID_COPY_ITEM, MF_CHECKED); //Force visibility?
我希望复选框会出现,但它没有。 首先,我尝试使用来自MSDN 的代码示例使用 SetMenuItemBitmaps(...) 设置复选框位图:
int commandID = ID_COPY_ITEM;
CBitmap checkedBitmap;
checkedBitmap.Attach(MyMenu::GetMyCheckBitmaps(CHECK));
CBitmap uncheckedBitmap;
uncheckedBitmap.Attach(MyMenu::GetMyCheckBitmaps(UNCHECK));
SetMenuItemBitmaps(*subm, commandID, MF_BYCOMMAND, uncheckedBitmap, checkedBitmap);
subm->SetMenuItemBitmaps(commandID, MF_BYCOMMAND, &uncheckedBitmap, &checkedBitmap); //Same as previous line
那没有成功。然后我尝试根据a page on MSDN about the MENUITEMINFO struct调用SetMenuItemInfo来设置MENUITEMINFO:
MENUITEMINFO mItemInfo{};
mItemInfo.cbSize = sizeof(MENUITEMINFO);
mItemInfo.fMask |= MIIM_CHECKMARKS | MIIM_STATE;
mItemInfo.fState |= MFS_CHECKED | MFS_DEFAULT;
mItemInfo.hbmpChecked = MyMenu::GetMyCheckBitmaps(CHECK);
mItemInfo.hbmpUnchecked = MyMenu::GetMyCheckBitmaps(UNCHECK);
subm->SetMenuItemInfo(commandID, &mItemInfo, FALSE);
最后,为了确保菜单项实际上可以更改,我添加了一行
subm->ModifyMenu(ID_COPY_ITEM, MF_BYCOMMAND, ID_COPY_ITEM, reinterpret_cast<LPCTSTR>(&menuProperties));
...,这将导致使用指向 menuProperties 的 lpDrawItemStruct->itemData 调用 DrawItem:效果很好。
我的自绘菜单中仍然没有复选框。我错过了什么?如何在自绘的 MFC PopupMenu 中添加复选框?
【问题讨论】:
-
为什么要使用所有者绘制菜单?你用的是什么版本的VS? 6.0?如果 2008 带有功能包或更高版本,请查看 CMFCPopupMenu。
-
我正在使用 VS2015 使用旧代码库。我来看看 CMFCPopupMenu。
标签: c++ visual-c++ mfc ownerdrawn cmenu