汇编语言学习笔记-创建最基本的windows窗体

1
如果你不熟悉开发环境的搭建请看此文:
http://www.cnblogs.com/liulun/archive/2009/12/26/1632985.html
2
如果你看了此文的所有注释仍看不懂,请暂且不要再看本系列的其他文章了,先学学WINDOWS API的相关知识吧
3
以上代码摘自一个汇编语言全接触的CHM 是一个名叫Lxx的前辈翻译的
4
希望得到大家的支持

.386
.model flat,stdcall;内存平坦,参数传递约定
option casemap:none;大小写敏感

;;;;;;引用一些必要的数据
include    D:\masm32\include\windows.inc
include    D:\masm32\include\user32.inc
includelib    D:\masm32\lib\user32.lib
include    D:\masm32\include\kernel32.inc
includelib    D:\masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函数声明,将在后面进行函数的定义

;;;;;;已定义数据的数据段
.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "hello world",0

;;;;;;未定义数据的数据段
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?

;;;;;;代码段
.CODE
start:     ;程序的入口与end start对应
invoke GetModuleHandle,NULL;调用API函数获取应用程序句柄并把句柄存入eax寄存器
mov hInstance,eax
invoke GetCommandLine;获取命令行的字符串指针
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT;调用子函数,也就是前面我们定义的函数
invoke ExitProcess,eax;退出程序

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD;子函数的定义,包括函数名称,参数类型,参数名称
;子程序的开始必须先定义该子程序用到的变量
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
;初始化窗口类,这个窗口类描述我们的窗口长的什么样子
mov wc.cbSize,SIZEOF WNDCLASSEX;窗口类结构将占用多少个字节
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION;获取一个系统图标
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW;获取一个系统光标
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc;注册窗体
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;创建窗体
mov hwnd,eax;保存窗口句柄
invoke ShowWindow,hwnd,CmdShow;显示窗口
invoke UpdateWindow,hwnd;刷新窗口

;开始消息循环
.WHILE TRUE
invoke GetMessage,ADDR msg,NULL,0,0;获取消息队列中的消息
.BREAK .IF (!eax);如果获取的消息为WM_QUIT就退出消息循环
invoke TranslateMessage,ADDR msg;按键消息的转义
invoke DispatchMessage,ADDR msg;把消息发送到负责消息处理的函数,回调方法
.ENDW
mov eax,msg.wParam;把退出的消息代码码放到EAX里然后回到主函数
ret
WinMain endp

WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息处理函数,此函数可以随便命名
.IF uMsg == WM_DESTROY;销毁窗口的消息
invoke PostQuitMessage,NULL
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默认的消息处理函数
ret;退出此子程序
.ENDIF
xor eax,eax;eax置零
ret
WndProc endp
end start
时间: 2024-10-25 11:33:13

汇编语言学习笔记-创建最基本的windows窗体的相关文章

《maven实战》学习笔记2——maven安装(windows和eclipse插件)

前言 由于我的工作中开发环境就是windows,IDE是eclipse,因此安装也只涉及和记录这两部分,在看书和动手的过程也就直接跳过其他部分. 笔记 windows中maven的安装 安装条件 maven依赖于java,因此安装和使用maven,要先确保已安装了jdk并配置好jdk的环境变量. 检查jdk是否安装并配好环境变量,可以再windows的cmd窗口执行java -version查看,如果如下所示,则证明jdk安装和配置正确. C:\Users\tzx>java -version j

angularJS学习笔记:创建自定义angularJS指令基础篇

AngularJS提供了很多指令可以帮助我们操作DOM.处理事件.数据绑定.绑定控制器与作用域(ngView)等等.例如ngClick.ngShow.ngHide.ngRepeat以及其它很多AngularJS核心的指令都可以帮助我们很轻松的使用这个框架. 虽然内置的指令已经覆盖了大部分的使用场景,但在实际使用中为了简化操作或组件重用等我们经常需要创建自己的指令.在这个系列的文章中我将一步步带你了解AngularJS指令是如何工作的,以及如何开始使用/创建它们. 在这个系列的文章中我们假定你已经

WinApi学习笔记-创建进程

#include <windows.h> #include <stdio.h> #include <iostream> DWORD CreateChildProcess(LPSTR szChildProcessCmd); int main() { CreateChildProcess("Child.exe"); } DWORD CreateChildProcess(LPSTR szChildProcessCmd) { //启动信息结构变量 START

汇编语言学习笔记-使用窗体控件

代码 .386.model flat,stdcall;内存平坦,参数传递约定option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据include D:\masm32\include\windows.incinclude D:\masm32\include\user32.incinclude \masm32\include\gdi32.inc includelib D:\masm32\lib\user32.libinclude D:\masm32\include\ker

WindowsApi学习笔记-创建一个简单的窗口

#include <windows.h> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //Win16留下的废物 LPSTR lpCmdLine, //命令行参数 int nCmdShow //主窗口初始

汇编语言学习笔记-在窗口打印文本

代码 .386.model flat,stdcall;内存平坦,参数传递约定option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据include D:\masm32\include\windows.incinclude D:\masm32\include\user32.incincludelib D:\masm32\lib\user32.libinclude D:\masm32\include\kernel32.incincludelib D:\masm32\lib\

汇编语言学习笔记-接收鼠标消息

代码 .386.model flat,stdcall;内存平坦,参数传递约定option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据include D:\masm32\include\windows.incinclude D:\masm32\include\user32.incinclude \masm32\include\gdi32.inc includelib D:\masm32\lib\user32.libinclude D:\masm32\include\ker

汇编语言学习笔记-按指定的字体输出文本

代码 .386.model flat,stdcall;内存平坦,参数传递约定option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据include D:\masm32\include\windows.incinclude D:\masm32\include\user32.incinclude \masm32\include\gdi32.inc includelib D:\masm32\lib\user32.libinclude D:\masm32\include\ker

汇编语言学习笔记-接收键盘消息

代码 .386.model flat,stdcall;内存平坦,参数传递约定option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据include D:\masm32\include\windows.incinclude D:\masm32\include\user32.incinclude \masm32\include\gdi32.inc includelib D:\masm32\lib\user32.libinclude D:\masm32\include\ker