Windows XP中的对话框绘图问题 [英] Dialog box drawing issue in windows XP

查看:80
本文介绍了Windows XP中的对话框绘图问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Windows XP上的对话框有一个奇怪的问题它没有正确绘制,



列表视图不会重绘除非我做一些强制重新点击像点击大小寄宿生然后listview显示。但是,如果我将应用程序移动到屏幕上的某个位置,它会再次隐藏。



这张图说明问题



https://i.imgur.com/JPgBG8x.png







为了避免闪烁我已在主对话框中设置WS_CLIPCHILDREN。选项卡控件是主对话框中的子项,通过DialogBoxParam调用。 Listview控件位于另一个子对话框上,该对话框是一个子对象,使用CreateDialogParam API在运行时附加到主对话框,主对话框作为父窗口。在Windows 7上我对绘图没有任何问题,除非我关闭窗口组合然后我在调整大小时会有一些闪烁。但是在Windows XP上,绘图非常缓慢。并且Listview没有正确更新,就像它与标签控件混合一样,如果我按住左键并拖动它会显示它。



任何身体都有任何线索为什么这只发生在XP上?我只在Tab控件上设置了WS_EX_COMPOSITED标志。但是我删除了它并没有解决问题。 WM_ERASEBKGND消息被禁用以减少闪烁。





这是描述未正确绘制列表视图时会发生什么的图片按住鼠标左键并拖动它开始显示



https://i.imgur.com/uqcbTMF.png





这是我的代码



I have a weird issue with Dialog box on Windows XP it doesn't draw correctly,

The listview doesn't redraw unless i do some thing that forces repaints like clicking on the size boarders then the listview show. But if i move the application somewhere on screen it goes hidden again.

This picture illustrates the problem

https://i.imgur.com/JPgBG8x.png



To avoid flickering i have set the WS_CLIPCHILDREN on the main dialog. The tab control is a child on the main dialog which is invoked through DialogBoxParam. And the Listview control is on another dialog which is a child and attached to the main dialog on runtime using CreateDialogParam API with the main dialog as a parent window. On Windows 7 i have no problem with the drawing except if i turn off windows composition then i get some flickering on the resize. But on windows XP the drawing is very sluggish. And the Listview doesn't update properly like it get mixed with the tab control some parts of it show if i hold left click and drag.

Any body has any clue why this happens on XP only? I have WS_EX_COMPOSITED flag set on Tab control only. But i removed it and it doesn't fix the issue. The WM_ERASEBKGND messaged is disabled to reduce flickering.


This is a picture describing what happens when the listview is not drawn correctly and i try to hold left click mouse and drag over it starts to show

https://i.imgur.com/uqcbTMF.png


Here is my code

.code

MainTabProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
	
	
	LOCAL PS:PAINTSTRUCT
	.if uMsg==WM_INITDIALOG
			
		invoke GetDlgItem,hWnd,ConnectionsLVID
		MOV ConnectionsLVHandle,EAX	
		
		invoke SendMessage,ConnectionsLVHandle,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT  OR LVS_EX_GRIDLINES,LVS_EX_FULLROWSELECT  OR LVS_EX_GRIDLINES
		mov		lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
		mov		lvc.pszText,chr$("1")
		mov		lvc.lx, 40	
	
		mov		lvc.iSubItem, 0
		
		invoke	SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 0,addr lvc	
		mov		lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
		mov		lvc.pszText,chr$("2")
		mov		lvc.lx, 90	
	
		mov		lvc.iSubItem, 1
		invoke	SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 1,addr lvc	
		
		
		mov		lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
		mov		lvc.pszText,chr$("3")
		mov		lvc.lx, 90	
	
		mov		lvc.iSubItem, 2
		invoke	SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 2,addr lvc	
		
	
		mov		lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
		mov		lvc.pszText,chr$("4")
		mov		lvc.lx, 130	
	
		mov		lvc.iSubItem, 3
		 
		
		
		invoke	SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 3,addr lvc	
		invoke  SendMessage, ConnectionsLVHandle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER
		
		
		
		
		
		
		
	
	.elseif uMsg == WM_CTLCOLORDLG 
		
	.elseif uMsg == WM_ERASEBKGND
			MOV EAX,1
			RET
	
		
	.elseif uMsg == WM_PAINT
			
	.elseif uMsg == WM_SIZE
				
	.else
		
	.endif
	XOR EAX,EAX
	ret

MainTabProc endp
SettingsTabProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
	
	.if uMsg==WM_INITDIALOG
	.elseif uMsg == WM_CTLCOLORDLG 
		
	.elseif uMsg == WM_ERASEBKGND
		MOV EAX,1
		RET
		
						
	.else
		
	.endif
	XOR EAX,EAX
	ret

SettingsTabProc endp

DialogProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD 
	LOCAL   ts:TCITEM
	LOCAL COLOR: COLORREF
	LOCAL CLRECT:RECT
	LOCAL PS:PAINTSTRUCT 
	LOCAL hrgnUpdate: HRGN  		
	LOCAL MAXINFO:MINMAXINFO
	LOCAL pp: INITCOMMONCONTROLSEX
	.if uMsg == WM_INITDIALOG
		;Create the tabs
		
		mov		ts.imask,TCIF_TEXT OR TCIF_IMAGE

		mov		ts.lpReserved1,0
		mov		ts.lpReserved2,0
		mov		ts.iImage,0
		mov		ts.lParam,0
		mov		ts.pszText,offset TabConnections
		mov		ts.cchTextMax,sizeof TabConnections
		
		
		
		MOV pp.dwSize,sizeof pp
		mov pp.dwICC,ICC_TAB_CLASSES

		invoke InitCommonControlsEx,addr pp
		invoke ImageList_Create,20,20,ILC_COLOR32 	 OR ILC_MASK ,3,10 ;Create ImageList
		MOV ImageListHandle,EAX
		MOV EDI,EAX
		
		invoke LoadBitmap,hInstance,1
		invoke ImageList_AddMasked,EDI,EAX,0 ;Add bitmap masked
		
		
		
		
		invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETIMAGELIST,0,EDI ;Assosiate ImageList with Tabs
		invoke LoadBitmap,hInstance,2 ;Load Bitmap

		invoke ImageList_AddMasked,EDI,EAX,0 ;Add Bitmap to imagelist
		
		invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETIMAGELIST,0,EDI ;Set image on tab
		
		invoke SendDlgItemMessage,hWnd,MainTabID,TCM_INSERTITEM,0,addr ts ;Insesrt tab
		mov		ts.iImage,1
		
		mov		ts.pszText,offset TabSettings
		mov		ts.cchTextMax,sizeof TabSettings






		
		invoke SendDlgItemMessage,hWnd,MainTabID,TCM_INSERTITEM,1,addr ts ;Set image on tab
		
		invoke GetDlgItem,hWnd,MainTabID ;BUG
		mov		[MainTabHandle],eax
		
		
		invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETITEMSIZE,NULL,110 ;Extend tab width + height
		
		
;	
		invoke CreateDialogParam,hInstance,MainContentDlgID,hWnd,addr MainTabProc,0
		mov MainTabContentDialogHandle,eax
		
		
		
		
		
		
		
		
		
		
		
		
		invoke CreateDialogParam,hInstance,SettingsDlgID,hWnd,addr SettingsTabProc,0
		mov SettingsTabDialogHandle,eax
		invoke ShowWindow, SettingsTabDialogHandle,SW_HIDE
		
		
		
		
		invoke EnableThemeDialogTexture,hWnd,6
	
		invoke GetDlgItem,hWnd,1011
		
		invoke ResizeWindow,hWnd,uMsg,lParam
	
		invoke ShowWindow, MainTabContentDialogHandle,SW_SHOWDEFAULT	
		MOV Tabchoosen,0
	
			
			
		
		MOV EAX,hWnd
		MOV [DlgHandle],EAX
		invoke LoadIcon,[hInstance],1
		invoke SendMessage,hWnd,WM_SETICON,1,EAX
		
	
		
		
	

	.elseif uMsg == WM_GETMINMAXINFO 
			MOV EAX,lParam
			MOV [EAX].MINMAXINFO.ptMinTrackSize.x,874
			MOV [EAX].MINMAXINFO.ptMinTrackSize.y,466
		
	.elseif uMsg == WM_SETFONT
			MOV EAX,wParam
			MOV hfnt,EAX	
	.elseif uMsg == WM_SIZE
			
	.elseif uMsg == WM_MOUSEMOVE
		
	.elseif uMsg == WM_SIZING
			
			
		
	.elseif uMsg == WM_WINDOWPOSCHANGED
			
			invoke ResizeWindow,hWnd,uMsg,lParam
			
		
	.elseif uMsg == WM_CTLCOLORSTATIC
  				
			
	.elseif uMsg == WM_SYSCOMMAND 
			MOV EAX,wParam
			
			.if EAX == SC_MAXIMIZE
				invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN 
				
			.endif	
				
	.elseif uMsg == WM_PAINT 
		
			
			invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN
			
	
			invoke BeginPaint,hWnd,addr PS

			invoke Paint,hWnd,addr PS,hfnt
			invoke EndPaint,hWnd,addr PS
			
			
			
		

	.elseif uMsg == WM_SYNCPAINT
	
		invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN

	.elseif uMsg == WM_ACTIVATE
		invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN	
	.elseif uMsg == WM_ENTERSIZEMOVE 
		
		
		invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN	
	.elseif uMsg == WM_EXITSIZEMOVE
			
	.elseif uMsg == WM_ERASEBKGND
		
		MOV EAX,1
		RET
			
	.elseif uMsg == WM_NOTIFY
        mov     edx, wParam
        .if edx == MainTabID
            mov     eax, lParam
	        mov     eax, (NMHDR ptr [eax]).code
	        .if eax == TCN_SELCHANGE
	        	invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN
	            mov     ebx, Tabchoosen
	            mov     eax, [TabHandles + ebx * 4]
	            invoke  ShowWindow, eax, SW_HIDE
	            
	            invoke  SendMessage, MainTabHandle, TCM_GETCURSEL, 0, 0
	            mov     Tabchoosen, eax
	            mov     ebx, [TabHandles + eax * 4]
	            invoke  ShowWindow, ebx, SW_SHOWDEFAULT     
	        .endif             
            
        .endif	
		
		
		
		
		
		
		
		

	
	.elseif uMsg == WM_COMMAND
			
				NOP
	.elseif uMsg == WM_CLOSE
		invoke CloseHandle,[CompletionPort]
		invoke closesocket,[Listen]
		invoke EndDialog,hWnd,NULL
	
	.else
		
	.endif
	
	XOR EAX,EAX
	ret

DialogProc endp

  align 4
  Main proc 
	

	invoke GetModuleHandle,NULL
	
	MOV [hInstance],EAX
	invoke HeapCreate, NULL,4,NULL
	MOV [HeapH],EAX
	
	invoke DialogBoxParam,[hInstance],DialogBox,NULL,addr DialogProc, NULL
	ret
	
	
	
	
	
	
	

Main endp
Paint Proc hWnd:DWORD,  pPAINTSTRUCT:PPAINTSTRUCT,FNT:HFONT
	LOCAL rc:RECT ;
    LOCAL hdcMem:HDC ;
    LOCAL hBITMAP:HANDLE
    LOCAL hbmMem:HANDLE
    LOCAL hbmOld:HANDLE

    LOCAL hbrBkGnd:HBRUSH ;
    LOCAL hfntOld:HFONT ;
	
	invoke GetUpdateRgn,hWnd,addr rc,FALSE
	.if EAX == NULL
		ret
		
	.endif
	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 FNT
	 	invoke SelectObject,hdcMem,FNT
		MOV hfntOld,EAX
	 .endif
		
	
	
	invoke SetBkMode,hdcMem,TRANSPARENT
	invoke GetSysColor,COLOR_WINDOWTEXT
	invoke SetTextColor,hdcMem,EAX
	
	
	 
	 	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,0,0,hdcMem,0, 0,SRCCOPY
  	invoke SelectObject,hdcMem, hbmOld
 
    invoke DeleteObject,hbmMem;
    invoke DeleteDC,hdcMem;
    
             
	ret

Paint endp

ResizeWindow Proc hWnd:HWND,uMsg:DWORD,lParam:DWORD
	LOCAL CLRECT:RECT
	MOV EAX,uMsg
	
	
	.if uMsg == WM_WINDOWPOSCHANGED
		MOV EAX,lParam
		MOV EDX,offset ORGRECT
		MOV ECX,[EAX].WINDOWPOS.lx
		MOV EBX,[EAX].WINDOWPOS.cy
		.if [EDX].WINDOWPOS.lx == NULL
			
			MOV [EDX].WINDOWPOS.lx ,ECX
			MOV [EDX].WINDOWPOS.cy ,EBX
			
		.elseif [EDX].WINDOWPOS.lx == ECX && [EDX].WINDOWPOS.cy == EBX
			
			ret
		.else 
			MOV [EDX].WINDOWPOS.lx ,ECX
			MOV [EDX].WINDOWPOS.cy ,EBX
		.endif
		
	.endif
	

	invoke GetClientRect,hWnd,addr CLRECT
	LEA EAX, CLRECT
	SUB [EAX].RECT.bottom,23
	invoke MoveWindow,MainTabHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,FALSE
			
	invoke GetClientRect,hWnd,addr CLRECT
	LEA EAX, CLRECT
	SUB [EAX].RECT.bottom,30
	invoke MoveWindow,MainTabContentDialogHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,FALSE
			
			
	invoke GetClientRect,MainTabHandle,addr CLRECT
	LEA EAX, CLRECT
	SUB [EAX].RECT.bottom,38
	LEA EBX, CLRECT
	ADD [EBX].RECT.top,30
	LEA ECX, CLRECT
	SUB [ECX].RECT.right,10
	LEA EDX, CLRECT
	ADD [EDX].RECT.left,5
	invoke MoveWindow,ConnectionsLVHandle,[ECX].RECT.left,[EBX].RECT.top,[ECX].RECT.right,[EAX].RECT.bottom,FALSE
	

	invoke GetDlgItem,hWnd,1011
	MOV EDI,EAX
	invoke GetClientRect,MainTabHandle,addr CLRECT
	LEA EAX, CLRECT

	invoke MoveWindow,EDI,0,0,[EAX].RECT.right,[EAX].RECT.bottom,FALSE		

	ret

ResizeWindow endp





我尝试了什么:



我试图调用UpdateWindow,mainDlgHandle Listview句柄。全都一样。仍然没有正确绘制。



我试图使用RedrawWindow与RDW_ALLCHILDREN也无济于事。



再次启用WM_ERASEBKGND也没有帮助。



What I have tried:

I tried to call UpdateWindow,mainDlgHandle Listview handle. All the same. still not drawn correctly.

I tried to use RedrawWindow with RDW_ALLCHILDREN doesn't help either.

enabled WM_ERASEBKGND again doesn't help either.

推荐答案

(1)
mov lvc.lx,40

mov lvc.iSubItem,0

调用SendMessage,ConnectionsLVHandle,LVM_INSERTCOLUMN,0,addr lvc
mov lvc.imask,LVCF_TEXT或LVCF_WIDTH或LVCF_SUBITEM
mov lvc.pszText,chr
("1") mov lvc.lx, 40 mov lvc.iSubItem, 0 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 0,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr


(2)
mov lvc.lx,90

mov lvc.iSubItem,1
调用SendMessage,ConnectionsLVHandle,LVM_INSERTCOLUMN,1 ,addr lvc


mov lvc.imask,LVCF_TEXT或LVCF_WIDTH或LVCF_SUBITEM
mov lvc.pszText,chr
("2") mov lvc.lx, 90 mov lvc.iSubItem, 1 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 1,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr


(3 )
mov lvc.lx,90

mov lvc.iSubItem,2
调用SendMessage,ConnectionsLVHandle,LVM_INSERTCOLUMN,2,addr lvc


mov lvc.imask,LVCF_TEXT或LVCF_WIDTH o r LVCF_SUBITEM
mov lvc.pszText,chr
("3") mov lvc.lx, 90 mov lvc.iSubItem, 2 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 2,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr


这篇关于Windows XP中的对话框绘图问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆