📄 见招拆招《windows程序设计》(八) .txt
字号:
静态控件
系统颜色
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 + -