作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
请耐心等待。我必须向您提供我的设置。
我有一个带有系统链接控件的对话窗口 ( CLinkCtrl ):
可以单击以显示上下文菜单。
我现在正在尝试为用户设置一个辅助功能选项,让用户可以按空格键或按键盘上的回车键来显示上下文菜单:
我为此使用了 NM_RETURN
通知:
LRESULT CTestMfcLinkCtrlDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == WM_NOTIFY)
{
NMHDR* pNmhdr = (NMHDR*)lParam;
if(pNmhdr->code == NM_RETURN)
{
showMenu();
}
}
return CDialogEx::WindowProc(message, wParam, lParam);
}
菜单本身显示如下:
void CTestMfcLinkCtrlDlg::showMenu()
{
HMENU hMMenu = LoadMenu(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDR_MENU1));
HMENU hMenu = GetSubMenu(hMMenu, 0);
if(hMenu)
{
HWND hParentWnd = this->GetSafeHwnd();
CWnd* pW = this->GetDlgItem(IDC_SYSLINK1);
CRect rcW;
pW->GetWindowRect(&rcW);
UINT iCmdRes = ::TrackPopupMenu(hMenu,
TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_VERPOSANIMATION | TPM_HORPOSANIMATION | TPM_RETURNCMD,
rcW.left, rcW.bottom,
0, hParentWnd, NULL);
switch(iCmdRes)
{
//...
}
}
DestroyMenu(hMMenu);
}
IDR_MENU1
取自资源:
那么会发生什么:如果 system-link
控件有键盘焦点,请按空格键或键盘上的 enter(返回)键。将显示我的上下文菜单,但同时您会听到消息提示音,类似于 MB_ICONWARNING
参数。我进行了一些调试,这条消息蜂鸣声来自 TrackPopupMenu
调用。
知道它为什么这样做以及如何防止发出警告蜂鸣声吗?
这是 link到我正在测试它的 VS2017 MFC 解决方案。
最佳答案
响应 WM_CHAR
消息打开弹出菜单。似乎在 WM_CHAR
完全处理之前打开了菜单。因此弹出菜单接收到相同的 WM_CHAR
消息。菜单不知道如何使用该键并发出恼人的哔哔声。
如果在菜单打开时按空格键,您会听到相同的哔声。
解决方法,先运行默认函数:
LRESULT CMyDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lres = CDialogEx::WindowProc(message, wParam, lParam);
if(message == WM_NOTIFY)
{
NMHDR* pNmhdr = (NMHDR*)lParam;
if(pNmhdr->code == NM_RETURN)
{
showMenu();
}
}
return lres;
}
或者,执行此操作以响应 ON_NOTIFY
,但请确保使用
PeekMessage(&msg, NULL, WM_CHAR, WM_CHAR, PM_REMOVE);
示例:
void CMyDialog::showMenu()
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu());
CMenu *popup = menu.GetSubMenu(0);
ASSERT(popup);
CRect rc;
CWnd *syslink = GetDlgItem(IDC_SYSLINK1);
ASSERT(syslink);
syslink->GetWindowRect(&rc);
MSG msg;
if (::PeekMessage(&msg, NULL, WM_CHAR, WM_CHAR, PM_NOREMOVE))
AfxGetThread()->PumpMessage();
UINT iCmdRes = popup->TrackPopupMenu(
TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_VERPOSANIMATION | TPM_HORPOSANIMATION | TPM_RETURNCMD,
rc.left, rc.bottom, this);
switch(iCmdRes)
{
//...
}
}
关于c++ - 在 CLinkCtrl 上按空格键后调用 TrackPopupMenu() 会导致发出警告消息蜂鸣声。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53862013/
我是一名优秀的程序员,十分优秀!