【发布时间】:2013-06-12 22:30:42
【问题描述】:
我的应用程序有一个 QLineEdit 和一个 QPushButton 不能正确响应键盘和鼠标的输入(QLineEdit 没有接收到键盘输入,QLineEdit 和 QPushButton 都没有接收到鼠标输入)当我的应用处理这些 Windows 事件时:
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 = true;
LRESULT lRet = 0;
switch(message)
{
case WM_PAINT:
{
HDC hDC = GetWindowDC(hWnd);
PaintCustomCaption(hWnd, hDC); //Method responsible to draw the image at the non client area
DeleteDC(hDC);
break;
}
case WM_NCHITTEST:
{
lRet = HitTestNCA(hWnd, lParam); //Method responsible to deal with the window resizing and moving
DwmDefWindowProc(hWnd, message, wParam, lParam, &lRet);
break;
}
case WM_NCCALCSIZE:
{
break;
}
default:
{
retval = false;
DwmDefWindowProc(hWnd, message, wParam, lParam, &lRet);
break;
}
}
*result = lRet;
if(retval) return true;
return QWidget::winEvent(msg, result);
}
如果我删除此类代码,我的 Qt 小部件可以正常工作,但我需要这些代码,因为我的应用正在窗口的非客户区绘制图像。
是否可以处理上面列出的 Windows 事件以保持我的 Qt 小部件对键盘和鼠标的响应?
【问题讨论】:
-
我会尝试的第一件事是删除
WM_NCHITTEST(可能还有default:case),看看是否有任何改变。我怀疑由于某种原因,您的事件可能会因为在到达您的控件之前到达非客户区而被丢弃。顺便说一句,为什么您的default:案例调用DwmDefWindowProc? -
通过删除所有
switch,我的控件再次变得响应,但问题是:我需要在非客户区绘制图像。 -
我并不是指所有这些——我只是指
WM_NCHITTEST的情况。稍后你会担心它是否能满足你的需要——这只是为了弄清楚你的控件为什么会冻结。如果在删除这个特定的case后它们会解冻,你就会知道你的WM_NCHITTEST响应是问题的根源。 -
@j_kubik 这是我的结果:通过删除
WM_NCHITTEST:控件保持无响应。通过删除WM_NCCALCSIZE也:控件保持无响应。通过从switch中删除WM_NCHITTEST、WM_NCCALCSIZE和WM_PAINT:控件完全负责,但没有图像绘制。
标签: c++ qt qlineedit qpushbutton