Qt :: nativeEvent调用

Pat*_*rik 3 c++ qt

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

SkyFlies::SkyFlies()
{
  ...
  this->nativeEvent();
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何填写函数参数.我知道这听起来有点愚蠢,但我很困惑.

谢谢!

这是一个更新:

像LNK2019这样的错误未解决的外部符号...真的很糟糕!

当我搜索我的问题时,我找到了一个漂亮的代码来自定义窗口框架.我在我的代码中使用它并在修复编译器错误后,我得到了一个LNK 2019错误,DwmExtendFrameIntoClientArea函数这里是代码:头文件 -

#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

    ...
};
Run Code Online (Sandbox Code Playgroud)

实施档案 -

// 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
Run Code Online (Sandbox Code Playgroud)

请问,我该如何解决LNK2019问题?我试图在没有任何成功的情况下运行QMake.这是我的.pro文件:

QT += widgets

SOURCES += \
    main.cpp \
    SkyFlies.cpp

HEADERS += \
    SkyFlies.h \
    SkyWord.h
Run Code Online (Sandbox Code Playgroud)

SkyWord文件为空.谢谢

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

#pragma comment (lib,"Dwmapi.lib")
Run Code Online (Sandbox Code Playgroud)

在头文件中.确切地说,我通过标题栏扩展了一个窗口.现在我正在努力寻找一种方法来改变标题栏的颜色.但我没有看到任何令人满意的解决方案.我以为我可以处理WM_DWMCOLORIZATIONCHANGED消息,但没有.

关于自定义标题栏的MSDN示例(http://msdn.microsoft.com/en-us/library/bb688195%28VS.85%29.aspx#appendixb)不讨论更改颜色.但也许与WM_NCPAINT消息有关.

Dmi*_*nov 8

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

第二.Qt5中存在已知的处理错误nativeEvent.所以要小心.但是,据我所知,只有本机子小部件存在问题.

第三.解决方案:创建自己的QAbstractNativeEventFilter.提示,如何使用它(因为它没有详细记录):

QAbstractEventDispatcher::instance()->installNativeEventFilter(yourFilter);
Run Code Online (Sandbox Code Playgroud)
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;
    }
};
Run Code Online (Sandbox Code Playgroud)


Pat*_*rik 2

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