⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 见招拆招《windows程序设计》(八) .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        	mov	ebx,cyChar
        	shl	ebx,2
        	sub	eax,ebx
        	push	eax
        	xor	edx,edx
        	mov	eax,cxClient
        	mov	ecx,14
        	div	ecx
        	push	eax
        	mov	eax,cyChar
        	shl	eax,1
        	push	eax
        	mov	eax,i
        	shl	eax,1
        	inc	eax
        	mov	ecx,cxClient
        	mul	ecx
        	xor	edx,edx
        	mov	ecx,14
        	div	ecx
        	push	eax
 		mov	ebx,i
		shl	ebx,2
		mov	eax,hwndScroll[ebx]
		push	eax
		call	MoveWindow
		
                ;MoveWindow (hwndLabel[i],
                ;                 (4 * i + 1) * cxClient / 28, cyChar / 2,
                ;                 cxClient / 7, cyChar, TRUE)
        	push	TRUE
        	push	cyChar
        	xor	edx,edx
        	mov	eax,cxClient
        	mov	ecx,7
        	div	ecx
        	push	eax
        	mov	eax,cyChar
        	shr	eax,1
        	push	eax
        	mov	eax,i
        	shl	eax,2
        	inc	eax
        	mov	ecx,cxClient
        	mul	ecx
        	xor	edx,edx
        	mov	ecx,28
        	div	ecx
        	push	eax
 		mov	ebx,i
		shl	ebx,2        	
		mov	eax,hwndLabel[ebx]
		push	eax
		call	MoveWindow

                ;MoveWindow (hwndValue[i],
	        ;   (4 * i + 1) * cxClient / 28,
                ;   cyClient - 3 * cyChar / 2,
                ;   cxClient / 7, cyChar, TRUE)
                push	TRUE
                push	cyChar
                xor	edx,edx
                mov	eax,cxClient
                mov	ecx,7
                div	ecx
                push	eax
                mov	eax,cyClient
                mov	ebx,cyChar
                add	ebx,ebx
                add	ebx,cyChar
                shr	ebx,1
                sub	eax,ebx
                push	eax
                mov	eax,i
                shl	eax,2
                inc	eax
                mov	ecx,cxClient
                mul	ecx
                xor	edx,edx
                mov	ecx,28
                div	ecx
                push	eax
 		mov	ebx,i
		shl	ebx,2 
		mov	eax,hwndValue[ebx]
		push	eax
		call	MoveWindow

             	inc	i
             	cmp	i,3
                jNz	@b
                invoke  SetFocus,hwnd
        
                xor	eax,eax
	        ret
	.elseif uMsg ==  WM_SETFOCUS
		mov	ebx,idFocus
		shl	ebx,2
		invoke	SetFocus,hwndScroll[ebx]

                xor	eax,eax
	        ret	        
	.elseif uMsg == WM_VSCROLL
 		;i = GetWindowLong ((HWND) lParam, GWL_ID) ;
 		invoke	GetWindowLong,lParam,GWL_ID
 		mov	i,eax
 		
 		mov	ebx,i
 		shl	ebx,2
 		
 		mov	eax,wParam
 		and	eax,0FFFFh
 		.if	eax == SB_PAGEDOWN
                	mov	eax,color[ebx] ;color[i] += 15
                	add	eax,15
                	mov	color[ebx],eax
        
                        jmp	@f   
        	.elseif	eax == SB_LINEDOWN
                  @@:
                  	mov	eax,color[ebx] ;color[i] = min (255, color[i] + 1)
                  	inc	eax
                  	cmp	eax,255
                  	jl	@f
                  	mov	eax,255
                  @@:
        		mov	color[ebx],eax
        	.elseif	eax == SB_PAGEUP
                	mov	eax,color[ebx] ;color[i] -= 15
                	sub	eax,15
                	mov	color[ebx],eax
        
                        jmp	@f          
        	.elseif	eax == SB_LINEUP
                  @@:
                  	mov	eax,color[ebx] ;color[i] = max (0, color[i] - 1)
                  	dec	eax
                  	cmp	eax,0
                  	jg	@f
                  	mov	eax,0
                  @@:
        		mov	color[ebx],eax
        	.elseif	eax == SB_TOP
                	mov	color[ebx],0   ;color[i] = 0    
        	.elseif	eax == SB_BOTTOM
                	mov	color[ebx],255 ;color[i] = 255           
            
        	.elseif	(eax == SB_THUMBPOSITION)||(eax == SB_THUMBTRACK)
        		mov	eax,wParam     ;color[i] = HIWORD (wParam) ;
        		shr	eax,16
			mov	color[ebx],eax
		.endif
		
		mov	ebx,i
		shl	ebx,2
                invoke	SetScrollPos,hwndScroll[ebx], SB_CTL, color[ebx], TRUE
                invoke	wsprintf,addr szBuffer, CTEXT ("%i"), color[ebx]
                invoke	SetWindowText,hwndValue[ebx], addr szBuffer

		mov	eax,color[0]
		shl	eax,8
		mov	ebx,color[4]
		or	eax,ebx
		shl	eax,8
		mov	ebx,color[8]
		or	eax,ebx
		invoke	CreateSolidBrush,eax
		invoke	SetClassLong,hwnd,GCL_HBRBACKGROUND,eax
		invoke	DeleteObject,eax

		mov	eax,color[0]
		shl	eax,4
		mov	ebx,color[4]
		or	eax,ebx
		shl	eax,4
		mov	ebx,color[8]
		or	eax,ebx
		invoke  CreateSolidBrush,eax
        	invoke	InvalidateRect,hwnd, addr rcColor, TRUE
		
                xor	eax,eax
	        ret	        
	.elseif uMsg ==  WM_CTLCOLORSCROLLBAR
        	invoke	GetWindowLong,lParam,GWL_ID
        	mov	i,eax
        	mov	ebx,i
        	shl	ebx,2

                mov	eax,hBrush[ebx]
	        ret	        
	.elseif uMsg ==  WM_CTLCOLORSTATIC	        
        	invoke	GetWindowLong,lParam,GWL_ID
        	mov	i,eax		
		.if	(i>=3)&&(i<=8)
			mov	eax,i
			xor	edx,edx
			mov	ecx,3
			div	ecx
			mov	ebx,edx
			invoke	SetTextColor,wParam, crPrim[ebx]
			invoke	GetSysColor,COLOR_BTNHIGHLIGHT
	                invoke  SetBkColor,wParam, eax
	        
	                mov     eax,hBrushStatic 
	                ret
		.endif
	.elseif uMsg ==  WM_SYSCOLORCHANGE
		invoke	DeleteObject,hBrushStatic
		invoke	GetSysColor,COLOR_BTNHIGHLIGHT
		invoke	CreateSolidBrush,eax
		mov	hBrushStatic,eax
		
                xor	eax,eax
	        ret
		
	.elseif uMsg == WM_DESTROY
		invoke	GetStockObject,WHITE_BRUSH
		push	eax
		push	GCL_HBRBACKGROUND
		push	hwnd
		push	SetClassLong
		invoke	DeleteObject,eax
		invoke	DeleteObject,hBrush[0]
		invoke	DeleteObject,hBrush[4]		
		invoke	DeleteObject,hBrush[8]		
                invoke  DeleteObject,hBrushStatic
	        invoke 	PostQuitMessage,NULL
	        xor	eax,eax
	        ret
	.endif
	invoke DefWindowProc,hwnd,uMsg,wParam,lParam
	ret
WndProc endp

ScrollProc proc	hwnd:HWND,  message:UINT,wParam:WPARAM , lParam:LPARAM 
  	LOCAL id:DWORD
  	
  	invoke	GetWindowLong , hwnd, GWL_ID
  	mov	id,eax

	mov	eax,message
	.if	eax == WM_KEYDOWN 
        
                .if (wParam == VK_TAB)
	        	invoke	GetKeyState,VK_SHIFT
	        	cmp	eax,0
	        	jg	@f
	        	mov	eax,2
	        	jmp	Fini
	            @@:
	            	mov	eax,1
	            Fini:
	            	add	eax,id
	            	xor	edx,edx
	            	mov	ecx,3
	            	div	ecx
	            	push	eax
	            	invoke	GetParent,hwnd
	            	push	eax
	            	call	GetDlgItem
	            	
	            	invoke	SetFocus,eax
            	.endif
       .elseif	eax == WM_SETFOCUS
        	mov	eax,id
        	mov	idFocus,eax
	.endif        
	mov	ebx,id
	shl	ebx,2
        invoke	 CallWindowProc ,OldScroll[ebx], hwnd, message, wParam,lParam
        ret
ScrollProc endp

END START
COLORS1利用子窗口进行工作,该程序使用10个子窗口控件:3个滚动条、6个静态文字窗口和1个静态矩形框。COLORS1拦截WM_CTLCOLORSCROLLBAR消息来给红、绿、蓝3个滚动条的内部着色,并拦截WM_CTLCOLORSTATIC消息来着色静态文字。

您可以使用鼠标或者键盘来挪动滚动条,从而利用COLORS1作为一种实验颜色显示的开发工具,为您自己的Windows程序选择漂亮的颜色(或者,您可能更喜欢难看的颜色)。COLORS1的显示如图9-3所示。不幸的是,这些颜色在印表纸上被显示为不同深浅的灰色。


 



图9-3 COLORS1的屏幕显示
 

COLORS1不处理WM_PAINT消息,所有的工作几乎都是由子窗口完成的。

显示区域右半部显示的颜色实际上是窗口的背景颜色。SS_WHITERECT样式的静态子窗口显示在显示区域的左半部。三个滚动条是SBS_VERT样式的子窗口控件,它们被定位在SS_WHITERECT子窗口的顶部。另外六个SS_CENTER样式(居中文字)的静态子窗口提供卷标和颜色值。COLORS1在WinMain函数中用CreateWindow建立它的普通重迭式窗口和10个子窗口。SS_WHITERECT和SS_CENTER静态窗口使用窗口类别「static」;三个滚动条使用窗口类别「scrollbar」。

CreateWindow呼叫中的x位置、y

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -