⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 作图.asm

📁 DOS_Windows汇编语言程序设计教程
💻 ASM
字号:
.386
.model flat, stdcall
option casemap :none                 ;case sensitive
include \masm32\include\windows.inc  ;系统常量定义
include \masm32\include\kernel32.inc ;使用的多个API声明在该文件
include \masm32\include\user32.inc   ;使用的多个API声明在该文件
include \masm32\include\gdi32.inc   ;使用的多个API声明在该文件
includelib \masm32\lib\gdi32.lib

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib    
;定义的过程声明
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
PushButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
EditSl PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
EditProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data           ;数据区
szDisplayName db "3D Frames",0
szClassName   db "Template_Class",0
CommandLine   dd 0
hWnd          dd 0
hInstance     dd 0
hButton1   dd  0
hButton2   dd  0
hEdit      dd  0
lpEdit     dd  0
buf1   db  80 dup(0)   ;定义80个字节缓冲区

.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
;声明局部变量
LOCAL wc   :WNDCLASSEX     ;窗口类结构
LOCAL msg  :MSG            ;消息结构
LOCAL Wwd  :DWORD          ;窗口宽度(像素为单位)
LOCAL Wht  :DWORD          ;窗口高度
LOCAL Wtx  :DWORD          ;窗口横坐标(左上角为0点,从左向右)
LOCAL Wty  :DWORD          ;窗口纵坐标(从上向下)
;填充窗口类结构变量
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
mov eax,hInst
mov wc.hInstance,      eax               ;填写实例句柄
mov wc.hbrBackground,  COLOR_BTNFACE+1   ;窗口背景颜色
mov wc.lpszMenuName,   NULL              ;菜单名,无
mov wc.lpszClassName,  offset szClassName   ;窗口类名
invoke LoadIcon,hInst,500                   ;装载图标
mov wc.hIcon,          eax
invoke LoadCursor,NULL,IDC_ARROW          
mov wc.hCursor,        eax               
             ;装载光标
mov wc.hIconSm,        0                    ;小光标
invoke RegisterClassEx, ADDR wc            ;用窗口类结构变量注册窗口
;按下面大小和位置建立窗口
mov Wwd, 500
mov Wht, 350
mov Wtx, 300 
mov Wty, 200 
invoke CreateWindowEx,WS_EX_LEFT,ADDR szClassName, ADDR szDisplayName,\
WS_OVERLAPPEDWINDOW,Wtx,Wty,Wwd,Wht,NULL,NULL, hInst,NULL ;建立窗口
mov   hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL   ;按正常大小显示窗口
invoke UpdateWindow,hWnd              ;刷新窗口客户区
;invoke CreateRoundRectRgn,0,0,Wwd,Wht,Wwd,Wht
;invoke SetWindowRgn,hWnd,eax,TRUE 
 

;消息循环
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ;从消息队列中获取本程序的消息到结构msg
cmp eax, 0          ;GetMessage接收到消息WM_QUIT,返回0
je ExitLoop
invoke TranslateMessage, ADDR msg     ;转换键盘消息
invoke DispatchMessage,  ADDR msg     ;分发消息到窗口消息处理过程WndProc
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret 
WinMain endp
;窗口消息处理过程
Frame3D proc hDC:DWORD,tx:DWORD,ty:DWORD,lx:DWORD,ly:DWORD,bdrWid:DWORD
LOCAL btn_hi   :DWORD
LOCAL btn_lo   :DWORD
LOCAL hPen     :DWORD
LOCAL hPen2    :DWORD
LOCAL hpenOld  :DWORD
invoke GetSysColor,COLOR_BTNHIGHLIGHT  ;获得当前系统的三维高亮度色
mov btn_hi, eax
invoke GetSysColor,COLOR_BTNSHADOW     ;获得当前系统的三维低亮度色
mov btn_lo, eax
invoke CreatePen,0,1,btn_hi            ;以高亮度颜色建立画笔
mov hPen, eax                         ;hPen为画笔句柄
invoke SelectObject,hDC,hPen 
;把一个对象(位图、画笔、画刷等)选入指定的设备描述表
mov hpenOld, eax                       ;保存以前的画笔对象
; ------------------------------------
;保存这些参数供后面使用
; ------------------------------------
push tx
push ty
push lx
push ly
push bdrWid          
lpOne:                   ;以高亮度色画两根上方水平线和两根左边竖直线
invoke MoveToEx,hDC,tx,ty,NULL   ;将画线的点移动到(tx,ty)
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        ;bdrWid=0循环结束
jmp lpOne         ;否则,再画一根线
lp1Out:
; ------------
invoke CreatePen,0,1,btn_lo     ;以高亮度颜色建立画笔
mov hPen2, eax                  ;hPen2为画笔句柄
invoke SelectObject,hDC,hPen2   
;把一个对象hPen2(位图、画笔、画刷等)选入指定的设备描述表hDC
mov hPen, eax
invoke DeleteObject,hPen        ;销毁原来的画笔对象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         ;bdrWid=0循环结束
jmp lpTwo         ;否则,再画一根线
lp2Out:
; ------------
invoke SelectObject,hDC,hpenOld  ;恢复原来的画笔
invoke DeleteObject,hPen2        ;删除画笔对象
ret
Frame3D endp

WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD
           LOCAL Rct      :RECT   
LOCAL hDC  :DWORD      
LOCAL Ps   :PAINTSTRUCT  

.if uMsg == WM_DESTROY ;如果用户按了右上角的关闭按钮,处理该消息
invoke PostQuitMessage,NULL  ;向程序发送WM_QUIT消息

 
   
 
 
.elseif uMsg == WM_PAINT     
invoke BeginPaint,hWin,ADDR Ps
mov hDC, eax
invoke GetClientRect,hWin,ADDR Rct   ;取窗口客户区大小到结构Rct
add Rct.left,   1                    ;左上角横坐标加1
add Rct.top,    1                    ;左上角纵坐标加1
sub Rct.right,  1                    ;右下角横坐标减1
sub Rct.bottom, 1                   ;右下角纵坐标减1
;在修改后的Rct画线
invoke Frame3D,hDC,Rct.left,Rct.top,Rct.right,Rct.bottom,2
add Rct.left,   4    ;左上角横坐标加4
add Rct.top,    4    ;左上角纵坐标加4
sub Rct.right,  4    ;右下角横坐标减4
sub Rct.bottom, 4    ;右下角纵坐标减4
;在修改后的Rct画线
invoke Frame3D,hDC,Rct.left,Rct.top,Rct.right,Rct.bottom,2
invoke EndPaint,hWin,ADDR Ps
xor eax,eax

.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用缺省消息处理过程
ret
WndProc endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -