调整TAB控件闪烁问题

问题描述:

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

问题是通过使用上列表视图的setparent和父集是主对话而不是子对话和标签之间切换时固定到点击其它标签比列表视图选项卡我基本上使用的setparent再次返回父的列表视图的子对话框,所以代码仍然隐藏它与ShowWindow。现在Listview总是显示在最上面。即使WM_ERASEBKGND未禁用,也不会闪烁。现在我可以有WS_EX_COMPOSITED标志坐在列表视图,标签控件和主对话框,而不会出现报表类型的不可见框架的问题。我认为主要问题是因为使用从下到上的绘图方法的双缓冲。

+0

这仍然是一个单独的问题,从你以前的https://*.com/questions/46760792/disabling-desktop-composition-causes-flickering-on-tab-control,或者这应该作为一个重复关闭? (我不会做Windows GUI,所以我没有尝试真正阅读或理解问题或答案,我只是看到它们看起来非常相似。)感谢您在SO上分享您的问题的解决方案;我只是想保持这个地方干净整洁:) –

+0

嗨,朋友。您可以关闭任一问题。类似的是对不起。 –

+0

不要担心,有时候你会觉得某件事是一个单独的问题,事实证明它不是。 –