查看如何编译编译以创建简单窗口
综述:理论:在Windows程序中,在编写图形用户界面时需要调用大量标准的Windows gui函数,这对用户和程序员都是有益的。对于用户来说,他们面对的是标准的Windows一样,在这些窗口的操作是相同的,所以不需要重新学习操作时使用不同的应用,对于程序员来说,这些源代码都是GUI
理论:
在Windows程序中,在编写图形用户界面时需要调用大量标准的Windows gui函数,这对用户和程序员都是有益的。对于用户来说,他们面对的是标准的Windows一样,在这些窗口的操作是相同的,所以不需要重新学习操作时使用不同的应用,对于程序员来说,这些GUI源已由微软测试,可以在任何时候使用。当然,它是程序员写一个程序特别困难。为了创建基于窗口的应用程序的规范,必须严格遵守。这是不难做到这一点,只要它是模块化的、面向对象的程序设计。
下面我将列出在桌面上显示窗口的几个步骤:
获取应用程序的句柄(必要);
获取命令行参数(如果您希望从命令行获取参数,则可选);
登记窗口类(除非你使用Windows预定义的窗口类,必要如MessageBox或对话框;
生成窗口(必要);
在桌面显示窗口(必须,除非你不想立即显示它);
刷新窗口客户端区域;
输入访问窗口消息的无限循环;
如果有消息要到达,窗口回调函数将由窗口处理。
如果用户关闭窗口,则执行退出过程。
相比之下,单用户的DOS程序在Windows程序框架是相当复杂的。但Windows和DOS在系统架构完全不同。Windows是一个多任务的操作系统,因此在系统运行在一起的多个应用程序。这就要求Windows程序员必须严格遵循编程规范和养成良好的编程风格。
内容:
下面是我们的简单窗口程序的源代码。在复杂的细节中,我将概述一些要点:
你应该放在头文件中的应用程序结构和常数的声明包括在源程序中的头文件开始。这样做会节省你很多时间,不要敲键盘一次又一次。目前,最完美的头文件写的是双雄,你可以把它下载到厨或我的网站,你也可以自己定义常数和结构,但最好是放在一个单独的头文件
使用includelib命令,程序包含例如库文件,参考资料:如果你的程序被称为复制如果你不是一个库,只需添加includelib陈述,不要担心如何处理这么多的链接库,只要您使用链接开关/ LIBPATH来表示该库的路径。
在其他地方,当使用头文件来定义函数原型、常量和结构时,它们应该与头文件中的定义保持一致,包括实例。这将在查询函数定义时节省大量的时间。
在编译、链接使用makefile文件,避免重复敲键。
386。
模型平面,stdcall。
选择casemap:无
包括 masm32 包括 windows
包括 user32.inc包括MASM32
includelib masm32 自由 user32.lib;呼吁在user32.lib和kernel32.lib功能
包括 masm32 包括 kernel32
includelib kernel32.lib masm32 lib
原:WinMain DWORD,:::DWORD,DWORD,DWORD
数据,初始化数据
className DBsimplewinclass
修改数据库第一窗
未初始化的数据。数据;
程序的实例;我们的程序实例句柄
命令行的一个
代码;这里开始我们的代码
开始:
调用GetModuleHandle,无效;让我们程序的实例句柄。
在Win32环境下,hmodule = = hInstance MOV EAX的实例,
mov eax的实例,
调用GetCommandLine获得命令行。你不必打这个电话
您的程序不处理命令行。
mov eax的命令行,
调用WinMain,程序无效,命令行,sw_showdefault;调用主函数
调用ExitProcess,eax;退出程序。退出代码返回
WinMain程序:程序:程序hprevinst HINST,CmdLine:LPSTR,cmdshow:DWORD
当地的WC:WNDCLASSEX;堆栈上创建本地变量
本地味精
局部窗口:窗口句柄
MOV wc.cbsize,sizeof WNDCLASSEX;填写成员WC值
MOV wc.style,cs_hredraw或cs_vredraw
MOV wc.lpfnwndproc WndProc,偏移
MOV wc.cbclsextra,空
MOV wc.cbwndextra,空
推送程序
流行wc.hinstance
MOV wc.hbrbackground,color_window 1
MOV wc.lpszmenuname,空
MOV wc.lpszclassname类名,偏移
引用LoadIcon,null,idi_application
Mov wc.hIcon, eax
mov eax wc.hiconsm,
调用LoadCursor,null,idc_arrow
mov eax wc.hcursor,
调用RegisterClassEx,addr WC;登记窗口类
引用CreateWindowEx,null,
地址名称,
地址修改,
ws_overlappedwindow,
cw_usedefault,
cw_usedefault,
cw_usedefault,
cw_usedefault,
空,
空,
HInst,
无效的
MOV EAX HWND,
调用ShowWindow,HWND,CmdShow;在桌面显示窗口
调用UpdateWindow,刷新窗口客户区;
当输入true时,输入消息循环
调用GetMessage,addr味精,null,0,0
break.if(!Eax)
调用TranslateMessage,地址信息
调用DispatchMessage,地址信息
endw。
mov eax,eax返回退出代码中msg.wparam;
RET
WinMain ENDP
WndProc过程窗口:窗口句柄,umsg:uint,wParam,lParam值:LPARAM
如果umsg = = wm_destroy;如果用户关闭窗口
调用postquitmessage,null;退出应用程序
其他的。
调用DefWindowProc,HWND,umsg,wParam,lParam;默认的消息处理
RET
endif。
XOR EAX,EAX
RET
WndProc ENDP
结束的开始
分析uff1a
看到一个简单的Windows程序有那么多,你一点都不退出,但你要知道,最上面的代码是一个模板,模板的意义是指代码几乎都是标准的Windows程序一样,你可以复制代码,当你写的Windows程序,当然在图书馆写重复的代码是很好的。其实,你真的要写的代码集中在WinMain。像一些C编译器,你不用关心其他的家务和在WinMain函数的焦点。唯一不同的是,C编译器要求您的源代码都有一个函数调用WinMain。否则,C不知道与前面和后面的代码链接功能。相对于C,ASSE标语言提供了更大的灵活性,并且它不需要一个函数调用WinMain。
当我们开始分析时,你必须做好准备。这不是一件容易的工作。
386。
模型平面,stdcall。
选择casemap:无
原:WinMain DWORD,:::DWORD,DWORD,DWORD
包括 masm32 包括 windows
包括 user32.inc包括MASM32
包括 masm32 包括 kernel32
includelib user32.lib masm32 lib
includelib kernel32.lib masm32 lib
你可以把前三行看作必要。
。386告诉masn要使用80386指令集。
模型平面,stdcall告诉MASM的内存寻址模式使用,这也增加了stdcall告诉MASM的参数传递约定我们使用。
下一步,该函数WinMain原型声明,因为我们需要使用的功能,所以我们必须声明它。我们必须包括window.inc文件,其中包含大量使用常量和结构的定义,该文件是一个文本文件,你可以用任何文本编辑器打开它,window.inc也不包含常量和结构的定义,但是hutch和我一直在不断增加新的内容。