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

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

创建Win32图形界面应用程序的更多相关文章

  1. 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析

    老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...

  2. Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序

    自:http://blog.csdn.net/neofung/article/details/6574002 Ubuntu上安装和使用SSH  网上有很多介绍在Ubuntu下开启SSH服务的文章,但大 ...

  3. Java计算器的图形界面应用程序

      JAVA计算器的图形界面应用程序 题目简介: 整体分析: 实验代码: /*部分使用插件做界面*/ import java.awt.EventQueue; import javax.swing.JB ...

  4. PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法大全及对比分析

    一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应用程序启动后,事件处理就是应用的主循环,事件处理负责接收事件.分发事件.接收应用处理事件的返回结果, ...

  5. 转:Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序

    一.原理Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与显示器.键盘和鼠标等输入输出设备的交互,每个有GUI的应用程序都通过网络协议 ...

  6. Linux非图形界面安装程序

    安装Linux程序的时候一般不会调取图形界面,这样输错内容,返回上一步时需要使用命令 previous ,相应的exit 与 next..在中文操作的时候,不会提示,所以要记住 在安装过程中,我们可能 ...

  7. 第七章、PyQt图形界面应用程序的事件捕获方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应 ...

  8. 在windows下使用Qt5开发GTK3图形界面应用程序

    首先,去MSYS2官网下载MSYS2环境并安装在C:/mysys64下,我安装的是64位的. 进入MSYS命令行执行: pacman -S mingw-w64-x86_64-gtk3 pacman - ...

  9. Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序

    安装X Window yum groupinstall 'X Window System'

随机推荐

  1. js中的 substring和substr方法

    原文: http://www.cnblogs.com/chinafine/archive/2009/02/26/1398771.html 1.substring 方法 定义和用法 substring ...

  2. jstree使用小结(一)

    项目中用到tree结构,使用了jstree做个笔记如下: 1. 官网: http://www.jstree.com/    有时候打不开,那就只能等打得开的时候再看了...O(∩_∩)O [PS: 一 ...

  3. UVa 11790 - Murcia's Skyline

    题目大意:给一个建筑的序列,建筑用高度和宽度描述,找出按高度的LIS和LDS,最长XX子序列的长度按照序列中建筑的宽度和进行计算. 其实就是带权的最长XX子序列问题,原来是按个数计算,每个数权都是1, ...

  4. 安装及配置jdk和tomcat

    系统变量 新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(如是 E:\Java\jdk1.7.0_25) 系统变量→找到 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\ ...

  5. sql server mdf碎片级数据库修复,数据库碎片级提取

    sql server mdf碎片级数据库修复,数据库碎片级提取   大家都知道MDF数据库文件一般都比较大,在磁盘中往往被存放到不连续的逻辑簇中,久而久之就形成了文件碎片,当文件被误删除或者格式化后, ...

  6. Python3基础 map 与 lambda表达式配合 将指定系列元素乘2

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  7. 1833: [ZJOI2010]count 数字计数

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2951  Solved: 1307[Submit][ ...

  8. Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask

    1.添加布局文件:activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  9. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  10. JS 禁止刷新和右键

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...