Qt::nativeEvent calls

Qt::nativeEvent calls

本文关键字:calls nativeEvent Qt      更新时间:2023-10-16

我正在使用Windows 8 x64笔记本电脑。用Qt5。我在处理非客户区域的颜色(尤其是色框)时遇到了一些困难。我没有找到一些易于使用的功能或流程来做到这一点。我发现要处理的标题栏颜色的DWM消息是WM_DWMCOLORIZATIONCOLORCHANGED,我想修改它的wParam变量以设置新的颜色。

目前,我正在尝试将框架扩展到客户端区域,在nativeEvent函数的实现中使用QtWin::extendFrameIntoClientArea函数。如下所示:

bool SkyFlies::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
  Q_UNUSED(result);
  Q_UNUSED(eventType);
  MSG *msg = static_cast<MSG*>(message);
  if(msg->message == WM_ACTIVATE)
  {
     const QMargins marge(-1, -1, -1, -1);
     QtWin::extendFrameIntoClientArea(this, marge);
  }
  return false;
}

我的问题如下:在我想调用前面函数的代码中

SkyFlies::SkyFlies()
{
  ...
  this->nativeEvent();
  ...
}

我想知道如何填充函数参数。我知道这听起来有点愚蠢,但我还是坚持了下来。

谢谢!

这是一个更新:

错误,如LNK2019未解析的外部符号。。。真糟糕!!!

当我在谷歌上搜索我的担忧时,我发现了一个很好的代码来定制窗框。我在代码中使用了它,在修复编译器错误后,我得到了DwmExtendFrameIntoClientArea函数的LNK 2019错误这是代码:头文件-

#include <QtWidgets>
#ifdef Q_OS_WIN
#include <Windows.h>
#include <WinUser.h>
#include <windowsx.h>
#include <dwmapi.h>
#include <minmax.h>
#include <gdiplus.h>
#include <gdipluscolor.h>
#endif
class SkyFlies : public QMainWindow
{
    Q_OBJECT
    ...
    void showEvent(QShowEvent *event);  // Manage window borders
    void windowBorderless();    // Show a borderless window for Windows system
    void windowShadow();    // Set shadow border effect
    ...
};

实现文件-

// Manage window borders
void SkyFlies::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
#ifdef Q_OS_WIN
    this->windowBorderless();
#endif
}
#ifdef Q_OS_WIN
void SkyFlies::windowBorderless()
{
    if(this->isVisible())
    {
        SetWindowLongPtr((HWND)winId(), GWL_STYLE, WS_POPUP | WS_CAPTION | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
        this->windowShadow();
        SetWindowPos((HWND)winId(), 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
    }
}
void SkyFlies::windowShadow()
{
    const MARGINS shadow={1, 1, 1, 1};
    HRESULT hr = S_OK;
    hr = DwmExtendFrameIntoClientArea((HWND)winId(), &shadow);
}
#endif

请问,我如何解决LNK2019问题?我试着运行QMake,但没有成功。这是我的.pro文件:

QT += widgets
SOURCES += 
    main.cpp 
    SkyFlies.cpp
HEADERS += 
    SkyFlies.h 
    SkyWord.h

SkyWord文件为空。感谢

作为另一个更新,我刚刚阅读了最后一个答案,我在几个小时前通过添加修复了链接器问题

#pragma comment (lib,"Dwmapi.lib")

在头文件中。最终,我得到了一个通过标题栏扩展的窗口。现在我正努力想办法改变标题栏的颜色。但我看不到任何令人满意的解决方案。我以为我可以处理WM_DWMCOLORIZATIONCHANGED消息,但没有。

MSDN中关于自定义标题栏的示例(http://msdn.microsoft.com/en-us/library/bb688195%28VS.85%29.aspx#appendixb)不要谈论改变颜色。但是,WM_NCPAINT消息可能有一些问题需要处理。

首先:不需要直接调用nativeEvent方法。这是一个由Qt调用的回调。你可以覆盖它。

第二。在处理nativeEvent的Qt5中存在已知的错误。所以要小心。但是,正如我所知,只有本地子窗口小部件才有问题。

第三。解决方案:创建自己的QAbstractNativeEventFilter。提示,如何使用它(因为它没有很好的文档):

QAbstractEventDispatcher::instance()->installNativeEventFilter(yourFilter);

class MyEventFilter
    : public QAbstractNativeEventFilter
{
public:
    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE
    {
        MSG *msg = static_cast< MSG * >( message );
        // TODO: filter out or modify msg struct here
        // ...
        return false;
    }
};

在寻找问题的解决方案后,我终于找到了这个解决方案。这是一个非常好的方法来建立无边界窗口使用Qt,看起来像今天的许多软件一样(Adobe软件或MS Office)。感谢您的支持。