设为首页 加入收藏

TOP

11.2.1 WinMain()函数(1)
2013-10-07 16:10:33 来源: 作者: 【 】 浏览:79
Tags:11.2.1 WinMain 函数

11.2.1  WinMain()函数(1)

WinMain()函数等价于控制台程序中的main()函数。该函数是执行开始的地方,也是为程序其余部分执行基本初始化工作的地方。为了允许Windows传递数据,WinMain()函数有4个形参和一个int类型的返回值,其原型如下:

  1. int WINAPI WinMain(HINSTANCE hInstance,  
  2. HINSTANCE hPrevInstance,  
  3. LPSTR lpCmdLine,  
  4. int nCmdShow  
  5. ); 

在返回类型说明符int的后面,有一个函数说明符WINAPI。WINAPI是一个Windows定义的宏,将使系统以特定于Windows API函数的某种特殊方式处理函数名和实参。这种方式与C++(www.cppentry.com)通常处理函数的方式不同。具体的细节是不重要的--这只不过是Windows所要求的方式而已,因此只需要将WINAPI宏名称放在由Windows调用的函数名前面即可。

如果确实想要了解调用约定,就查看随Visual C++(www.cppentry.com)提供的文档,文档中有对调用约定的描述。WINAPI定义为__stdcall,将此修饰符置于函数名之前表明使用的是标准Windows调用约定。这要求参数以相反的顺序被推入栈,被调用函数结束时清除栈。本章稍后将看到的CALLBACK修饰符也定义为__stdcall,因此与WINAPI是等价的。标准C++(www.cppentry.com)调用约定由__cdecl修饰符指定。

Windows传递给WinMain()函数的4个参数包含着重要的数据:

hInstance属于HINSTANCE类型,是指向某个实例的句柄-- 这里的实例是正在运行的程序。句柄是标识某种对象(这里是应用程序的实例)的整数值。句柄的实际整数值是多少并不重要。在任何给定时刻都可能有好几个程序在Windows下执行,这就使相同应用程序可能有若干副本同时在活动,而这种情形需要识别出来。因此,hInstance句柄标识某个特定的副本。如果启动某个程序的多个副本,则每个副本都有自己独特的hInstance值。正如我们很快就将看到的那样,句柄还用来标识各种其他事物。

hPrevInstance是从16位版本的Windows操作系统继承下来的,我们可以放心地对它置之不理。在当前版本的Windows中,该参数始终为空。

lpCmdLine是指向某个字符串的指针,该字符串包含启动程序的命令行字符。该指针允许挑出可能在命令行中出现的任何参数值。LPSTR类型是另一种Windows类型,用来指定32位(long)的字符串指针,或者当以64位模式编译时,则用来指定64位的字符串指针。WinMain()的另一个版本接收LPWSTR,用于使用Unicode。

nCmdShow决定着被创建窗口的外观。窗口可以正常显示,也可以最小化显示;例如,程序的快捷方式可能指定该程序在启动时应该最小化显示。该参数可以是一组固定值之一,这些值是由像SW_SHOWNORMAL和SW_SHOWMINNOACTIVE这样的一些符号常量定义的。此类定义窗口显示方式的常量还有9个,它们都以SW_开始。通常不需要检查nCmdShow的值,而是直接将其传递给负责显示应用程序窗口的Windows API函数。

如果希望知道指定窗口显示方式的所有其他常量,那么可以通过在MSDN库中搜索WinMain,找到所有可能值的完整列表。可以在http://msdn2.microsoft.com/en-us/library/ default.aspx上联机访问MSDN库。

程序中的WinMain()函数需要做以下4件事情:

告诉Windows该程序需要的窗口种类

创建程序窗口

初始化程序窗口

检索属于该程序的Windows消息

接下来依次看一看这4件事情,然后创建一个完整的WinMain()函数。

1. 指定程序窗口

创建窗口的第一步是定义希望创建的窗口的种类。Windows定义了名为WNDCLASSEX的一种特殊struct类型,以包含用来指定窗口的数据。存储在该结构实例中的数据定义了一个窗口类,这个类用来确定窗口的类型。需要创建一个WNDCLASSEX类型的变量,并给该变量的每个成员赋值。在填写完这些变量之后,可以将其传递给Windows(借助于稍后即将看到的一个函数)来注册这个类。当完成注册之后,无论何时需要创建该类的窗口,都可以命令Windows查找已经注册过的窗口类。

WNDCLASSEX结构的定义如下所示:

  1. struct WNDCLASSEX  
  2. {  
  3. UINT cbSize;                        // Size of this object in bytes  
  4. UINT style;                             // Window style  
  5. WNDPROC lpfnWndProc;                // Pointer to message processing function  
  6. int cbClsExtra;                     // Extra bytes after the window class  
  7. int cbWndExtra;                     // Extra bytes after the window instance  
  8. HINSTANCE hInstance;                // The application instance handle  
  9. HICON hIcon;                        // The application icon  
  10. HCURSOR hCursor;                    // The window cursor  
  11. HBRUSH hbrBackground;           // The brush defining the background color  
  12. LPCTSTR lpszMenuName;           // A pointer to the name of the menu resource  
  13. LPCTSTR lpszClassName;          // A pointer to the class name  
  14. HICON hIconSm;                      // A small icon associated with the window  
  15. };  

构造WNDCLASSEX类型对象的方式与前面讨论结构时所看到的方式相同,例如:

  1. WNDCLASSEX WindowClass;                // Create a window class object 

现在可以填写WindowClass成员的值。这些成员默认的访问权限都是公有的,因为WindowClass是一个struct。使用sizeof操作符时,为这个struct的cbSize成员赋值变得相当简单:

  1. WindowClass.cbSize = sizeof(WNDCLASSEX); 

这个struct的style成员决定着窗口行为的各个方面;特别是该成员决定着在什么条件下窗口应该重画。可以从该成员的许多选项值中进行选择,其中每个选项都是由以CS_开始的符号常量定义的。

如果在从http://msdn2.microsoft.com/en-us/library上找到的MSDN库中搜索WNDCLASSEX,那么将找到所有可能的供style成员使用的常量值。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.2 Windows程序的结构 下一篇11.2.1 WinMain()函数(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·python数据分析岗的 (2025-12-25 10:02:21)
·python做数据分析需 (2025-12-25 10:02:19)
·成为一个优秀的pytho (2025-12-25 10:02:16)
·Java后端面试实习自 (2025-12-25 09:24:21)
·Java LTS版本有哪些 (2025-12-25 09:24:18)