내 앱이 키보드 및 마우스의 입력에 올바르게 응답하지 않는 QLineEdit
및 QPushButton
이 있습니다. QLineEdit
은 키보드 입력을 수신하지 않으며 QLineEdit
과 QPushButton
은 내 Windows 이벤트를 처리 할 때 마우스 입력을 수신하지 않습니다. :Windows 이벤트를 처리하는 동안 키보드 및 마우스에 응답하는 Qt 위젯을 유지하는 방법은 무엇입니까?
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'를 호출합니까? –
모든 스위치를 제거하면 컨트롤이 다시 반응하지만 문제는 다음과 같습니다. 비 클라이언트 영역에서 이미지를 그려야합니다. –
나는 그 모든 것을 의미하지는 않는다. - 나는 단지 WM_NCHITTEST로 그 사건을 의미했다. 나중에 당신이 필요로하는 일을한다면 걱정할 것입니다. 이것은 당신의 통제가 왜 멈추는 지 알아내는 것입니다. 이 특별한'case'를 제거한 후에 해제하면,'WM_NCHITTEST' 응답이 문제의 근원임을 알게 될 것입니다. –