📄 见招拆招《windows程序设计》(十) .txt
字号:
尽管Windows承揽了许多维护对话框和子窗口控件的工作,它同时也为您提供了各种加入程序代码的方法。前面我们已经看到了在对话框上绘图的方法。您也可以使用前面讨论过的窗口子类别化来改变子窗口控件的操作。
您还可以定义自己的子窗口控件,并将它们用到对话框中。例如,假定您特别不喜欢普通的矩形按键,而倾向于建立椭圆形按键,那么您可以通过注册一个窗口类别,并使用自己编写的窗口消息处理程序处理来自您所建立窗口的消息,从而建立椭圆形按键。在Developer Studio中,您可以在与自订控件相联系的「Properties」对话框中指定这个窗口类别,这将转换成对话框模板中的CONTROL叙述。程序11-3所示的ABOUT3程序正是这样做的。
程序11-3 ABOUT3
ABOUT3.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
PaintTheBlock PROTO :HWND,:DWORD,:DWORD
IDM_APP_ABOUT equ 40001
IDC_STATIC equ -1
.DATA
szAppName TCHAR "About3",0
szEllip TCHAR "EllipPush",0
.DATA?
hInstance1 HINSTANCE ?
hCtrlBlock HWND ?
iColor DWORD ?
iFigure DWORD ?
.CODE
START:
invoke GetModuleHandle,NULL
invoke WinMain,eax,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,szCmdLine:DWORD,iCmdShow:DWORD
LOCAL wndclass :WNDCLASSEX
LOCAL aboutclass :WNDCLASSA
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,hInst,addr szAppName
mov wndclass.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wndclass.hCursor,eax
invoke GetStockObject,WHITE_BRUSH
mov wndclass.hbrBackground,EAX
lea eax,szAppName
mov wndclass.lpszMenuName,eax
mov wndclass.lpszClassName,eax
mov wndclass.hIconSm,0
invoke RegisterClassEx, ADDR wndclass
.if (eax==0)
invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),szAppName, MB_ICONERROR
ret
.endif
mov aboutclass.style,CS_HREDRAW or CS_VREDRAW
mov aboutclass.lpfnWndProc,offset EllipPushWndProc
mov aboutclass.cbClsExtra,0
mov aboutclass.cbWndExtra,0
push hInst
pop aboutclass.hInstance
mov aboutclass.hIcon,NULL
invoke LoadCursor,NULL,IDC_ARROW
mov aboutclass.hCursor,eax
mov aboutclass.hbrBackground,COLOR_BTNFACE +1
mov aboutclass.lpszMenuName,NULL
lea eax,szEllip
mov aboutclass.lpszClassName,eax
invoke RegisterClass,addr aboutclass
invoke CreateWindowEx,NULL,
ADDR szAppName, ;window class name
CTXT("About Box Demo Program"),
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
AboutDlgProc proc hDlg:HWND,message:UINT,wParam:WPARAM,lParam:LPARAM
.if message == WM_INITDIALOG
xor eax,TRUE
ret
.elseif message == WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax == IDOK
invoke EndDialog,hDlg, 0
mov eax,TRUE
ret
.endif
.endif
mov eax,FALSE
ret
AboutDlgProc endp
EllipPushWndProc proc hwnd:HWND,message:UINT,wParam:WPARAM, lParam:LPARAM
LOCAL szTxt[40]:TCHAR
LOCAL hBrush :HBRUSH
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.if message==WM_PAINT
invoke GetClientRect,hwnd,addr rect
invoke GetWindowText,hwnd,addr szTxt,sizeof szTxt
;invoke MessageBox,hwnd,szTxt,NULL,MB_APPLMODAL
invoke BeginPaint,hwnd,addr ps
mov hdc,eax
invoke GetSysColor,COLOR_WINDOW
invoke CreateSolidBrush,eax
mov hBrush,eax
invoke SelectObject,hdc, hBrush
mov hBrush,eax
invoke GetSysColor,COLOR_WINDOW
invoke SetBkColor,hdc, eax
invoke GetSysColor,COLOR_WINDOWTEXT
invoke SetTextColor,hdc, eax
invoke Ellipse,hdc, rect.left, rect.top, rect.right, rect.bottom
invoke DrawText,hdc,addr szTxt, -1, addr rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke SelectObject,hdc, hBrush
invoke DeleteObject,eax
invoke EndPaint,hwnd,addr ps
xor eax,eax
ret
.elseif message == WM_KEYUP
.if (wParam == VK_SPACE)
jmp @f
.endif
.elseif message == WM_LBUTTONUP
@@:
push hwnd
invoke GetWindowLong,hwnd, GWL_ID
push eax
push WM_COMMAND
invoke GetParent,hwnd
push eax
call SendMessage
xor eax,eax
ret
.endif
invoke DefWindowProc,hwnd, message, wParam, lParam
ret
EllipPushWndProc endp
WndProc proc hwnd:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
LOCAL ps:PAINTSTRUCT
.if uMsg == WM_CREATE
mov esi,lParam
mov eax,[esi+4]
mov hInstance1,eax
xor eax,eax
ret
.elseif uMsg == WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax == IDM_APP_ABOUT
invoke DialogBoxParam,hInstance1, CTXT ("AboutBox"), hwnd,addr AboutDlgProc,0
xor eax,eax
ret
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
xor eax,eax
ret
.endif
invoke DefWindowProc,hwnd,uMsg,wParam,lParam
ret
WndProc endp
END START
ABOUT3.RC
#include "resource.h"
#define IDM_APP_ABOUT 40001
#define IDC_STATIC -1
ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
ICON "ABOUT3",IDC_STATIC,7,7,20,20
CTEXT "About3",IDC_STATIC,40,12,100,8
CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8
CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END
ABOUT3 MENU DISCARDABLE
BEGIN
POPUP "&Help"
BEGIN
MENUITEM "&About About3...", IDM_APP_ABOUT
END
END
ABOUT3 ICON DISCARDABLE "icon3.ico"
ABOUT3.ICO
我们所注册的窗口类别叫做「EllipPush」(椭圆形按键)。在Developer Studio的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -