zoukankan      html  css  js  c++  java
  • 【win32汇编】0x04 第一个窗口程序

    第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程:

    start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环

    ( _ProcMain主要用于处理程序接受的消息 )

      1 ;模式定义
      2 ;>>>>>>>>>>>>>>>>>>>>>>>
      3 .386            ;需要的指令集 (80386)
      4 .model flat,stdcall
      5 option casemap:none
      6 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      7 ;Include 文件定义
      8 ;>>>>>>>>>>>>>>>>>>>>>>>>
      9 include windows.inc
     10 include user32.inc
     11 includelib user32.lib
     12 include kernel32.inc
     13 includelib kernel32.lib
     14 
     15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     16 ;数据段
     17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     18     .data?            ;未初始化
     19 hInstance dd    ?    ;本程序的句柄
     20 hWinMain  dd    ?    ;本程序主窗口
     21 
     22         .const
     23 szClassName    db    'MyClass',0            ;窗口名字
     24 szCaptionMain    db    'My first Window !',0    ;窗口标题栏文字
     25 szText        db    'Win32 Assembly, Simple and powerful !',0    ;窗口文字
     26 
     27 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     28 ;代码段
     29 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     30     .code
     31 ;********************************************************************
     32 ; 定义窗口过程
     33 ; hWnd:窗口句柄
     34 ; uWsg:消息标识
     35 ; wParm:消息附带参数
     36 ; lParam:消息附带参数
     37 ;********************************************************************
     38 ;uses伪操作在进入时自动加上push,退出时自动加上pop,保护这些寄存器,否则程序出错
     39 _ProcWinMain    proc    uses ebx edi esi hWnd,uMsg,wParam,lParam
     40         local    @stPs:PAINTSTRUCT    ;接受绘制窗口信息
     41         local    @stRect:RECT
     42         local    @hDc
     43         mov    eax,uMsg
     44         .if    eax ==    WM_PAINT    ;可以在showwindow或者updatewindow的时候获得这个消息,从而用这个消息来自己定制窗口
     45             invoke    BeginPaint,hWnd,addr @stPs
     46             mov    @hDc,eax    ;函数是否运行成功,为NULL表示运行失败
     47             invoke    GetClientRect,hWnd,addr @stRect    ;stRect获取窗口显示文本的信息
     48             ;绘制文本
     49             invoke    DrawText,@hDc,addr szText,-1,
     50                 addr @stRect,
     51                 DT_SINGLELINE or DT_CENTER or DT_VCENTER
     52             invoke    EndPaint,hWnd,addr @stPs
     53         .elseif    eax ==    WM_CLOSE
     54             invoke    DestroyWindow,hWinMain    ;摧毁窗口
     55             invoke    PostQuitMessage,NULL    ;退出码(必要)
     56         .else
     57             invoke    DefWindowProc,hWnd,uMsg,wParam,lParam    ;将不感兴趣的消息交给系统处理
     58             ret
     59         .endif
     60         
     61         xor eax,eax    ;清空eax为0
     62         ret            ;一般默认返回0表示处理信息成功
     63 _ProcWinMain endp
     64 
     65 ;********************************************************************
     66 ; main函数
     67 ;********************************************************************
     68 _WinMain    proc
     69         local @stWndClass:WNDCLASSEX    ;定义实体stWndClass
     70         local @stMsg:MSG                ;定义消息实体
     71         
     72         invoke GetModuleHandle,NULL        ;获取当前程序的句柄
     73         mov hInstance,eax                ;把获得的句柄赋值给hInstance
     74         invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;清零    
     75 ;********************************************************************
     76 ; 注册窗口类
     77 ;********************************************************************
     78         invoke LoadCursor,0,IDC_ARROW    ;加载光标
     79         mov @stWndClass.hCursor,eax    ;光标
     80         push hInstance
     81         pop @stWndClass.hInstance    ;窗口类所属模块
     82         mov @stWndClass.cbSize,sizeof WNDCLASSEX    ;WNDCLASSEX大小
     83         mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;窗口风格
     84         ;指定基于这个类建立的窗口过程地址(重要)
     85         mov @stWndClass.lpfnWndProc,offset _ProcWinMain
     86         mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1    ;窗口客户区背景色
     87         mov    @stWndClass.lpszClassName,offset szClassName;要建立的类的命名
     88         invoke    RegisterClassEx,addr @stWndClass    ;注册类 stWndClass
     89 ;********************************************************************
     90 ; 建立并显示窗口
     91 ;********************************************************************
     92         invoke CreateWindowEx,        ;创建一个窗口
     93             WS_EX_CLIENTEDGE,        ;有sunken edge 的窗口???
     94             offset szClassName,    ;窗口类的名字
     95             offset szCaptionMain,    ;窗口类的标题文字
     96             WS_OVERLAPPEDWINDOW,    ;窗口的一些属性
     97             100,100,600,400,        ;位置(x,y) 宽高(width,height)
     98             NULL,NULL,                ;可选项
     99             hInstance,NULL;            ;句柄,参数【可选】
    100         mov hWinMain,eax            ;把新建到的窗口的句柄给hWinMain
    101         invoke ShowWindow,hWinMain,SW_SHOWNORMAL    ;显示窗口,正常显示
    102         invoke    UpdateWindow,hWinMain                ;更新窗口的主要部分
    103 ;********************************************************************
    104 ; 消息循环
    105 ;********************************************************************
    106         .while TRUE
    107             invoke GetMessage,addr @stMsg,NULL,0,0
    108             .break .if eax == 0        ;如果点击了退出就结束程序
    109             invoke TranslateMessage,addr @stMsg    ;进行键盘消息的转换
    110             invoke DispatchMessage,addr @stMsg    ;将消息发送到对应窗口的过程处理函数中处理
    111         .endw
    112         ret
    113 _WinMain endp
    114 
    115 ;********************************************************************
    116 ; 程序入口地址
    117 ;********************************************************************
    118 start:
    119     call _WinMain
    120     invoke ExitProcess,NULL    ;退出程序
    121 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    122     end start
  • 相关阅读:
    0 RabbitMQ概念
    java 排序
    spring整合redis(基于redisTemplate)
    http之content-type
    http协议讲解
    Java8 lambda 以及 Lambda在集合中的使用
    java中decimalFormat格式化数值
    找出占用的端口进程ID,并且杀死该进程
    CSS
    标签
  • 原文地址:https://www.cnblogs.com/driedfish/p/5424203.html
Copyright © 2011-2022 走看看