2014-10-30 102 views
2

我正在使用Windows 8 x64筆記本電腦。用Qt5開發。 我處理非客戶區顏色(特別是顏色框)有一些困難。 我沒有找到一些易於使用的功能或流程來做到這一點。我發現要處理標題欄顏色的DWM消息是WM_DWMCOLORIZATIONCOLORCHANGED,我想修改其wParam變量以設置新的顏色。Qt :: nativeEvent調用

現在我試圖擴展框架到客戶區,在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

你可以畫畫,你想要達到什麼目的?負邊距的設置看起來很奇怪。 – 2014-10-30 16:26:54

+0

嗨德米特里,我閱讀你的答案,我正在努力。謝謝。我想要做的是構建像Adobe或Office界面的東西。對於-1邊距,我使用了Qt5中記錄的extendFrameIntoClientArea函數的推薦值。 – Patrik 2014-10-31 11:17:33

+0

不要忘記設置正確的Windows版本(在定義WINVER中)並鏈接必要的庫以支持DWM。可能會解決你的鏈接器錯誤。 – 2014-10-31 14:13:13

回答

2

尋找一個解決我的問題後,我終於找到this解決方案。這是一種使用Qt構建無邊界窗口的非常好的方法,它看起來像許多軟件的外觀,就像Adobe軟件或MS Office一樣。感謝你的支持。

6

第一:你不需要直接調用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; 
    } 
};