由于我在使用后出现问题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的选项卡控件上我将如何使子控件在调整大小后正确绘制而不会丢失? –