gpt4 book ai didi

c++ - 在 CLinkCtrl 上按空格键后调用 TrackPopupMenu() 会导致发出警告消息蜂鸣声。为什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:13 24 4
gpt4 key购买 nike

请耐心等待。我必须向您提供我的设置。

我有一个带有系统链接控件的对话窗口 ( CLinkCtrl ):

enter image description here

可以单击以显示上下文菜单。

我现在正在尝试为用户设置一个辅助功能选项,让用户可以按空格键或按键盘上的回车键来显示上下文菜单:

enter image description here

我为此使用了 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 取自资源:

enter image description here

那么会发生什么:如果 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com