汇编教程之创建简单的窗口

在本课中我们将写一个 Windows 程序,它会在桌面显示一个标准的窗口。

理论:

Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows Gui 函数。其实这对用户和程序员来说都有好处,对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。对程序员来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的。当然至于具体地写程序对于程序员来说还是有难度的。为了创建基于窗口的应用程序,必须严格遵守规范。作到这一点并不难,只要用模块化或面向对象的编程方法即可。

下面我就列出在桌面显示一个窗口的几个步骤:

得到您应用程序的句柄(必需);

得到命令行参数(如果您想从命令行得到参数,可选);

注册窗口类(必需,除非您使用 Windows 预定义的窗口类,如 MessageBox 或 dialog box;

产生窗口(必需);

在桌面显示窗口(必需,除非您不想立即显示它);

刷新窗口客户区;

进入无限的获取窗口消息的循环;

如果有消息到达,由负责该窗口的窗口回调函数处理;

如果用户关闭窗口,进行退出处理。

相对于单用户的 DOS 下的编程来说,Windows 下的程序框架结构是相当复杂的。但是 Windows 和 DOS 在系统架构上是截然不同的。Windows 是一个多任务的操作系统,故系统中同时有多个应用程序彼此协同运行。这就要求 Windows 程序员必须严格遵守编程规范,并养成良好的编程风格。

内容:

下面是我们简单的窗口程序的源代码。在进入复杂的细节前,我将提纲挈领地指出几点要点:

您应当把程序中要用到的所有常量和结构体的声明放到一个头文件中,并且在源程序的开始处包含这个头文件。这么做将会节省您大量的时间,也免得一次又一次的敲键盘。目前,最完善的头文件是 hutch 写的,您可以到 hutch 或我的网站下载。您也可以定义您自己的常量和结构体,但最好把它们放到独立的头文件中

用 includelib 指令,包含您的程序要引用的库文件,譬如:若您的程序要调用 "MessageBox", 您就应当在源文件中加入如下一行: includelib user32.lib 这条语句告诉 MASM 您的程序将要用到一些引入库。如果您不止引用一个库,只要简单地加入 includelib 语句,不要担心链接器如何处理这么多的库,只要在链接时用链接开关 /LIBPATH 指明库所在的路径即可。

在其它地方运用头文件中定义函数原型,常数和结构体时,要严格保持和头文件中的定义一致,包括大小写。在查询函数定义时,这将节约您大量的时间;

在编译,链接时用makefile文件,免去重复敲键。

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.DATA ; initialized data
ClassName db "SimpleWinClass",0 ; the name of our window class
AppName db "Our First Window",0 ; the name of our window
.DATA? ; Uninitialized data
hInstance HINSTANCE ? ; Instance handle of our program
CommandLine LPSTR ?
.CODE ; Here begins our code
start:
invoke GetModuleHandle, NULL ; get the instance handle of our program.
; Under Win32, hmodule==hinstance mov hInstance,eax
mov hInstance,eax
invoke GetCommandLine ; get the command line. You don't have to call this function IF
; your program doesn't process the command line.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; call the main function
invoke ExitProcess, eax ; quit our program. The exit code is returned in eax from WinMain.
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; create local variables on stack
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX ; fill values in members of wc
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 ; register our window class
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 ; display our window on desktop
invoke UpdateWindow, hwnd ; refresh the client area
.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; return exit code in eax
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY ; if the user closes our window
invoke PostQuitMessage,NULL ; quit our application
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Default message processing
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start

时间: 2024-12-22 11:47:19

汇编教程之创建简单的窗口的相关文章

汇编创建简单的窗口

理论: Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows Gui 函数.其实这对用户和程序员来说都有好处,对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作.对程序员来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的.当然至于具体地写程序对于程序员来说还是有难度的.为了创建基于窗口的应用程序,必须严格遵守规范.作到这一点并不难,只要用模块化或面向对象的编程方法即可. 下面我就列出在桌面显示一个窗

中文Access2000速成教程--2.1 使用向导创建简单的选择查询

access|创建|教程|使用向导|速成|中文 第一讲.使用向导创建简单的选择查询 在中文Access 2000中使用查询也可以按照不同的方式查看.更改和分析数据,同时也可以将查询作为窗体.报表和数据访问页的记录源.最常见的查询类型是选择查询,它能使用指定的准则从表中检索数据,然后按照需要的次序显示数据.操作时,可以如同使用中文Visual FoxPro 6(参阅本网的后续课程)那样通过"设计器"."向导"来建立查询,只是建立时的操作方法与对话框名称,以及运行方式不

opengl 教程(1) 创建窗口

本章教程内容主要来自:http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html 使用OpenGL之前,请先安装和设置好FreeGlut和glew, 下载地址: http://freeglut.sourceforge.net/ http://glew.sourceforge.net/   原教程源码下载地址:http://ogldev.atspace.co.uk/ogldev_win.zip          OpenGL做为3D图形接口

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 //主窗口初始

如何使用NetBeans IDE创建简单的Web应用程序

本文档将向您介绍有关使用 NetBeans IDE 开发 Web 应用程序的基础知识.它将演示如何创建简单的 Web 应用程序,如何将该应用程序部署到服务器,以及如何在浏览器中查看该应用程序的表现形式.该应用程序采用一个 JavaServer Pages (JSP) 页来要求您输入自己的姓名.然后,使用 JavaBeans 组件在 HTTP 会话期间保留该姓名,并检索该姓名以输出到第二个 JSP 页上. 要学习本教程,您需要具备以下软件和资源. 软件或资源 要求的版本 NetBeans IDE

Photoshop文字特效教程:漂亮的简单光丝文字

本教程介绍较为简单的光丝文字制作方法.整个文字都是由同一条文字路径组合构成.先需要对路径描边,再用不同的色块叠加上颜色,然后复制并控制图层不透明度做出文字的大致效果,后期再渲染高光即可.最终效果 1.新建一个800 * 600像素的画布,背景填充黑色.新建一个图层,选择工笔工具勾出自己想要的文字路径,可以多勾几次,字体要连写.大致效果如下图. <图1>   2.把前景颜色设置为暗红色:#9B3737,选择铅笔工具,大小设置为1像素.再选择钢笔工具在路径上面右键选择"描边路径"

汇编教程之进一步学习对话框

本课中我们将进一步学习对话框.特别地我们将要探讨如何把对话框当成输入设备.如果您学习了上一课,那就会发现本课的例子只有少量的改动,就是把我们的对话框窗口附属到主窗口上.另外,我们还要学习通用对话框的用法. 理论: 把对话框当成一个输入设备来用确实是非常地简单,创建完主窗口后,您只要调用函数 CreatedialogParam 或 DialogBoxParam 就可以了,前一个函数只要在对话框的过程处理函数中处理相关的消息就可以,而后者你必须在消息循环段中插入函数 IsDialogMessage

Excel2007教程:在多个窗口中查看工作表

Excel2007基础教程:在多个窗口中查看工作表 有时,可能需要同时查看工作表的两个不同部分一-或许便于在公式中引用较远的一个单元格.或者可能需要同时检查同一个工作簿中的多个工作表.通过使用一个或多个额外窗口,并在其中打开工作簿的新视图,就可以完成上述操作. 要创建和显示活动工作簿的新视图,选择"视图" -> "窗口"吟"新建窗口"命令. 如图4.6 所示, Excel 为活动工作簿显示了一个新窗口.在该例子中,每个窗口显示了工作簿中一个

微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台

原文:微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 上节我们简单介绍了一下什么是公众号第三方平台,今天我们将具体操作如何创建属于您自己的微信第三方平台. 注册认证 用户首选需要注册成为开发平台的用