1. 程式人生 > >duilib窗體最小化與還原時會有小的windows原生標題欄在左上角閃現一下,並且沒有動畫效果的解決辦法

duilib窗體最小化與還原時會有小的windows原生標題欄在左上角閃現一下,並且沒有動畫效果的解決辦法

標題略長,廢話不多說,先描述下現象

當我們使用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;