📄 见招拆招《windows程序设计》(八) .txt
字号:
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 + -