2017-10-17 169 views
-1

由於我在使用後出現問題WX_EX_COMPOSITED由於與報表類型設置不兼容,我不得不關閉它。調整TAB控件閃爍問題

Disabling desktop composition causes flickering on Tab Control

現在,每當我與響應消息中的任何一個調整的主對話框一起調整TAB控制WM_SIZE,WM_SIZING,WM_WINDOWPOSCHANGED消息

invoke GetClientRect,hWnd,addr CLRECT 
LEA EAX, CLRECT 
invoke MoveWindow,MainTabHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,TRUE 

有很多的使用TAB控件閃爍。

我已經關閉了WM_ERASEBKGND消息通過返回true來默認的窗口過程。

.elseif uMsg == WM_ERASEBKGND 
      MOV EAX,1 
      RET 

,並使用在這篇文章中我已經從微軟閱讀處理我自己的WM_PRINT消息。

https://msdn.microsoft.com/en-us/library/ms969905.aspx

WM_PRINT消息處理機

invoke BeginPaint,hWnd,addr PS 
invoke Paint,hWnd,addr PS 
invoke EndPaint,hWnd,addr PS ;PS is just a LOCAL PAINTSTRUCT structure used for painting 

塗料過程後,我移植它從C++來MASM

Paint Proc hWnd:DWORD, pPAINTSTRUCT:PPAINTSTRUCT 
LOCAL rc:RECT ; 
LOCAL hdcMem:HDC ; 
LOCAL hBITMAP:HANDLE 
LOCAL hbmMem:HANDLE 
LOCAL hbmOld:HANDLE 

LOCAL hbrBkGnd:HBRUSH ; 
LOCAL hfntOld:HFONT ; 


invoke GetClientRect,hWnd,addr rc 
MOV EAX,pPAINTSTRUCT 
invoke CreateCompatibleDC,[EAX].PAINTSTRUCT.hdc 
MOV hdcMem ,EAX 
MOV EAX,pPAINTSTRUCT 

invoke CreateCompatibleBitmap,[EAX].PAINTSTRUCT.hdc,rc.right,rc.bottom 
MOV hbmMem,EAX 
invoke SelectObject,hdcMem,hbmMem 
MOV hbmOld,EAX 
invoke GetSysColor,COLOR_WINDOW 
invoke CreateSolidBrush,EAX 
MOV hbrBkGnd,EAX 
invoke FillRect,hdcMem,addr rc,hbrBkGnd 
invoke DeleteObject,hbrBkGnd 

.if hfnt 
    invoke SelectObject,hdcMem,hfnt 
    MOV hfntOld,EAX 
.endif 



invoke SetBkMode,hdcMem,TRANSPARENT 
invoke GetSysColor,COLOR_WINDOWTEXT 
invoke SetTextColor,hdcMem,EAX 


invoke DrawText,hdcMem,addr szCaption,-1,addr rc,DT_CENTER 


    invoke SelectObject,hdcMem,hfntOld 


MOV EAX,pPAINTSTRUCT 
LEA EBX,rc 
MOV EDX,[EBX].RECT.right 
SUB EDX,[EBX].RECT.left 

MOV ECX,[EBX].RECT.bottom 
SUB ECX,[EBX].RECT.top 

invoke BitBlt,[EAX].PAINTSTRUCT.hdc,rc.left,rc.top,EDX,ECX,hdcMem,0, 0,SRCCOPY 
invoke SelectObject,hdcMem, hbmOld 

invoke DeleteObject,hbmMem; 
invoke DeleteDC,hdcMem; 

的畫圖功能似乎因爲如果我省略很好地工作調用它時,在調整大小以擴大主對話框的寬度時,會出現繪圖問題,新區域爲j烏斯特黑色。但是如果我調用paint,那麼調整大小後的新區域會被正確繪製。但是有大量的閃爍。

我有3個對話框之一就是通過DialogBoxParam API調用的主對話框

另2只是無模式對話框(無標題和它的樣式設置爲DS_SYSMODAL)這些對話框將通過CreateDialogParam API調用附加到TAB控件每個人都有自己獨特的DlgProc

現在我該怎麼做才能避免控制調整大小閃爍?我應該對要調整大小的控件進行子分類嗎?併爲每個控件單獨禁用WM_ERASEBKGND

正在禁用WM_ERASEBKGND消息只需在主對話框或所有無模式對話框中完成?

任何人都可以幫助解決這個問題?

+0

我找到了解決方法,在標籤控件上使用WS_EX_COMPOSITED標誌而不是在對話框本身上,並在主對話框中使用WS_CLIPCHILDREN。這改變了標籤大小時的閃爍問題。但是現在,子控件無法正確渲染,並且在調整選項卡大小後它們正在消失。在WM_SIZING消息我使用MoveWindow api在bRepaint設置爲true的選項卡控件上我將如何使子控件在調整大小後正確繪製而不會丟失? –

回答

0

問題是通過使用上列表視圖的setparent和父集是主對話而不是子對話和標籤之間切換時固定到點擊其它標籤比列表視圖選項卡我基本上使用的setparent再次返回父的列表視圖的子對話框,所以代碼仍然隱藏它與ShowWindow。現在Listview總是顯示在最上面。即使WM_ERASEBKGND未禁用,也不會閃爍。現在我可以有WS_EX_COMPOSITED標誌坐在列表視圖,標籤控件和主對話框,而不會出現報表類型的不可見框架的問題。我認爲主要問題是因爲使用從下到上的繪圖方法的雙緩衝。

+0

這仍然是一個單獨的問題,從你以前的https://stackoverflow.com/questions/46760792/disabling-desktop-composition-causes-flickering-on-tab-control,或者這應該作爲一個重複關閉? (我不會做Windows GUI,所以我沒有嘗試真正閱讀或理解問題或答案,我只是看到它們看起來非常相似。)感謝您在SO上分享您的問題的解決方案;我只是想保持這個地方乾淨整潔:) –

+0

嗨,朋友。您可以關閉任一問題。類似的是對不起。 –

+0

不要擔心,有時候你會覺得某件事是一個單獨的問題,事實證明它不是。 –