第一章 Windows程序内部运行机制(4)WinMain函数

  WinMain函数相当于main函数,作为Windows程序的入口函数。当WinMain结束或返回时,Windows程序结束。

  一个win32应用程序,该程序创建一个窗口并在窗口中响应键盘与鼠标消息,程序的实现步骤为:

  1.WinMain函数的定义;2.创建一个窗口;3.进行消息循环;4.编写窗口过程



  WinMain函数的定义:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

  第一个参数表示程序当前运行的实例的句柄,这是一个数值。当程序在Windows中运行时,它唯一标识运行中的实例(只有在运行中的程序实例,才有实例句柄)。一个应用程序可以有多个实例,每运行一个实例,系统就会给实例分配一个句柄,并通过hInstance参数传递给WinMain函数。

  第二个参数表示当前实例的前一个实例的句柄。在win32环境下,这个值是NULL。

  第三个参数是一个以空终止的字符串,指定传递给应用程序的命令行参数。如果想向应用程序传递参数,可以【项目】【项目属性】【调试】【命令参数】中进行设置。如下图:

  第四个参数是指定窗口如何显示,例如最大化、最小化、隐藏等等。这个参数的值由改程序的调用者来定,应用程序通常不需要去处理这个值。



  窗口的创建

  步骤:

  1.设计一个窗口类;2.注册窗口类;3.创建窗口;4.显示及更新窗口。

  1.在创建一个窗口前,需要对该类型的窗口进行设计,指定窗口的特征。 窗口的特征是由WNDCLASS结构体来进行定义的。WNDCLASS结构体定义如下:

typedef struct {
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;

  第一个变量指定窗口的样式。常用样式有:CS_HREDROW(当水平方向上的宽度发生变化时,重绘整个窗口)CS_VREDROW(当垂直方向上高度发生变化时,重绘窗口)CS_NOCLOSE(禁用系统菜单中的Close命令,窗口没有关闭按钮)CS_DBLCLKS(用户在双击鼠标时,向窗口发送鼠标双击消息)。我们可以使用位操作符来组合这些样式。

  第二个变量是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生的时由另外一方调用的,用于对该事件进行响应。

  第三个变量cbClsExtra。(这个参数看不懂是什么意思,就照着书上的抄下来,再看看,再想想吧)。Windows为系统中的每一个窗口类管理一个WNDCLASS结构。在应用程序注册一个窗口类时,它可以让Windows系统为WNDCLASS结构分配和追加一定字节的附加内存空间,这部分内存空间称为类附加内存,由属于这种窗口类的所有窗口所共享,类附加内存空间用于存储类的附加信息。Windows系统把这部分内存初始化为0。一般我们将这个参数设置为0.

  第四个变量cbWndExtra。Windows系统为每一个窗口管理一个内部数据结构,在注册一个窗口类时,应用程序能够指定一定字节数的附加内存空间,称为窗口附加内存。在创建这类窗口时,Windows系统九尾窗口的结构分配和追加指定数目的窗口附加空间,应用程序可用这部分内存存储窗口特有的数据。Windows系统把这部分内存初始化为0.如果应用程序用WNDCLASS结构注册对话框(用资源文件中的CLASS伪指令创建),必须给DLGWINDOWEXTRA设置这个成员。一般我们将这个参数设置为0.

  第五个变量hInstance指定包含窗口过程的实例句柄。

  第六个成员变量hIcon指定窗口类的图标句柄。这个成员变量必须是一个图标资源的句柄,如果这个成员为NULL,那么系统将提供一个默认的图标。在为hIcon变量赋值时,可用LoadIcon函数来加载一个图标资源,返回系统分配给图标的句柄。该函数的原型声明为:HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName)

  第七个变量hCursor指定窗口类的光标句柄。这个成员变量必须是一个光标句柄,如果这个成员变量时NULL,那么无论何时鼠标进入到应用程序窗口中,应用程序必须明确地设置光标的行装。为hCursor赋值时,可以用调用LoadCursor函数来加载一个光标资源,返回系统分配给光标的句柄。该函数原型声明如下:HCUROSR LoadCursor (HINSTANCE hInstance , LPCTSTR lpCursorName);

  第八个变量hbrBackground指定窗口类的背景画刷句柄。当窗口发生重绘时,系统使用这里指定的画刷来擦除窗口的背景。可以调用GetStockObject函数来得到系统的标准画刷。GetStockObject函数不仅可以用于获取画刷的句柄,还可以用于获取画笔、字体和调色板的句柄。由于GetStockObject函数可以返回多种资源对象的句柄,在实际调用该函数前无法确定返回哪一种资源对象的句柄,因此它的返回值类型定义为HGDIOBJ,在实际使用时,需要进行类型转换 。例如,我们要为hbrBackground成员指定一个黑色画刷的句柄,可以wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

  第九个成员变量lpszMenuName是一个以空终止的字符串,指定菜单资源的名字。如果你使用菜单资源的ID号,那么需要用MAKEINTRESOURCE宏来进行转换。如果lpszMenuName成员设置为NULL,那么基于这个窗口创建的窗口将没有默认的菜单。注意,菜单并不是一个窗口!

  第十个变量lpszClassName是一个以空终止的字符串,指定窗类的名字。

  2.注册窗口类

  在设计完窗口类(WNDCLASS)后,需要调用RegisterClass函数对其进行注册,注册成功后,才可以创建该类型的窗口。注册函数的原型声明如下:

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

  该函数只有一个参数,即上一步骤中所设计的窗口类对象的指针。

  3.创建窗口——步骤3

  设计好窗口类并且将其成功注册后,就可以用CreateWindow函数产生这种类型的窗口了。CreateWindow函数的原型声明如下:

HWND CreateWindow(      LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent,
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

  参数lpClassName指定窗口类的名称,即在步奏1设计一个窗口类中为WNDCLASS的lpszClassName成员指针的名称。

  参数lpWindowName指定窗口的名字。如果窗口样式制定了标题栏,那么这里指定了窗口名字将显示在标题栏上。

  参数dwStayle指定创建的窗口的样式。注意区分WNDCLASS中的style成员与CreateWindow函数的dyStyle参数,前者是指窗口类的样式,基于该窗口类创建的窗口都具有这样的样式,后者是指某个具体的窗口的样式。

  CreateWindow函数的参数x,y,nWidth,nHeight分别指定窗口左上角的x,y坐标,窗口的宽度,高度。如果,参数x设置为CW_USEDEFAULT,那么系统为窗口左上角坐标并忽略y参数,如果参数nWidth被设为CW_USEDEFAULT,那么系统为窗口选择默认的宽度和高度,参数nHeight被忽略。

  参数hWndParent指定被创建窗口的父窗口句柄。

  参数hMenu指定窗口菜单的句柄。

  参数hInstance指定窗口所属的应用程序的实例句柄。

  参数lpParam:作为WM_CREATE消息的附加参数lParam传入的数据指针。在创建多文档界面的客户窗口时,lpParam必须指向CLIENTCREATESTRUCT结构体。多窗口将这个参数设置为NULL。

  如果创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则返回NULL。注意,在创建窗口之前应先定义一个窗口句柄变量来接收创建窗口之后返回的句柄值。

  回调函数实现的机制:

  1.定义一个回调函数。2.提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者。3.当特定的时间或条件发生的时候,调用者使用函数指针调用函数对事件进行处理。

  



第一章 Windows程序内部运行机制(4)WinMain函数

时间: 2024-12-18 02:09:50

第一章 Windows程序内部运行机制(4)WinMain函数的相关文章

VC++深入详解 孙鑫 第一章 Windows程序内部运行机制

1.API与SDK API (Application Programming Interface) 应用程序接口 SDK(Software Development Kit) 软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具. 2.窗口和句柄 窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口: 在Windows应用程序中,窗口是通过窗口句柄(资源标识)来标识的. 3.消息和消息队列 Windows程序设计是一种基于消息的事件驱动方式的程序设计模式. 每当一个

第一章 Windows程序内部运行机制(2)窗口和句柄

窗口是Windows应用程序中非常重要的元素.一个Windows应用程序至少有一个主窗口.窗口是Windows应用程序和用户进行交互的接口. 窗口通常包含标题栏.菜单栏.系统菜单.最小化框.最大化框.可调边框和滚动条. 窗口分为客户区和非客户区.应用程序通常在客户区中显示文字或绘制图形.标题栏.菜单栏.系统菜单.最小最大化框.可调边框统称为非客户区.非客户区主要由Windows系统来管理.应用程序主要管理客户区和外观及操作. 桌面也是一个窗口,称为桌面窗口,由windows系统创建和管理. 窗口

第一章 Windows程序内部运行机制(3)消息与消息队列

在Windows中,用户程序可以调用系统的API函数,系统也会调用用户程序,这个调用时通过消息来进行的. Windows程序设计是一种事件驱动方式的程序设计模式,主要基于消息. [例]当用户在窗口中画图的时候,按下鼠标左键,操作系统就会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息进行响应.在处理过程中,操作系统会给应用程序“发送消息”.“发送消息”实际上是指操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程. 1.消息

第一章 Windows程序内部运行机制(1)API和SDK

Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序.这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface)简称为API函数. MSDN可以说是为微软开发人员提供的一套帮助系统,其中包含大量的开发文档.技术文章和示例代码,学会用MSDN来进行学习,对初学者来说很重要. 什么是SDK? SDK的全称是SoftwareDevelopment Kit,中文译为软件开发包.假如我们要开发呼叫中心,在购买语

第一章 Windows程序内部运行机制(4)WinMain函数(续)

4.显示及更新窗口 要让窗口显示出来,需要调用ShowWindow来显示窗口. BOOL ShowWindow( HWND hWnd, int nCmdShow ); 第一个参数是创建窗口后返回的那个窗口句柄.第二个窗口指定了窗口显示的状态.常见的状态有:SW_HIDE隐藏窗口并激活其他窗口:SW_SHOW在窗口原来的位置以原来的尺寸激活和显示窗口:SW_SHOWMAXIMIZED激活窗口并将其最大化显示:SW_SHOWMINIMIZED激活窗口并将其最小化显示:SW_SHOWNORMAL激活并

MFC第一节-windows程序内部运行机制

一.窗口 设计窗口类时: 1 typedef struct _WNDCLASS{ 2 UINT style; //如水平.垂直变化是否重绘,禁用Close,检测双击 3 WNDPROC lpfnWndProc;//窗口过程函数句柄 4 int cbClsExtra;//类附加内存 5 int cbWndExtra;//窗口附加内存 6 HANDLE hInstance;//实例句柄 7 HANDLE hIcon;//图标 8 HCURSOR hCursor;//光标 9 HBRUSH hbrBa

再理解Windows程序内部运行机制

参照孙鑫<VC++深入详解> 创建Win32程序的步骤: 1. 编写WinMain函数 2. 设计窗口类(WNDCLASS) 3. 注册窗口类 4. 创建窗口 5. 显示并更新窗口(ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);) 6. 消息循环(不断地从消息队列中取出消息,并进行响应) 7. 窗口过程函数(处理发送给窗口的消息) 测试代码如下(在VS2010编译通过): #include <stdafx.h> #include

Windows程序内部运行机制

Windows程序内部运行机制 一.        API与SDK Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序,这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数.我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了说明. SDK的全称是Software Development Kit

Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Windows 平台下程序运行的内部机制,所以本专题将深入剖析下Windows 程序的内部运行机制. 二.Windows平台下几个基础概念 有朋友会问,理解了程序运行的内部机制有什么用,因为在我们实际开发中用得微软提供的