在Qt中实现winevent时WM_PAINT必要的

is WM_PAINT necessary while implementing winevent in Qt

本文关键字:PAINT WM Qt 实现 winevent      更新时间:2023-10-16

我的Qt应用程序是从外部设备读取数据,对其进行分析,然后在屏幕上显示结果。由于我需要使用GUI,我选择了Qt而不是Winforms。我不知道该设备仅适用于Windows消息。该设备带有静态库和预定义功能。我能够从我的应用程序访问设备(并获取状态参数)。问题出在Windows消息上。我需要从设备读取缓冲区,并为该设备发送BUFFER_FULL消息。我为此使用了QWidget::winevent函数。我的实现如下所示。

在主窗口中。

virtual bool winEvent(MSG *message, long *result);

在主窗口中.cpp

bool MainWindow::winEvent(MSG *message, long *result)
{
switch(message->message)
{
case BUFFER_DONE:
    qDebug()<<"***---BUFFER_DONE---***";
    return 0;
case WM_PAINT:
    // TODO: set error
    qDebug()<<"***---WM_PAINT---***";
    return 1;
default:
    break;
}
}

在调试应用程序时,它会不断收到WM_PAINT消息。我还没有实现WM_PAINT消息。该应用程序没有任何可显示的内容,此时它几乎"暂停"。如果没有这个 winevent 实现,它向我展示了清晰的小部件。我认为绘画小部件将由Qt处理,我的理解是正确的还是我需要自己实现WM_PAINT?

WM_PAINT的默认处理会很好。它什么都不做,这是你想要的。但是,您并不真正想要此处的可视控件。我怀疑你想要的是一个仅消息窗口。这是通过将HWND_MESSAGE传递给CreateWindowEx hWndParent来创建的。我不确定Qt是否提供这样的功能,很可能没有。

你可以继续使用QWidget但对我来说似乎有点过分了。如果你继续QWidget那么你至少应该隐藏它。

请注意,我假设您的winEvent实现是正确的。你还没有全部展示出来。具体而言,您尚未显示为要接收默认处理的消息返回false的代码。

看来我的假设是错误的。您未能从winEvent返回值。只要启用警告,编译器就会发出警告。你必须这样做,然后注意警告。您的winEvent应该是:

bool MainWindow::winEvent(MSG *message, long *result)
{
    switch(message->message)
    {
    case BUFFER_DONE:
        qDebug()<<"***---BUFFER_DONE---***";
        return false;
    }
    return false;
}