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

📄 鼠标.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个字节缓冲区
form1  db   "您输入的键盘字符是 %c,ASCII码是 %x",0
char1  db   "提示",0
form2  db   "鼠标横坐标 %d,纵坐标 %d",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
;声明局部变量
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
jmp _SetAni
Mouse  db "aa.ani",0
_SetAni:
invoke LoadCursorFromFile,ADDR Mouse  
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
;窗口消息处理过程
WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD
.if uMsg == WM_DESTROY ;如果用户按了右上角的关闭按钮,处理该消息
invoke PostQuitMessage,NULL  ;向程序发送WM_QUIT消息

.elseif uMsg == WM_CREATE
    jmp _Create_Button
    ButnTxt1   db  "欢迎",0
ButnTxt2   db  "退出",0
    EditTxt    db  "欢迎使用升达软件",0
_Create_Button:
    invoke PushButton,ADDR ButnTxt1,hWin,30,70,48,26,500
    mov hButton1, eax
    invoke PushButton,ADDR ButnTxt2,hWin,110,70,48,26,501
    mov hButton2, eax
    invoke EditSl,ADDR EditTxt,20,30,250,20,hWin,701
    mov hEdit,eax
    invoke SetWindowLong,hEdit,GWL_WNDPROC,EditProc
mov lpEdit, eax   ;该变量在调用原消息处理过程CallWindowProc时需用到


  .elseif uMsg==WM_COMMAND
.if wParam==500            ;按钮"欢迎"的处理代码
jmp _note1
_inf0  db "你按了按钮欢迎",0 
_inf1  db "谢谢使用",0
_note1:
invoke SendMessage,hWin,WM_CHAR,31h,0 
;invoke MessageBox,hWin,ADDR _inf0,ADDR _inf1,MB_OK
.elseif wParam==501                 ;按钮"退出"的处理代码
invoke PostQuitMessage,NULL
.endif
 .elseif uMsg == WM_CHAR
    invoke wsprintf,offset buf1,offset form1,wParam,wParam
    invoke MessageBox,0,offset buf1,offset char1,MB_OK
   
  .elseif uMsg == WM_MOUSEMOVE  ;鼠标在该窗口上移动时发生
    xor edi,edi                   ;edi=0
    mov di,word ptr lParam        ;取lParam低16位到di,为鼠标横坐标
    mov ebx,lParam                
    shr ebx,16                   ;右移16位,得到鼠标纵坐标
    invoke wsprintf,offset buf1,offset form2,edi,ebx  ;将坐标按格式转换到buf1
    invoke SetWindowText,hEdit,ADDR buf1     

.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用缺省消息处理过程
ret
WndProc endp
PushButton proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD, wd:DWORD,
                ht:DWORD,ID:DWORD
jmp Button_Type
btnClass  db  "BUTTON",0
Button_Type:
invoke CreateWindowEx,0, ADDR btnClass,lpText, WS_CHILD or WS_VISIBLE,
            a,b,wd,ht,hParent,ID,hInstance,NULL
ret
PushButton endp
EditSl proc szMsg:DWORD,a:DWORD,b:DWORD, wd:DWORD,ht:DWORD,
               hParent:DWORD,ID:DWORD
jmp _CreateEdit
slEdit db "EDIT",0
_CreateEdit:
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slEdit,szMsg,
                WS_VISIBLE or WS_CHILDWINDOW or \
                ES_AUTOHSCROLL or ES_NOHIDESEL,
              a,b,wd,ht,hParent,ID,hInstance,NULL
ret
EditSl endp
EditProc proc uses ebx,hCtl   :DWORD,
                 uMsg   :DWORD,
                 wParam :DWORD,
                 lParam :DWORD
.if uMsg == WM_CHAR
   .if wParam < 30h     ;若键值小于30h,不是数字键,提醒后退出
     jmp _note00
   .endif
   .if wParam > 39h     ;若键值大于39h,不是数字键,提醒后退出
     jmp _note00
   .endif
.endif          
invoke CallWindowProc,lpEdit,hCtl,uMsg,wParam,lParam ;调用原来的消息处理过程
ret
  _inf00 db "只允许输入0到9的数字!",0
  _note00:
  invoke MessageBox,0,ADDR _inf00,NULL,MB_OK
  ret
EditProc endp

end start

⌨️ 快捷键说明

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