【发布时间】:2014-02-11 01:31:56
【问题描述】:
在我的 Qt 应用程序中,我使用 DwmExtendFrameIntoClientArea 在窗口内扩展 Aero Glass,并处理了 WM_NCCALCSIZE WinEvent 以在非客户区绘制 Qt 小部件。
另外,在我的应用程序中,我处理了WM_NCRBUTTONUP WinEvent 以在我的窗口客户区域内显示窗口系统(标题栏)菜单。
菜单有效,我的意思是,我可以通过该菜单恢复、最大化、最小化和关闭窗口,但是,有时菜单的启用项与窗口的状态不匹配,例如:有时该菜单不't 启用还原但启用已最大化的窗口上的最大化,而我对通过 Windows 任务栏显示的系统菜单没有问题
问题:如何正确显示与当前窗口状态匹配的菜单?
监听 WinEvents 的代码:
bool MainWindow::winEvent(MSG *msg, long *result)
{
HWND hWnd = msg->hwnd;
UINT message = msg->message;
WPARAM wParam = msg->wParam;
LPARAM lParam = msg->lParam;
bool retval = false;
LRESULT lRet = 0;
switch(message)
{
case WM_NCHITTEST:
{
lRet = HitTestNCA(hWnd, lParam);
DwmDefWindowProc(hWnd, message, wParam, lParam, &lRet);
retval = true;
break;
}
case WM_NCRBUTTONUP:
{
QPoint point = QCursor::pos();
HMENU menu = GetSystemMenu(hWnd, FALSE);
BOOL Selected = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, point.x(), point.y(), 0, hWnd, NULL);
if(Selected) PostMessage(hWnd, WM_SYSCOMMAND, Selected, 0);
break;
}
case WM_NCCALCSIZE:
{
retval = true;
break;
}
default:
break;
}
*result = lRet;
if(retval) return true;
return QMainWindow::winEvent(msg, result);
}
【问题讨论】:
标签: c++ windows qt contextmenu