创建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,成功了!

posted @ 2013-08-16 03:03  herizai007  阅读(791)  评论(0编辑  收藏  举报