我正在使用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消息,但没有。
关于自定义标题栏(http://msdn.microsoft.com/en-us/library/bb688195%28VS.85%29.aspx#appendixb)的MSDN示例不讨论更改颜色。但也许与WM_NCPAINT消息有关。
答案 0 :(得分:7)
首先:您不需要直接调用nativeEvent
方法。这是Qt调用的回调。你可以覆盖它。
二。 Qt5中有known bugs处理nativeEvent
。所以要小心。但是,据我所知,只有本机子小部件存在问题。
第三。解决方案:创建自己的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;
}
};
答案 1 :(得分:2)
在寻找问题的解决方案后,我终于找到了this解决方案。这是使用Qt构建无边框窗口的一种非常好的方法,它看起来就像许多软件今天看起来一样(Adobe软件或MS Office)。谢谢你的支持。