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

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

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:


静态控件
 系统颜色
 
BLACK COLOR_3DDKSHADOW 
GRAY COLOR_BTNSHADOW 
WHITE COLOR_BTNHIGHLIGHT 

对这些样式,CreateWindow呼叫中的窗口文字字段被忽略。矩形的左上角开始于x位置坐标和y位置坐标,这些坐标都相对于父窗口。您也可以使用SS_ETCHEDHORZ、SS_ETCHEDVERT或者SS_ETCHEDFRAME ,采用灰色和白色建立一个形似阴影的边框。

静态类别也包括了三种文字样式:SS_LEFT、SS_RIGHT和SS_CENTER。它们建立左对齐、置右对齐和居中文字。文字在CreateWindow呼叫的窗口文字参数中给出,并且在以后可以用SetWindowText来改变它。当静态控件的窗口消息处理程序显示文字时,它使用DrawText函数以及DT_WORDBREAK、DT_NOCLIP和DT_EXPANDTABS参数。文字在子窗口的矩形内可以按文字进行换行。

这三种文字样式子窗口的背景通常为COLOR_BTNFACE,而文字本身是COLOR_WINDOWTEXT。在拦截WM_CTLCOLORSTATIC消息时,您可以通过呼叫SetTextColor来改变文字颜色,通过SetBkColor来改变背景颜色,并传回背景画刷句柄。后面的COLORS1程序展示了这一点。

最后,静态类别还包括了窗口样式SS_ICON和SS_USERITEM,但是当它们被用作子窗口控件时却没有任何意义。我们在讨论对话框时还要提及它们。

滚动条类别


我在前面讨论过滚动条,也讨论了「窗口滚动条」和「滚动条控件」之间的一些区别。SYSMETS程序使用窗口滚动条,它出现在窗口的右边和底部。您可以在建立窗口时通过将标识符WS_VSCROLL、WS_HSCROLL或者两者都包含在窗口样式中,让窗口加上滚动条。现在我们准备建立一些滚动条控件,它们是能在父窗口的显示区域的任何地方出现的子窗口。您可以使用预先定义的窗口类别「scrollbar」以及两个滚动条样式SBS_VERT和SBS_HORZ中的一个来建立子窗口滚动条控件。

与按钮控件(以及将在后面讨论的编辑和清单方块控件)不同,滚动条控件不向父窗口发送WM_COMMAND消息,而是像窗口滚动条那样发送WM_VSCROLL和WM_HSCROLL消息。在处理卷动消息时,您可以通过lParam参数来区分窗口滚动条与滚动条控件。对子窗口滚动条其值为0,对于滚动条控件其值为滚动条窗口句柄。对窗口滚动条和滚动条控件来说,wParam参数的高字组和低字组的含义相同。

虽然窗口滚动条有固定的宽度,Windows使用CreateWindow呼叫中(或者在后面的MoveWindow呼叫中)给定的矩形尺寸来确定滚动条控件的尺寸。您可以建立细而长的滚动条控件,也可以建立短而粗的滚动条控件。

如果您想建立与窗口滚动条尺寸相同的滚动条控件,那么可以使用GetSystemMetrics取得水平滚动条的高度:

GetSystemMetrics (SM_CYHSCROLL) ;
        
或者垂直滚动条的宽度:

GetSystemMetrics (SM_CXVSCROLL) ;
        
根据Windows文件,滚动条窗样式标识符SBS_LEFTALIGN、SBS_RIGHTALIGN、SBS_TOP ALIGN和SBS_BOTTOMALIGN给出滚动条的标准尺寸,但是这些样式只在对话框中对滚动条有效。

对窗口滚动条,您可以使用同样的呼叫来建立滚动条控件的范围和位置:

SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
        
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw) ;
        
SetScrollInfo (hwndScroll, SB_CTL, &si, bRedraw) ;
        
其区别在于:窗口滚动条将父窗口的句柄作为第一个参数,并且以SB_VERT或者SB_HORZ作为第二个参数。

令人吃惊的是,名为COLOR_SCROLLBAR的系统颜色不再用于滚动条。两端的按钮和小方块的颜色由COLOR_BTNFACE、COLOR_BTNHILIGHT、COLOR_BTNSHADOW、COLOR_BTNTEXT (用于小箭头)、COLOR_DKSHADOW和COLOR_BTNLIGHT决定。两端按钮之间区域的颜色由COLOR_BTNFACE和COLOR_BTNHIGHLIGHT决定。

如果您拦截了WM_CTLCOLORSCROLLBAR消息,那么可以在消息处理中传回画刷以取代该颜色。让我们来试一下。

COLORS1程序


为了解滚动条和静态子窗口的一些用法-也为了深入了解颜色-我们将使用COLORS1程序,如程序9-3所示。COLORS1在显示区域的左半部显示三种滚动条,并分别标以「Red」、「 Green」和「Blue」。当您挪动滚动条时,显示区域的右半部将变为三种原色混合而成的合成色,三种原色的数值显示在三个滚动条的下面。


程序9-3 COLORS1 

        
COLORS1.ASM
;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
	
	WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
	WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
	ScrollProc PROTO	hwnd:HWND,  message:UINT,wParam:WPARAM , lParam:LPARAM 
	
.DATA
	szAppName   db "Colors1",0

	szColorLabel	db	"Red    ",0
			db	"Green  ",0
			db	"Blue   ",0
.DATA?
	idFocus 	dd	 ?
	OldScroll	WNDPROC	 3 dup (?)
	crPrim		COLORREF 3 dup  (?)
   	hBrush		HBRUSH  3 dup(?)
   	hBrushStatic 	HBRUSH	?	
	hwndScroll	HWND    3 dup(?)
	hwndLabel	HWND    3 dup(?)
	hwndValue	HWND    3 dup(?)
	hwndRect 	HWND	?
	color		dd	3 dup(?)
	cyChar		dd	?
	rcColor		RECT	<>

.CODE
START:

	invoke GetModuleHandle,NULL
	invoke WinMain,eax,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,iCmdShow:DWORD
	LOCAL wndclass   :WNDCLASSEX
	LOCAL msg  :MSG
	local hWnd :HWND
	
	mov wndclass.cbSize,sizeof WNDCLASSEX	
	mov wndclass.style,CS_HREDRAW or CS_VREDRAW	
	mov wndclass.lpfnWndProc,offset WndProc

	mov wndclass.cbClsExtra,0
	mov wndclass.cbWndExtra,0
	
	push hInst
	pop wndclass.hInstance
	
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov wndclass.hIcon,eax	
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov wndclass.hCursor,eax	
	
	invoke GetStockObject,WHITE_BRUSH
	mov wndclass.hbrBackground,EAX
	
	mov wndclass.lpszMenuName,NULL
	mov wndclass.lpszClassName,offset szAppName

	mov wndclass.hIconSm,0
	
	invoke RegisterClassEx, ADDR wndclass
	.if (EAX==0)
		 invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),addr szAppName,MB_ICONERROR 		
		 ret
	.endif
        
	invoke CreateWindowEx,
					NULL,
					ADDR szAppName, 	;window class name
					CTXT("Color Scroll"),   ;window caption
					WS_OVERLAPPEDWINDOW,	;window style
					CW_USEDEFAULT,		;initial x position
					CW_USEDEFAULT,		;initial y position
					CW_USEDEFAULT, 		;initial x size
					CW_USEDEFAULT,		;initial y size
					NULL,			;parent window handle
					NULL,			;window menu handle
					hInst,			;program instance handle
					NULL			;creation parameters
	mov hWnd,eax
	
	invoke ShowWindow,hWnd,iCmdShow
	invoke UpdateWindow,hWnd
	
	StartLoop:
		invoke GetMessage,ADDR msg,NULL,0,0
			cmp eax, 0
			je ExitLoop
				invoke TranslateMessage, ADDR msg
				invoke DispatchMessage,  ADDR msg
			jmp StartLoop
	ExitLoop:
	
	mov eax,msg.wParam
	ret

WinMain endp

WndProc proc hwnd:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
	LOCAL szBuffer[100]	:BYTE
  	LOCAL i, cxClient, cyClient:DWORD
        LOCAL hInstance:HINSTANCE
   

	.if uMsg==WM_CREATE
		xor	ebx,ebx
		mov	crPrim[ebx],0FF0000h
		add	ebx,4
		mov	crPrim[ebx],000FF00h
		add	ebx,4
		mov	crPrim[ebx],00000FFh
		
		
                ;hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
        	invoke	GetWindowLong,hwnd,GWL_HINSTANCE
        	mov	hInstance,eax
       
                ; Create the white-rectangle window against which the
                ; scroll bars will be positioned. The child window ID is 9.
                invoke	CreateWindowEx,NULL,CTXT("static"),NULL,
                	 WS_CHILD or WS_VISIBLE or SS_WHITERECT,
                	 0, 0, 0, 0,
                	 hwnd,9,hInstance,NULL
          	mov	hwndRect,eax
          	
                mov	i,0
             @@:
                ; The three scroll bars have IDs 0, 1, and 2, with
                ; scroll bar ranges from 0 through 255.
                invoke	CreateWindowEx,NULL,CTXT("scrollbar"),NULL,
                               WS_CHILD or WS_VISIBLE or WS_TABSTOP or SBS_VERT,
                               0, 0, 0, 0,
		               hwnd, i, hInstance, NULL
		mov	ebx,i
		shl	ebx,2
		mov	hwndScroll[ebx],eax
				
                invoke	SetScrollRange ,hwndScroll[ebx], SB_CTL, 0, 255, FALSE
                invoke	SetScrollPos   ,hwndScroll[ebx], SB_CTL, 0, FALSE

      		; The three color-name labels have IDs 3, 4, and 5,
     		; and text strings "Red", "Green", and "Blue".
     		mov	edx,i
     		shl	edx,3
     		lea	ecx,szColorLabel
     		add	ecx,edx
     		invoke	CreateWindowEx,NULL,CTXT("static"),ecx,
     				WS_CHILD or WS_VISIBLE or SS_CENTER,
                                0, 0, 0, 0,
                                hwnd, i+3,
                                hInstance, NULL
		mov	hwndLabel[ebx],eax     		

                ; The three color-value text fields have IDs 6, 7,
                ; and 8, and initial text strings of "0".
                invoke	CreateWindowEx,NULL,CTXT("static"),CTXT("0"),
                 		WS_CHILD or WS_VISIBLE or SS_CENTER,
                                0, 0, 0, 0,
                                hwnd, (i + 6),
                                hInstance, NULL
                mov	hwndValue[ebx],eax
                invoke	SetWindowLong,hwndScroll[ebx],GWL_WNDPROC,ScrollProc
                mov	OldScroll[ebx],eax
                invoke	CreateSolidBrush,crPrim[ebx]
                mov	hBrush[ebx],eax
               
             	inc	i
             	cmp	i,3
                jNz	@b
                
                invoke	GetSysColor,COLOR_BTNHIGHLIGHT
                invoke	CreateSolidBrush,eax
                mov	hBrushStatic,eax

		invoke	GetDialogBaseUnits
		shr	eax,16
		mov	cyChar,eax

	        xor	eax,eax
	        ret
	.elseif uMsg ==  WM_SIZE
        	mov	eax,lParam
        	and	eax,0FFFFh
        	mov	cxClient,eax
        	
        	mov	eax,lParam
		shr	eax,16
		mov	cyClient,eax

		push	cyClient
		push	cxClient
		push	0
		mov	eax,cxClient
		shr	eax,1
		push	eax
		push	offset	rcColor
		call	SetRect
        
        	push	TRUE
        	push	cyClient
        	mov	eax,cxClient
        	shr	eax,1
        	push	eax
        	push	0
        	push	0
        	push	hwndRect
        	call	MoveWindow

                mov	i,0
             @@:
                ;MoveWindow (hwndScroll[i],
                ;                 (2 * i + 1) * cxClient / 14, 2 * cyChar,
                ;                  cxClient / 14, cyClient - 4 * cyChar, TRUE) ;
        	push	TRUE
        	mov	eax,cyClient

⌨️ 快捷键说明

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