📄 3dframes.asm
字号:
; #########################################################################
;
; The framing affects are drawn on the client area by a single procedure,
; "Frame3D". In the WmdProc message handling Proc, the WM_PAINT message
; calls another Proc called "Paint_Proc" which contains the procedure calls
; to "Frame3D".
;
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
; #########################################################################
;=============
; Local macros
;=============
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
;=================
; Local prototypes
;=================
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
Paint_Proc PROTO :DWORD, hDC:DWORD
Frame3D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
PushButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.data
szDisplayName db "3D Frames",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
; #########################################################################
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
;====================
; Put LOCALs on stack
;====================
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
;==================================================
; Fill WNDCLASSEX structure with required variables
;==================================================
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ;<< NOTE: macro not mnemonic
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon,hInst,500 ; icon ID
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc
;================================
; Centre window at following size
;================================
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax
szText szClassName,"Template_Class"
invoke CreateWindowEx,WS_EX_LEFT,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
invoke LoadMenu,hInst,600 ; menu ID
invoke SetMenu,hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
;===================================
; Loop until PostQuitMessage is sent
;===================================
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hDC :DWORD
LOCAL Ps :PAINTSTRUCT
.if uMsg == WM_COMMAND
;======== menu commands ========
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Pure & Simple"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif
;====== end menu commands ======
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,ADDR Ps
mov hDC, eax
invoke Paint_Proc,hWin,hDC
invoke EndPaint,hWin,ADDR Ps
return 0
.elseif uMsg == WM_CREATE
jmp @F
Butn1 db "&Save",0
Butn2 db "&Cancel",0
Butn3 db "&Help",0
@@:
invoke PushButton,ADDR Butn1,hWin,350,30,100,25,500
invoke PushButton,ADDR Butn2,hWin,350,60,100,25,500
invoke PushButton,ADDR Butn3,hWin,350,90,100,25,500
.elseif uMsg == WM_CLOSE
szText TheText,"Please Confirm Exit"
invoke MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO
.if eax == IDNO
return 0
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; #########################################################################
Paint_Proc proc hWin:DWORD, hDC:DWORD
LOCAL btn_hi :DWORD
LOCAL btn_lo :DWORD
LOCAL Rct :RECT
invoke GetSysColor,COLOR_BTNHIGHLIGHT
mov btn_hi, eax
invoke GetSysColor,COLOR_BTNSHADOW
mov btn_lo, eax
; --------------------------------------------------------
; The following 2 calls draw the border around the buttons
; --------------------------------------------------------
invoke Frame3D,hDC,btn_lo,btn_hi,340,20,460,125,2
invoke Frame3D,hDC,btn_hi,btn_lo,337,17,463,128,2
; -----------------------------------------------------
; The following 2 calls draw the left window frame area
; -----------------------------------------------------
invoke Frame3D,hDC,btn_lo,btn_hi,17,17,328,290,2
invoke Frame3D,hDC,btn_hi,btn_lo,20,20,325,287,1
; ----------------------------------------------------------
; The following code draws the border around the client area
; ----------------------------------------------------------
invoke GetClientRect,hWin,ADDR Rct
add Rct.left, 1
add Rct.top, 1
sub Rct.right, 1
sub Rct.bottom, 1
invoke Frame3D,hDC,btn_lo,btn_hi,
Rct.left,Rct.top,
Rct.right,Rct.bottom,2
add Rct.left, 4
add Rct.top, 4
sub Rct.right, 4
sub Rct.bottom, 4
invoke Frame3D,hDC,btn_hi,btn_lo,
Rct.left,
Rct.top,Rct.right,Rct.bottom,2
return 0
Paint_Proc endp
; ########################################################################
PushButton proc lpText:DWORD,hParent:DWORD,
a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
szText btnClass,"BUTTON"
invoke CreateWindowEx,0,
ADDR btnClass,lpText,
WS_CHILD or WS_VISIBLE,
a,b,wd,ht,hParent,ID,
hInstance,NULL
ret
PushButton endp
; ########################################################################
Frame3D proc hDC:DWORD,btn_hi:DWORD,btn_lo:DWORD,
tx:DWORD, ty:DWORD, lx:DWORD, ly:DWORD,bdrWid:DWORD
; --------------------------------
; prototype and example usage code
; --------------------------------
; LOCAL btn_hi :DWORD
; LOCAL btn_lo :DWORD
; invoke GetSysColor,COLOR_BTNHIGHLIGHT
; mov btn_hi, eax
; invoke GetSysColor,COLOR_BTNSHADOW
; mov btn_lo, eax
; invoke Frame3D,hDC,btn_lo,btn_hi,50,50,150,100,2
; invoke Frame3D,hDC,btn_hi,btn_lo,47,47,153,103,2
; --------------------------------
LOCAL hPen :DWORD
LOCAL hPen2 :DWORD
LOCAL hpenOld :DWORD
invoke CreatePen,0,1,btn_hi
mov hPen, eax
invoke SelectObject,hDC,hPen
mov hpenOld, eax
; ------------------------------------
; Save copy of parameters for 2nd loop
; ------------------------------------
push tx
push ty
push lx
push ly
push bdrWid
; ------------
lpOne:
invoke MoveToEx,hDC,tx,ty,NULL
invoke LineTo,hDC,lx,ty
invoke MoveToEx,hDC,tx,ty,NULL
invoke LineTo,hDC,tx,ly
dec tx
dec ty
inc lx
inc ly
dec bdrWid
cmp bdrWid, 0
je lp1Out
jmp lpOne
lp1Out:
; ------------
invoke CreatePen,0,1,btn_lo
mov hPen2, eax
invoke SelectObject,hDC,hPen2
mov hPen, eax
invoke DeleteObject,hPen
; ------------
pop bdrWid
pop ly
pop lx
pop ty
pop tx
lpTwo:
invoke MoveToEx,hDC,tx,ly,NULL
invoke LineTo,hDC,lx,ly
invoke MoveToEx,hDC,lx,ty,NULL
inc ly
invoke LineTo,hDC,lx,ly
dec ly
dec tx
dec ty
inc lx
inc ly
dec bdrWid
cmp bdrWid, 0
je lp2Out
jmp lpTwo
lp2Out:
; ------------
invoke SelectObject,hDC,hpenOld
invoke DeleteObject,hPen2
ret
Frame3D endp
; #########################################################################
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -