2017-10-17 11 views
-1

En raison du problème rencontré après mon utilisation WX_EX_COMPOSITED J'ai été forcé de le désactiver car il n'était pas compatible avec la liste avec le type de rapport défini.Redimensionnement du problème de scintillement du contrôle TAB

Disabling desktop composition causes flickering on Tab Control

Maintenant, chaque fois que je remets à la côte le contrôle TAB avec le redimensionnement de la fenêtre principale en réponse à une des messages WM_SIZE, WM_SIZING, WM_WINDOWPOSCHANGED messages

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

Il y a beaucoup de scintillement aller avec le contrôle TAB.

J'ai déjà désactivé le message WM_ERASEBKGND en renvoyant true à la procédure de fenêtre par défaut.

.elseif uMsg == WM_ERASEBKGND 
      MOV EAX,1 
      RET 

et la manipulation un message WM_PRINT moi-même en utilisant cet article que j'ai lu de Microsoft.

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

WM_PRINT gestionnaire de messages

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 

procédure de peinture après je l'ai porté de C++ pour 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; 

La fonction de la peinture semble fonctionner correctement car si j'omettez le appel à il, il y a un problème de dessin lors du redimensionnement pour étendre la largeur de la boîte de dialogue principale de la nouvelle zone est j Je suis noir. Mais si j'appelle la peinture, la nouvelle zone après le redimensionnement est dessinée correctement. Mais il y a énormément de scintillement.

J'ai 3 boîtes de dialogue on est la boîte de dialogue principale invoquée par DialogBoxParam API

Et les 2 autres sont tout simplement modales boîtes de dialogue (sans légende et son style est réglé sur DS_SYSMODAL) ces boîtes de dialogue sera joint à la commande TAB par CreateDialogParam appel API chacun a son propre unique, DlgProc.

Maintenant, que dois-je faire pour éviter le contrôle de redimensionnement scintillement? devrais-je faire sous-classer le contrôle que je veux redimensionner? et désactiver WM_ERASEBKGND pour chaque contrôle individuellement?

invalidante la WM_ERASEBKGND un message doit être fait que dans la boîte de dialogue principale ou pour toutes les boites de dialogue modales ainsi?

Quelqu'un pourrait aider à ce sujet?

+0

J'ai trouvé un moyen de contourner cela en utilisant l'indicateur WS_EX_COMPOSITED sur le contrôle de tabulation au lieu de sur la boîte de dialogue elle-même et d'utiliser le WS_CLIPCHILDREN dans la boîte de dialogue principale. Cela a corrigé le problème de scintillement lors du redimensionnement de l'onglet. Cependant maintenant les contrôles enfants ne sont pas correctement rendus et ils disparaissent après avoir redimensionné l'onglet. Sur le message WM_SIZING j'utilise MoveWindow api sur le contrôle de tabulation avec bRepaint mis à true comment puis-je faire dessiner correctement les contrôles enfants sans être perdu après le redimensionnement? –

Répondre

0

problème est résolu en utilisant SetParent sur Listview et le jeu de parent est le dialogue principal à la place de la boîte de dialogue secondaire et lors de la commutation entre les onglets de cliquer sur un autre onglet de l'onglet listview i essentiellement utilisé SetParent à nouveau pour revenir au parent de listview dans le sous-dialogue de sorte que le code le cache toujours avec ShowWindow. Maintenant, la liste apparaît toujours en haut. Pas de scintillement du tout même si le WM_ERASEBKGND n'est pas désactivé. Maintenant, je peux avoir WS_EX_COMPOSITED drapeau s'asseoir sur listview, contrôle Tabulation et la boîte de dialogue principale sans le problème des cadres invisibles de listview dans le type de rapport. Je pense que le problème principal est parce que le double tampon utilise la méthode de dessin de bas en haut.

+0

Est-ce encore une question distincte de votre précédente https://stackoverflow.com/questions/46760792/disabling-desktop-composition-causes-flickering-on-tab-control, ou devrait-elle être fermée en double? (Je ne fais pas d'interface graphique Windows, donc je n'ai pas vraiment essayé de lire ou de comprendre les questions ou les réponses, je vois juste qu'elles sont assez similaires.) Merci de partager les solutions à vos problèmes sur SO; J'essaie juste de garder l'endroit propre et bien rangé :) –

+0

Salut ami. Vous pouvez fermer l'une ou l'autre question. Est similaire oui désolé. –

+0

Ne vous inquiétez pas à ce sujet, parfois vous pensez que quelque chose est un problème distinct et il s'avère ne pas être. –