由於我在使用後出現問題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消息只需在主對話框或所有無模式對話框中完成?
任何人都可以幫助解決這個問題?
我找到了解決方法,在標籤控件上使用WS_EX_COMPOSITED標誌而不是在對話框本身上,並在主對話框中使用WS_CLIPCHILDREN。這改變了標籤大小時的閃爍問題。但是現在,子控件無法正確渲染,並且在調整選項卡大小後它們正在消失。在WM_SIZING消息我使用MoveWindow api在bRepaint設置爲true的選項卡控件上我將如何使子控件在調整大小後正確繪製而不會丟失? –