duilib窗體最小化與還原時會有小的windows原生標題欄在左上角閃現一下,並且沒有動畫效果的解決辦法
阿新 • • 發佈:2018-11-05
標題略長,廢話不多說,先描述下現象。
當我們使用duilib開發窗體時,通過反覆點選在工作列的窗體圖示來使窗體不斷的最小化與還原,會發現原窗體位置左上角會有原生的windows的標題欄的東西閃過,雖然不明顯,而且消失速度很快,但是反覆測試仍然可以觀察到。同時,原有的最小化到工作列與還原是有一個過渡動畫效果,最小化時會看到是變小收縮,還原時是看到逐漸擴大還原,這個效果也沒有了。
測試官方demo也存在這樣的問題。
解決方法:
這個要感謝群中的K老闆,是由他分析測試的解決辦法。
在OnCreate裡面,之前通常是這樣
LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); styleValue &= ~WS_CAPTION; ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
這裡將窗體的WS_CAPTION屬性給幹掉了,這個屬性是窗體的標題欄屬性。一般包含這個屬性後,就會看到windows的原生標題欄了,所以通常都選擇幹掉這個屬性。
這裡要做的就是註釋掉styleValue &= ~WS_CAPTION;這一句,讓窗體具有WS_CAPTION屬性即可。如下
LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); //styleValue &= ~WS_CAPTION; ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
這樣,再反覆點選測試之前的窗體,果然就不會看到奇怪的東西閃過,而且也有了過渡動畫。
副作用:
經過初步測試,
1.窗體上面的兩個角會變為圓角(稍微有點鋸齒),不過感覺如果本來窗體就是圓角的,那麼就基本看不出來差別。
2.K老闆反饋說窗體在拉伸改變大小時,還是會看到原生標題欄。我這裡倒是沒發現,猜測可能是K老闆WM_NCACTIVATE,WM_NCCALCSIZE,WM_NCPAINT這三個訊息沒有被攔截掉,我這邊是有攔截的(不再傳遞給預設的視窗過程處理),測試沒發現問題。
case WM_NCACTIVATE: lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break; case WM_NCCALCSIZE: lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break; case WM_NCPAINT: lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;