创建Win32图形界面应用程序
没有什么比创建一个Win32图形界面应用程序能让Win32汇编初学者更兴奋的了!
然而,对于像我这样没有代码便会陷入困境的人来说,看到下面的代码总能让人为之一振,百余行的代码使得Win32GUI编程并不是那么的恐怖
- TITLE Demo.asm
- ; ===============================================
- ; Author: 狼の禅
- ; Date: 20/07/2009
- ; ===============================================
- .386
- .model flat,stdcall
- option casemap:none
- include windows.inc
- include user32.inc
- include kernel32.inc
- includelib user32.lib
- ; -----------------------------------------------
- MENU_ABOUTAUTHOR equ 1000
- ; -----------------------------------------------
- WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
- WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
- ; ===============================================
- .data
- hInstance dd 0 ;应用程序句柄
- hWnd dd 0 ;窗口句柄
- hMenu dd 0 ;菜单句柄
- ClassName db "Demo",0
- WindowName db "Demo(狼の禅)",0
- MenuAbout db "帮助(&H)", 0
- MenuAboutAuthor db "关于作者(&A)", 0
- Author db "Author:狼の禅",0dh,"Date: 23/07/2009",0
- ; ===============================================
- .code
- start:
- invoke GetModuleHandle,0 ;获取应用程序模块句柄
- mov hInstance,eax ;保存应用程序句柄
- invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
- invoke ExitProcess,eax ;退出程序,并返回eax的值
- ; ===============================================
- WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD
- LOCAL wndclass:WNDCLASSEX
- LOCAL Msg:MSG
- mov wndclass.cbSize,sizeof WNDCLASSEX
- mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
- mov wndclass.lpfnWndProc,OFFSET WndProc
- mov wndclass.cbClsExtra,0
- mov wndclass.cbWndExtra,0
- mov eax,hInst
- mov wndclass.hInstance,eax
- mov wndclass.hbrBackground,COLOR_WINDOW+1
- mov wndclass.lpszMenuName,0
- mov wndclass.lpszClassName,OFFSET ClassName
- invoke LoadIcon,hInst,NULL
- mov wndclass.hIcon,eax
- invoke LoadCursor,0,IDC_ARROW
- mov wndclass.hCursor,eax
- mov wndclass.hIconSm,0
- invoke RegisterClassEx,ADDR wndclass ;注册用户定义的窗口类
- invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,
- ADDR WindowName,
- WS_OVERLAPPEDWINDOW,
- 200,50,500,300,
- 0,0,
- hInst,0 ;创建窗口
- mov hWnd,eax ;保存窗口句柄
- invoke ShowWindow,hWnd,SW_SHOWNORMAL ;
- invoke UpdateWindow,hWnd
- MessageLoop:
- invoke GetMessage,ADDR Msg,0,0,0 ;获取消息
- cmp eax,0
- je ExitProgram
- invoke TranslateMessage,ADDR Msg ;转换键盘消息
- invoke DispatchMessage,ADDR Msg ;分发消息
- jmp MessageLoop
- ExitProgram:
- mov eax,Msg.wParam
- ret
- WinMain endp
- ; ===============================================
- WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
- local hPopMenu ;一级菜单句柄
- .if uMsg == WM_CREATE
- invoke CreateMenu
- mov hMenu, eax
- .if eax
- invoke CreatePopupMenu ;创建一级菜单
- mov hPopMenu, eax ;保存一级菜单句柄
- invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor ;添加二级菜单
- invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout ;添加一级菜单
- .endif
- invoke SetMenu, hWin, hMenu ;设置菜单
- .elseif uMsg == WM_DESTROY
- invoke PostQuitMessage,0 ;退出消息循环
- .elseif uMsg == WM_COMMAND
- .if wParam == MENU_ABOUTAUTHOR
- invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK
- .endif
- .else
- invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用默认消息处理函数
- ret
- .endif
- xor eax,eax
- ret
- WndProc endp
- ; ===============================================
- end start
- TITLE Demo.asm
- ; ===============================================
- ; Author: 狼の禅
- ; Date: 20/07/2009
- ; ===============================================
- .386
- .model flat,stdcall
- option casemap:none
- include windows.inc
- include user32.inc
- include kernel32.inc
- includelib user32.lib
- ; -----------------------------------------------
- MENU_ABOUTAUTHOR equ 1000
- ; -----------------------------------------------
- WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
- WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
- ; ===============================================
- .data
- hInstance dd 0 ;应用程序句柄
- hWnd dd 0 ;窗口句柄
- hMenu dd 0 ;菜单句柄
- ClassName db "Demo",0
- WindowName db "Demo(狼の禅)",0
- MenuAbout db "帮助(&H)", 0
- MenuAboutAuthor db "关于作者(&A)", 0
- Author db "Author:狼の禅",0dh,"Date: 23/07/2009",0
- ; ===============================================
- .code
- start:
- invoke GetModuleHandle,0 ;获取应用程序模块句柄
- mov hInstance,eax ;保存应用程序句柄
- invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
- invoke ExitProcess,eax ;退出程序,并返回eax的值
- ; ===============================================
- WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD
- LOCAL wndclass:WNDCLASSEX
- LOCAL Msg:MSG
- mov wndclass.cbSize,sizeof WNDCLASSEX
- mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
- mov wndclass.lpfnWndProc,OFFSET WndProc
- mov wndclass.cbClsExtra,0
- mov wndclass.cbWndExtra,0
- mov eax,hInst
- mov wndclass.hInstance,eax
- mov wndclass.hbrBackground,COLOR_WINDOW+1
- mov wndclass.lpszMenuName,0
- mov wndclass.lpszClassName,OFFSET ClassName
- invoke LoadIcon,hInst,NULL
- mov wndclass.hIcon,eax
- invoke LoadCursor,0,IDC_ARROW
- mov wndclass.hCursor,eax
- mov wndclass.hIconSm,0
- invoke RegisterClassEx,ADDR wndclass ;注册用户定义的窗口类
- invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,
- ADDR WindowName,
- WS_OVERLAPPEDWINDOW,
- 200,50,500,300,
- 0,0,
- hInst,0 ;创建窗口
- mov hWnd,eax ;保存窗口句柄
- invoke ShowWindow,hWnd,SW_SHOWNORMAL ;
- invoke UpdateWindow,hWnd
- MessageLoop:
- invoke GetMessage,ADDR Msg,0,0,0 ;获取消息
- cmp eax,0
- je ExitProgram
- invoke TranslateMessage,ADDR Msg ;转换键盘消息
- invoke DispatchMessage,ADDR Msg ;分发消息
- jmp MessageLoop
- ExitProgram:
- mov eax,Msg.wParam
- ret
- WinMain endp
- ; ===============================================
- WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
- local hPopMenu ;一级菜单句柄
- .if uMsg == WM_CREATE
- invoke CreateMenu
- mov hMenu, eax
- .if eax
- invoke CreatePopupMenu ;创建一级菜单
- mov hPopMenu, eax ;保存一级菜单句柄
- invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor ;添加二级菜单
- invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout ;添加一级菜单
- .endif
- invoke SetMenu, hWin, hMenu ;设置菜单
- .elseif uMsg == WM_DESTROY
- invoke PostQuitMessage,0 ;退出消息循环
- .elseif uMsg == WM_COMMAND
- .if wParam == MENU_ABOUTAUTHOR
- invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK
- .endif
- .else
- invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用默认消息处理函数
- ret
- .endif
- xor eax,eax
- ret
- WndProc endp
- ; ===============================================
- end start
如果假设好了开发环境,那么运行它就会看到下面的窗口,OK,成功了!
创建Win32图形界面应用程序的更多相关文章
- 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析
老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...
- Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序
自:http://blog.csdn.net/neofung/article/details/6574002 Ubuntu上安装和使用SSH 网上有很多介绍在Ubuntu下开启SSH服务的文章,但大 ...
- Java计算器的图形界面应用程序
JAVA计算器的图形界面应用程序 题目简介: 整体分析: 实验代码: /*部分使用插件做界面*/ import java.awt.EventQueue; import javax.swing.JB ...
- PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法大全及对比分析
一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应用程序启动后,事件处理就是应用的主循环,事件处理负责接收事件.分发事件.接收应用处理事件的返回结果, ...
- 转:Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
一.原理Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与显示器.键盘和鼠标等输入输出设备的交互,每个有GUI的应用程序都通过网络协议 ...
- Linux非图形界面安装程序
安装Linux程序的时候一般不会调取图形界面,这样输错内容,返回上一步时需要使用命令 previous ,相应的exit 与 next..在中文操作的时候,不会提示,所以要记住 在安装过程中,我们可能 ...
- 第七章、PyQt图形界面应用程序的事件捕获方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应 ...
- 在windows下使用Qt5开发GTK3图形界面应用程序
首先,去MSYS2官网下载MSYS2环境并安装在C:/mysys64下,我安装的是64位的. 进入MSYS命令行执行: pacman -S mingw-w64-x86_64-gtk3 pacman - ...
- Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
安装X Window yum groupinstall 'X Window System'
随机推荐
- IOS之富文本编辑
之前做项目时遇到一个问题: 使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...
- memcache和memcached之间的区别和联系
memcache和memcached区别: Memcache是什么?Memcache是一个自由和开放源代码.高性能.分配的内存对象缓存系统.用于加速动态web应用程序,减轻数据库负载.它可以应对任意多 ...
- 处理Block中的self问题(Capturing 'self' strongly in this block is likely to lead to a retain cycle)
警告:ARC Retain Cycle Capturing 'self' strongly in this block is likely to lead to a retain cycle 代码: ...
- UVa 524 - Prime Ring Problem
题目大意:输入正整数n,把整数1,2...,n组成一个环,使得相邻两个整数之和均为素数.输出时从整数1开始逆时针(题目中说的不是很明白??)排列.同一个环应恰好输出一次. 枚举,并在枚举每一个数是进行 ...
- Compilation err ororg.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
严重: Compilation errororg.eclipse.jdt.internal.compiler.classfmt.ClassFormatExceptionat org.eclipse.j ...
- imageX及其安装windows
/capture 将卷映像捕获到新 WIM 文件中(备份成wim) imagex /capture g: e:\7setted.wim "Drive G" /apply ...
- Grunt构建工具能做哪些事?
Grunt到底有什么作用?一般用来干嘛? 很多前端的工作,包括Less编译.javascript压缩.Css压缩等零零碎碎的工作, 都可以让Grunt来做. 实际上在项目开发中,一般是前端代码 与 后 ...
- redhat5安装phantomjs
Linux 64-bit Download phantomjs-2.1.1-linux-x86_64.tar.bz2 (22.3 MB) and extract the content. Note: ...
- WinAPI: GetClassName - 获取指定窗口的类名
WinAPI: GetClassName - 获取指定窗口的类名 //声明: GetClassName( hWnd: HWND; {指定窗口句柄} lpClassName: PChar; {缓冲区} ...
- Activity的生命周期与加载模式——Activity的4种加载模式
配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性支持如下4个属性值. standard:标准模式,这是默认的加载模式. sing ...