【问题标题】:Where in Win32 C++ code to place SetMenuItemInfo() to enable/disable based on focus?在 Win32 C++ 代码中何处放置 SetMenuItemInfo() 以根据焦点启用/禁用?
【发布时间】:2012-07-02 00:04:01
【问题描述】:

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

我想在文本框控件中没有光标闪烁时——即文本框没有焦点时——禁用粘贴菜单项——因为当文本框不是“活动”控件,无法进行剪切/复制/粘贴操作。

我可以使用以下代码启用/禁用菜单项(正如我在创建菜单后立即将这个 sn-p 放置在 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 switch(msg) 部分中有一个 case 语句,这应该全部驻留在哪里?我仍在学习基本的 C++ Win32 程序结构。谢谢!

(PS 两个帮助我走到这一步的资源:@​​987654321@,How can I tell if a Window has focus? (Win32 API)

【问题讨论】:

    标签: c++ winapi menuitem paste


    【解决方案1】:

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

    【讨论】:

    • 谢谢,效果很好。我把它放在了我的 resource.h 文件中:#define WM_INITMENUPOPUP 0x0117 ... 以及我的主窗口回调函数 (LRESULT CALLBACK mainWndProc) 中的以下代码块——与 WM_CREATE、WM_PAINT 等一起:if(GetFocus() != hWndTextbox) { 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); }
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多