📄 propertysheet.asm
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
ColorDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
SizeDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
pshproc proto :DWORD,:DWORD,:DWORD
.const
IDR_MENU equ 101
IDR_DIALOG_SIZE equ 102
IDR_DIALOG_COLOR equ 103
IDC_RED equ 1000
IDC_GREEN equ 1001
IDC_BLUE equ 1002
IDC_SPIN equ 1003
IDC_EDIT equ 1004
IDM_SHEET equ 40001
IDM_EXIT equ 40002
.data
ClassName db "SheetClass",0
TitleName db "选项卡",0
SheetColor db " 颜色",0
SheetSize db " 大小",0
TestText db "长天秋水共一色",0
FontName db "楷体",0
Color dd 0
FontSize dd 20
.data?
hInstance HINSTANCE ?
pspcolor PROPSHEETPAGE <>
pspsize PROPSHEETPAGE <>
psh PROPSHEETHEADER <>
hupdown HWND ?
happly HWND ?
hmainwnd HWND ?
SelectCard dd ?,?
hF HFONT ?
hOldF HFONT ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax, hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.lpszMenuName,IDR_MENU
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_ASTERISK
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
NULL,NULL,hInst,NULL
mov hmainwnd,eax
invoke ShowWindow,hmainwnd,CmdShow
invoke UpdateWindow,hmainwnd
.while TRUE
invoke GetMessage, addr msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage, addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local hdc:HDC
local ps:PAINTSTRUCT
.if uMsg==WM_DESTROY
invoke DeleteObject,hF
invoke PostQuitMessage,NULL
.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke SetTextColor,hdc,Color
invoke CreateFont,FontSize,10,0,0,300,0,TRUE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,\
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,addr FontName
mov hF,eax
invoke SelectObject,hdc,hF
mov hOldF,eax
invoke TextOut,hdc,50,30,addr TestText,sizeof TestText-1
invoke SelectObject,hdc,hOldF
invoke ReleaseDC,hWnd,hdc
invoke EndPaint ,hWnd,addr ps
.elseif uMsg==WM_COMMAND
.if !lParam
mov eax,wParam
.if ax==IDM_SHEET
mov pspcolor.dwSize,sizeof PROPSHEETPAGE
mov pspcolor.dwFlags,PSP_USETITLE
mov pspcolor.pfnDlgProc ,offset ColorDlgProc
mov pspcolor.pszTemplate ,IDR_DIALOG_COLOR
push hInstance
pop pspcolor.hInstance
mov pspcolor.pszTitle ,offset SheetColor
invoke CreatePropertySheetPage,addr pspcolor
mov SelectCard ,eax
invoke MemCopy ,addr pspcolor,addr pspsize,sizeof PROPSHEETPAGE
mov pspsize.pszTitle ,offset SheetSize
mov pspsize.pszTemplate ,IDR_DIALOG_SIZE
mov pspsize.pfnDlgProc ,offset SizeDlgProc
invoke CreatePropertySheetPage,addr pspsize
mov SelectCard+4,eax
mov psh.dwSize,sizeof PROPSHEETHEADER
push hWnd
pop psh.hwndParent
mov psh.dwFlags,PSH_USECALLBACK
push hInstance
pop psh.hInstance
mov psh.pszCaption,offset TitleName
mov psh.nPages,2
mov psh.pStartPage ,0
mov psh.phpage ,offset SelectCard
mov psh.pfnCallback,offset pshproc
invoke PropertySheet,addr psh
.else
invoke DestroyWindow,hWnd
.endif
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
ColorDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
.if uMsg==WM_INITDIALOG
invoke GetDlgItem,hWnd,IDC_RED
invoke SendMessage,eax,BM_CLICK,0,0
invoke EnableWindow,happly,FALSE
.elseif uMsg==WM_NOTIFY
mov edi,lParam
assume edi:ptr PSHNOTIFY
.if [edi].hdr.code==PSN_APPLY
invoke GetDlgItem,hWnd,IDC_RED
invoke SendMessage,eax,BM_GETCHECK,0,0
.if eax==BST_CHECKED
mov Color,0ffh
.endif
invoke GetDlgItem,hWnd,IDC_GREEN
invoke SendMessage,eax,BM_GETCHECK,0,0
.if eax==BST_CHECKED
mov Color,0ff00h
.endif
invoke GetDlgItem,hWnd,IDC_BLUE
invoke SendMessage,eax,BM_GETCHECK,0,0
.if eax==BST_CHECKED
mov Color,0ff0000h
.endif
invoke InvalidateRect,hmainwnd,NULL,TRUE
.endif
.elseif uMsg==WM_COMMAND
.if lParam
invoke EnableWindow,happly,TRUE
.endif
.elseif uMsg==WM_CLOSE
invoke DestroyWindow,hWnd
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
ColorDlgProc endp
SizeDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
.if uMsg==WM_INITDIALOG
invoke GetDlgItem,hWnd,IDC_SPIN
mov hupdown,eax
invoke GetDlgItem,hWnd,IDC_EDIT
invoke SendMessage,hupdown,UDM_SETBUDDY,eax,0
invoke SendMessage,hupdown,UDM_SETRANGE,0,00010060H
invoke SendMessage,hupdown,UDM_SETPOS,0,10
.elseif uMsg==WM_NOTIFY
mov edi,lParam
assume edi:ptr PSHNOTIFY
.if [edi].hdr.code==PSN_APPLY
invoke SendMessage,hupdown,UDM_GETPOS,0,0
mov FontSize,eax
.endif
invoke InvalidateRect,hmainwnd,NULL,TRUE
.elseif uMsg==WM_COMMAND
.if lParam
invoke EnableWindow,happly,TRUE
.endif
.elseif uMsg==WM_CLOSE
invoke DestroyWindow,hWnd
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
SizeDlgProc endp
pshproc proc hwndDlg:dword ,uMsg:dword,lParam:dword
.if uMsg==PSCB_INITIALIZED
invoke GetWindow,hwndDlg,GW_CHILD
invoke GetWindow,eax,GW_HWNDNEXT
invoke GetWindow,eax,GW_HWNDNEXT
mov happly,eax
.else
mov eax,TRUE
ret
.endif
xor eax,eax
ret
pshproc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -