2017-10-17 12 views
-1

WX_EX_COMPOSITED을 사용한 후에 문제가 발생하여 보고서 유형이 설정된 listview와 호환되지 않아 강제로 해제되었습니다. 내가 메시지 중 하나에 대한 응답으로 주 대화 상자의 크기를 조정과 함께 탭 컨트롤의 크기를 조정할 때마다TAB 컨트롤 깜박임 문제 크기 조정

Disabling desktop composition causes flickering on Tab Control

지금 WM_SIZE, WM_SIZING은 많은이 있습니다 메시지

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

을 WM_WINDOWPOSCHANGED TAB 컨트롤로 깜빡입니다.

이미 기본 윈도우 프로 시저로 돌아가서 WM_ERASEBKGND 메시지를 해제했습니다.

.elseif uMsg == WM_ERASEBKGND 
      MOV EAX,1 
      RET 

와 나는 Microsoft에서 읽고이 문서를 사용하여 내 자신에 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 

페인트 절차 내가 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; 

에 C++에서 포팅 후 그것에 대한 호출, 새로운 영역은 j입니다 메인 대화 상자의 너비를 확장하기 위해 크기를 조정할 때 그리기 문제가있다 ust black. 하지만 페인트를 호출하면 크기 조정 후 새 영역이 올바르게 그려집니다. 그러나 깜박 거림은 엄청납니다.

나는 하나 DialogBoxParam API를 통해 호출 주 대화 상자 3 개 대화 상자가

그리고 다른 2 (NO 캡션과는 스타일이 DS_SYSMODAL로 설정입니다) 단지 모덜리스 대화 상자입니다 이러한 대화 상자 CreateDialogParam API 호출을 통해 Tab 컨트롤에 연결됩니다. 각각 고유 한 DlgProc이 있습니다.

이제 컨트롤 크기가 깜박이는 것을 방지하려면 어떻게해야합니까? 내가 크기를 조정하려는 컨트롤에 하위 분류를해야합니까? 각 컨트롤에 대해 WM_ERASEBKGND을 개별적으로 비활성화 하시겠습니까?

WM_ERASEBKGND 메시지를 기본 대화 상자에서만 또는 모든 모덜리스 대화 상자에서 사용하지 않도록 설정해야합니까?

누구든지이 문제에 대해 도움이 될 수 있습니까?

+0

대화 상자 자체가 아닌 탭 컨트롤에서 WS_EX_COMPOSITED 플래그를 사용하고 주 대화 상자에서 WS_CLIPCHILDREN을 사용하여 그 주위에 방법을 발견했습니다. 이렇게하면 탭의 크기를 변경할 때 깜박 거리는 문제가 해결되었습니다. 그러나 이제 자식 컨트롤이 제대로 렌더링되지 않고 탭 크기를 조정하면 사라집니다. WM_SIZING 메시지에서 bRepaint가 true로 설정된 탭 컨트롤에서 MoveWindow API를 사용하고 있습니다. 자식 컨트롤이 크기 조절 후 손실되지 않고 제대로 그릴 수 있도록하려면 어떻게해야합니까? –

답변

0

문제리스트 뷰 탭 이외의 탭을 클릭리스트 뷰에 는, setParent를 사용하여 상위 집합 주 대화 대신 서브 대화하고 탭 사이를 전환 할 때 고정된다 나는 기본적 부모 돌아가 다시 는, setParent 사용 하위 대화 상자에 listview를 추가하여 코드가 여전히 ShowWindow으로 숨길 수 있습니다. 이제 Listview는 항상 맨 위에 표시됩니다. WM_ERASEBKGND을 사용할 수 없어도 깜박임이 전혀 발생하지 않습니다. 이제 WS_EX_COMPOSITED 플래그가 listview에 있고, 탭 컨트롤과 주 대화 상자에 보고서 유형에 listview의 보이지 않는 프레임 문제가 없어야합니다. 이중 덤핑은 bottom-to-top 드로잉 메서드를 사용하기 때문에 주요 문제라고 생각합니다.

+0

이전 https://stackoverflow.com/questions/46760792/disabling-desktop-composition-causes-flickering-on-tab-control과 여전히 다른 질문입니까, 아니면 중복으로 닫아야합니까? (나는 Windows GUI를 사용하지 않으므로, 질문이나 대답을 실제로 읽거나 이해하지 못했고, 꽤 비슷하게 보입니다.) SO 문제에 대한 솔루션을 공유해 주셔서 감사합니다. 나는 단지 장소를 깔끔하고 깔끔하게 유지하려고 노력하고있다 :) –

+0

안녕하세요. 두 질문 중 하나를 닫을 수 있습니다. 죄송합니다. 죄송합니다. –

+0

걱정하지 마십시오. 때로는 어떤 것이 별개의 문제라고 생각할 때가 아니라는 것을 알게됩니다. –