簡體   English   中英

無框Qt窗口中的窗口繪制行為錯誤(win32)

[英]Wrong window painting behaviour in frameless Qt window (win32)

我有一個QML應用程序(也QWidgets進行了測試,同樣的問題),並使其無國界(但仍支持原生的WM功能,如Aero對齊等),我跟着這個通過實施QAbstractNativeEventFilter和應對WM_NCCALSIZE信號零:

switch(msg->message) {
  case WM_NCCALCSIZE:
    *r = 0;
    return 1;
    ...
}

我還設置了一些不在Qt命名空間中的窗口標志

SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME);

這工作正常,直到我移動或調整窗口大小導致Qt重新渲染和未上漆的區域寬度標題和邊框的寬度出現:

在移動/調整大小之前 之前

移動/調整大小后 后

我還通過在Qt中添加FramelessWindowHint標志找到了解決方法:

window->setFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::Dialog);

但是現在當窗口狀態發生變化(最大化,最小化,......)時,這個邊距會再次出現。 通過阻止WM_SIZE事件,例如當SIZE_MAXIMIZED是參數時,邊距不會出現但是我也無法從Qt最大化窗口。 這意味着它是Qt方面的問題。

我還注意到通過winspector檢查窗口樣式,在我最大化它之后會出現一個新的屬性原子:

winspector截圖

你能幫我解決這個問題嗎?

我認為在你的窗口句柄上使用SetWindowLong並使用Qt Window Flags / Qt Widget屬性會遇到麻煩。 您可以查看Qt源以查看處理這些窗口標志時會發生什么。

當我創建無框窗戶時,我通常會這樣做以防止移動和調整大小,因為我正在單獨管理所有這些。

我遇到的一個問題是,當屏幕鍵盤出現並停靠時,它會調整窗口的大小。 因此,除了調用resize()之外,我還必須使用setFixedSize來防止在操作系統嘗試更改窗口大小時操作窗口小部件。

所以換句話說,如果你正在管理一個無框窗口,我會添加一個應用程序范圍的QShortcut ,監聽捕捉鍵盤快捷鍵並按照你想要它的方式調整窗口大小。

希望有所幫助。

我想知道這是否是Qt消息中繼的缺陷,因為我遇到了嵌套窗口上發生的類似問題。 如果按父窗口的SIZE_MAXIMIZE或SIZE_MINIMIZE按鈕,子窗口有時無法接收WM_SIZE消息。 我想大概有兩種解決方案:1。修復Qt,2。解決它。

這里我有一個OGL渲染子窗口,有時甚至沒有正確傳遞WM_SIZE消息。 也就是說,如果您調整父窗口的大小,則會使客戶區的一部分變黑。

我只是使用一個簡單的解決方法來解決這個問題,它使用緩存的方法檢查當前大小,然后自己調整大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM