zoukankan      html  css  js  c++  java
  • 汇编语言学习笔记接收键盘消息

    代码
    .386
    .model flat,stdcall;内存平坦,参数传递约定
    option casemap:none;大小写敏感

    ;;;;;;引用一些必要的数据
    include D:\masm32\include\windows.inc
    include D:\masm32\include\user32.inc
    include \masm32\include\gdi32.inc
    includelib D:\masm32\lib\user32.lib
    include D:\masm32\include\kernel32.inc
    includelib D:\masm32\lib\kernel32.lib
    includelib \masm32\lib\gdi32.lib

    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函数声明,将在后面进行函数的定义

    RGB macro red,green,blue;宏定义
    xor eax,eax;eax置零
    mov ah,blue
    shl eax,
    8;左移8位
    mov ah,green
    mov al,red
    endm

    ;;;;;;已定义数据的数据段
    .DATA
    ClassName db
    "SimpleWinClass",0
    AppName db
    "Our First Window",0
    OurText db
    "hello world",0
    FontName db
    "script",0
    char WPARAM 20h

    ;;;;;;未定义数据的数据段
    .DATA
    ?
    hInstance HINSTANCE
    ?
    CommandLine LPSTR
    ?

    ;;;;;;代码段
    .CODE
    start: ;程序的入口与end start对应
    invoke GetModuleHandle,NULL;调用API函数获取应用程序句柄并把句柄存入eax寄存器
    mov hInstance,eax
    invoke GetCommandLine;获取命令行的字符串指针
    mov CommandLine,eax
    invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT;调用子函数,也就是前面我们定义的函数
    invoke ExitProcess,eax;退出程序

    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD;子函数的定义,包括函数名称,参数类型,参数名称
    ;子程序的开始必须先定义该子程序用到的变量
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd:HWND
    ;初始化窗口类,这个窗口类描述我们的窗口长的什么样子
    mov wc.cbSize,SIZEOF WNDCLASSEX;窗口类结构将占用多少个字节
    mov wc.style,CS_HREDRAW or CS_VREDRAW
    mov wc.lpfnWndProc,OFFSET WndProc
    mov wc.cbClsExtra,NULL
    mov wc.cbWndExtra,NULL
    push hInstance
    pop wc.hInstance
    mov wc.hbrBackground,COLOR_WINDOW
    +1
    mov wc.lpszMenuName,NULL
    mov wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION;获取一个系统图标
    mov wc.hIcon,eax
    mov wc.hIconSm,eax
    invoke LoadCursor,NULL,IDC_ARROW;获取一个系统光标
    mov wc.hCursor,eax
    invoke RegisterClassEx,addr wc;注册窗体
    invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;创建窗体
    mov hwnd,eax;保存窗口句柄
    invoke ShowWindow,hwnd,CmdShow;显示窗口
    invoke UpdateWindow,hwnd;刷新窗口

    ;开始消息循环
    .WHILE TRUE
    invoke GetMessage,ADDR msg,NULL,
    0,0;获取消息队列中的消息
    .BREAK .IF (
    !eax);如果获取的消息为WM_QUIT就退出消息循环
    invoke TranslateMessage,ADDR msg;按键消息的转义
    invoke DispatchMessage,ADDR msg;把消息发送到负责消息处理的函数,回调方法
    .ENDW
    mov eax,msg.wParam;把退出的消息代码码放到EAX里然后回到主函数
    ret
    WinMain endp

    WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息处理函数,此函数可以随便命名
    LOCAL hdc:HDC
    LOCAL ps:PAINTSTRUCT
    LOCAL rect:RECT
    LOCAL hfont:HFONT
    .IF uMsg
    == WM_DESTROY;销毁窗口的消息
    invoke PostQuitMessage,NULL
    .ELSEIF uMsg
    == WM_CHAR
    push wParam
    pop
    char
    invoke InvalidateRect,hWnd,NULL,TRUE;使客户区无效,后系统会发出WM_PAINT消息
    .ELSEIF uMsg
    == WM_PAINT
    invoke BeginPaint,hWnd,ADDR ps
    mov hdc,eax
    invoke CreateFont,
    64,56,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,ADDR FontName
    invoke SelectObject,hdc,eax;把指向字体的句柄放入设备环境
    mov hfont,eax
    RGB
    200,200,50
    invoke SetTextColor,hdc,eax;设置文本颜色
    RGB
    0,0,255
    invoke SetBkColor,hdc,eax;设置文本背景颜色
    invoke GetClientRect,hWnd,ADDR rect;得到当前窗体的大小
    ;invoke TextOut,hdc,
    0,0,ADDR OurText,SIZEOF OurText;写文本
    invoke DrawText,hdc,ADDR
    char,-1,ADDR rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER;画文本
    ;invoke SelectObject,hdc,hfont;如果是text
    out 则必须调用这一句
    invoke EndPaint,hWnd,ADDR ps;释放环境句柄
    .ELSE
    invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默认的消息处理函数
    ret;退出此子程序
    .ENDIF
    xor eax,eax;eax置零
    ret
    WndProc endp
    end start
  • 相关阅读:
    CSS文字的处理
    typeof 检测变量的数据类型
    BZOJ 1257: [CQOI2007]余数之和
    BZOJ 1218: [HNOI2003]激光炸弹
    BZOJ 3251: 树上三角形
    BZOJ 3916: [Baltic2014]friends
    BZOJ 1610: [Usaco2008 Feb]Line连线游戏 暴力
    BZOJ 1593 [Usaco2008 Feb]Hotel 旅馆 双倍经验,线段树
    BZOJ 1096 [ZJOI2007]仓库建设 BZOJ 3437 小P的牧场 BZOJ 3156 防御准备 斜率优化dp
    BZOJ 2582 : Bovine Alliance DFS
  • 原文地址:https://www.cnblogs.com/liulun/p/1649474.html
Copyright © 2011-2022 走看看