• 创建Win32图形界面应用程序


    没有什么比创建一个Win32图形界面应用程序能让Win32汇编初学者更兴奋的了!

    然而,对于像我这样没有代码便会陷入困境的人来说,看到下面的代码总能让人为之一振,百余行的代码使得Win32GUI编程并不是那么的恐怖

     

    [cpp] view plaincopy
     
    1. TITLE Demo.asm        
    2. ; ===============================================        
    3. ;       Author: 狼の禅        
    4. ;       Date:   20/07/2009        
    5. ; ===============================================        
    6.         .386        
    7.         .model flat,stdcall        
    8.         option casemap:none      
    9.                   
    10.         include windows.inc        
    11.         include user32.inc        
    12.         include kernel32.inc        
    13.         includelib user32.lib        
    14. ; -----------------------------------------------        
    15.         MENU_ABOUTAUTHOR    equ    1000     
    16. ; -----------------------------------------------        
    17.         WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD        
    18.         WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD        
    19. ; ===============================================        
    20. .data        
    21.         hInstance       dd 0    ;应用程序句柄     
    22.         hWnd            dd 0    ;窗口句柄     
    23.         hMenu           dd 0    ;菜单句柄     
    24.        
    25.         ClassName       db "Demo",0        
    26.         WindowName      db "Demo(狼の禅)",0        
    27.         MenuAbout       db "帮助(&H)", 0     
    28.         MenuAboutAuthor db "关于作者(&A)", 0     
    29.         Author          db "Author:狼の禅",0dh,"Date:   23/07/2009",0     
    30. ; ===============================================        
    31. .code        
    32. start:        
    33.         invoke GetModuleHandle,0    ;获取应用程序模块句柄     
    34.         mov hInstance,eax           ;保存应用程序句柄     
    35.         invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT        
    36.         invoke ExitProcess,eax      ;退出程序,并返回eax的值     
    37. ; ===============================================        
    38. WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD        
    39.         LOCAL wndclass:WNDCLASSEX        
    40.         LOCAL Msg:MSG        
    41.        
    42.         mov wndclass.cbSize,sizeof WNDCLASSEX        
    43.         mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW        
    44.         mov wndclass.lpfnWndProc,OFFSET WndProc        
    45.         mov wndclass.cbClsExtra,0        
    46.         mov wndclass.cbWndExtra,0        
    47.         mov eax,hInst        
    48.         mov wndclass.hInstance,eax        
    49.         mov wndclass.hbrBackground,COLOR_WINDOW+1        
    50.         mov wndclass.lpszMenuName,0        
    51.         mov wndclass.lpszClassName,OFFSET ClassName        
    52.         invoke LoadIcon,hInst,NULL        
    53.         mov wndclass.hIcon,eax        
    54.         invoke LoadCursor,0,IDC_ARROW        
    55.         mov wndclass.hCursor,eax        
    56.         mov wndclass.hIconSm,0        
    57.        
    58.         invoke RegisterClassEx,ADDR wndclass    ;注册用户定义的窗口类      
    59.         invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,        
    60.                               ADDR WindowName,        
    61.                               WS_OVERLAPPEDWINDOW,        
    62.                               200,50,500,300,        
    63.                               0,0,        
    64.                               hInst,0           ;创建窗口     
    65.         mov   hWnd,eax                          ;保存窗口句柄     
    66.         invoke ShowWindow,hWnd,SW_SHOWNORMAL    ;       
    67.         invoke UpdateWindow,hWnd        
    68. MessageLoop:        
    69.         invoke GetMessage,ADDR Msg,0,0,0        ;获取消息        
    70.         cmp eax,0        
    71.         je ExitProgram        
    72.         invoke TranslateMessage,ADDR Msg        ;转换键盘消息     
    73.         invoke DispatchMessage,ADDR Msg         ;分发消息     
    74.         jmp MessageLoop        
    75. ExitProgram:        
    76.         mov eax,Msg.wParam         
    77.         ret        
    78. WinMain endp        
    79. ; ===============================================        
    80. WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD        
    81.         local hPopMenu      ;一级菜单句柄     
    82.         .if uMsg == WM_CREATE        
    83.             invoke CreateMenu     
    84.             mov hMenu, eax     
    85.             .if eax     
    86.                 invoke CreatePopupMenu      ;创建一级菜单     
    87.                 mov hPopMenu, eax           ;保存一级菜单句柄     
    88.                 invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor   ;添加二级菜单     
    89.                 invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout                ;添加一级菜单     
    90.             .endif     
    91.             invoke SetMenu, hWin, hMenu     ;设置菜单     
    92.         .elseif uMsg == WM_DESTROY     
    93.             invoke PostQuitMessage,0        ;退出消息循环       
    94.         .elseif uMsg == WM_COMMAND     
    95.             .if wParam == MENU_ABOUTAUTHOR     
    96.                 invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK     
    97.             .endif     
    98.         .else       
    99.             invoke DefWindowProc,hWin,uMsg,wParam,lParam    ;调用默认消息处理函数     
    100.             ret        
    101.         .endif        
    102.         xor eax,eax        
    103.         ret        
    104. WndProc endp        
    105. ; ===============================================        
    106. end start      
    107. TITLE Demo.asm     
    108. ; ===============================================     
    109. ;       Author: 狼の禅     
    110. ;       Date:   20/07/2009     
    111. ; ===============================================     
    112.    .386     
    113.         .model flat,stdcall     
    114.         option casemap:none   
    115.                
    116.         include windows.inc     
    117.         include user32.inc     
    118.         include kernel32.inc     
    119.         includelib user32.lib     
    120. ; -----------------------------------------------     
    121.         MENU_ABOUTAUTHOR    equ    1000  
    122. ; -----------------------------------------------     
    123.         WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD     
    124.         WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD     
    125. ; ===============================================     
    126. .data     
    127.         hInstance   dd 0 ;应用程序句柄  
    128.         hWnd    dd 0 ;窗口句柄  
    129.         hMenu    dd 0 ;菜单句柄  
    130.   
    131.         ClassName   db "Demo",0     
    132.         WindowName   db "Demo(狼の禅)",0     
    133.    MenuAbout   db "帮助(&H)", 0  
    134.      MenuAboutAuthor db "关于作者(&A)", 0  
    135.      Author    db "Author:狼の禅",0dh,"Date:   23/07/2009",0  
    136. ; ===============================================     
    137. .code     
    138. start:     
    139.         invoke GetModuleHandle,0 ;获取应用程序模块句柄  
    140.         mov hInstance,eax    ;保存应用程序句柄  
    141.         invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT     
    142.         invoke ExitProcess,eax   ;退出程序,并返回eax的值  
    143. ; ===============================================     
    144. WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD     
    145.         LOCAL wndclass:WNDCLASSEX     
    146.         LOCAL Msg:MSG     
    147.   
    148.         mov wndclass.cbSize,sizeof WNDCLASSEX     
    149.         mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW     
    150.         mov wndclass.lpfnWndProc,OFFSET WndProc     
    151.         mov wndclass.cbClsExtra,0     
    152.         mov wndclass.cbWndExtra,0     
    153.         mov eax,hInst     
    154.         mov wndclass.hInstance,eax     
    155.         mov wndclass.hbrBackground,COLOR_WINDOW+1     
    156.         mov wndclass.lpszMenuName,0     
    157.         mov wndclass.lpszClassName,OFFSET ClassName     
    158.         invoke LoadIcon,hInst,NULL     
    159.         mov wndclass.hIcon,eax     
    160.         invoke LoadCursor,0,IDC_ARROW     
    161.         mov wndclass.hCursor,eax     
    162.         mov wndclass.hIconSm,0     
    163.   
    164.         invoke RegisterClassEx,ADDR wndclass ;注册用户定义的窗口类   
    165.         invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,     
    166.                               ADDR WindowName,     
    167.                               WS_OVERLAPPEDWINDOW,     
    168.                               200,50,500,300,     
    169.                               0,0,     
    170.                               hInst,0    ;创建窗口  
    171.         mov   hWnd,eax        ;保存窗口句柄  
    172.         invoke ShowWindow,hWnd,SW_SHOWNORMAL ;   
    173.         invoke UpdateWindow,hWnd     
    174. MessageLoop:     
    175.         invoke GetMessage,ADDR Msg,0,0,0   ;获取消息     
    176.         cmp eax,0     
    177.         je ExitProgram     
    178.         invoke TranslateMessage,ADDR Msg   ;转换键盘消息  
    179.         invoke DispatchMessage,ADDR Msg    ;分发消息  
    180.         jmp MessageLoop     
    181. ExitProgram:     
    182.         mov eax,Msg.wParam      
    183.         ret     
    184. WinMain endp     
    185. ; ===============================================     
    186. WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD     
    187.    local hPopMenu   ;一级菜单句柄  
    188.         .if uMsg == WM_CREATE     
    189.     invoke CreateMenu  
    190.             mov hMenu, eax  
    191.             .if eax  
    192.                 invoke CreatePopupMenu   ;创建一级菜单  
    193.                 mov hPopMenu, eax    ;保存一级菜单句柄  
    194.                 invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor ;添加二级菜单  
    195.                 invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout     ;添加一级菜单  
    196.             .endif  
    197.             invoke SetMenu, hWin, hMenu   ;设置菜单  
    198.         .elseif uMsg == WM_DESTROY  
    199.             invoke PostQuitMessage,0   ;退出消息循环   
    200.         .elseif uMsg == WM_COMMAND  
    201.     .if wParam == MENU_ABOUTAUTHOR  
    202.      invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK  
    203.     .endif  
    204.         .else   
    205.             invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用默认消息处理函数  
    206.             ret     
    207.         .endif     
    208.         xor eax,eax     
    209.         ret     
    210. WndProc endp     
    211. ; ===============================================     
    212. end start    

     

    如果假设好了开发环境,那么运行它就会看到下面的窗口,OK,成功了!

  • 相关阅读:
    MySQL 8.0.14版本新功能详解
    Uncaught TypeError: Right-hand side of 'instanceof' is not an object
    程序员快速技术提升之道
    Windows 10 cmd命令符的使用
    数据千万条,备份第一条:VFEmail被擦除所有数据面临关停
    netty-socketio 示例代码
    idea中 在接口中如何直接跳转到该接口的是实现类中?
    perl DBD处理超时问题
    springboot 启动配置文件配置
    Office Word 发布文章到博客园
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3261217.html
Copyright © 2020-2023  润新知