在Win32 C ++代码中放置SetMenuItemInfo()以基于焦点启用/禁用?

时间:2012-07-02 00:04:02

标签: c++ winapi menuitem paste

我正在为VS 2010 Pro中的Win32编写C ++应用程序。该应用包含一个带有粘贴项的修改菜单,该应用的主窗口包含一个文本框控件。所有常规的剪切/复制/粘贴命令在该控件中都能很好地工作 - 这恰好是应用程序唯一的用户可编辑字段。

我希望在文本框控件中没有光标闪烁时禁用粘贴菜单项 - 也就是说,当文本框没有焦点时 - 因为文本框时不是“活动”控件,不能执行剪切/复制/粘贴操作。

我可以使用以下代码启用/禁用菜单项(因为我已经通过在创建菜单后将此代码段放置在WM_CREATE内作为测试进行测试)。我不知道在我的程序中将代码放在何处,以便在正常的用户事件过程中调用它 - 比如鼠标点击 - 这会使焦点远离/返回到文本框。

MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, ID_EDIT_PASTE, FALSE, &mii);
mii.fState ^= MFS_DISABLED;
SetMenuItemInfo(hMenu, ID_EDIT_PASTE, FALSE, &mii);

将代码放置在正确的位置后,我计划将其嵌入 if 语句中,以便仅在应用程序的文本框没有焦点时才运行(禁用菜单项) :

if(GetFocus() != hWndTextbox)

也许在我的 CALLBACK开关(msg)部分中有一个 case 语句,它应该全部驻留在哪里?我还在学习基本的C ++ Win32程序结构。谢谢!

(PS帮助我做到这一点的两个资源:An examination of menus from a beginner's point of viewHow can I tell if a Window has focus? (Win32 API)

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找WM_INITMENUPOPUP。当即将显示菜单时发送,这样您就可以进行必要的检查并适当地启用/禁用菜单项。

答案 1 :(得分:0)

所以你想在编辑控件没有焦点/失焦时禁用菜单吗?

在你的WndProc中,编辑控件以WM_COMMAND的形式发送通知,你会感兴趣的是: EN_KILLFOCUS - 当控件失去键盘焦点时 EN_SETFOCUS - 当控件获得键盘焦点时。