VC++深入详解的学习

来源:互联网 发布:呼和浩特乾宇网络 编辑:程序博客网 时间:2024/05/23 01:14

Windows程序内部运行机制

        WinMain函数是Windows程序的入口点函数,与DOS程序的入口点哈市南湖main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。

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

                              ·1 WinMain函数的定义;

                              ·2 创建一个窗口;

                              ·3 进行消息循环;

                              ·4 编写窗口过程函数。

        WinMain函数的原型声明:

                                 int WINAPI WinMain(

                                         HINSTANCE  hInstance ,    //表示该程序当前运行的实例句柄,是一个数值

                                         HINSTANCE  hPrevInstance ,     //表示当前实例的前一个实例的句柄

                                         LPSTR  lpCmdLine ,    // 以空终止的字符串,指定传递给应用程序的命令行参数

                                         int  nCmdShow    // 指定程序的窗口应该如何显示

                                              ) ;

             注:WINAPI 实际就是_stdcall, _stdcall是函数调用约定(函数调用约定主要约束了两件事:一是参数传递的顺序,二是调用堆栈由谁(调用函数或被调用函数)清理)的一种,_stdcall表示1.参数从右向左压入堆栈,2.函数由调用者修改堆栈。相关介绍参见百度百科

 

       窗口的创建

        创建一个完整的窗口,需要经过以下步骤:

                                   1. 设计一个窗口类;

                                   2. 注册窗口类;

                                   3. 创建窗口;

                                   4. 显示及更新窗口。

      在创建一个窗口前,必须对该类型的窗口进行设计,指定窗口的相关特征,这就是窗口类的设计。

      窗口的特征是由WNDCLASS结构体定义的,WNDCLASS结构体定义为:

                           tpyedef  struct  _WNDCLASS{

                                              UINT           style ;       //该变量指定这一类型窗口的样式

                                            WNDPROC   lpfnWndProc ;    //该变量是一个函数指针,指向窗口过程函数

                                            int                  cbClsExtra ;       //该变量为Windows为系统中的每一个窗口类管理一个WNDCLASS ,该变量用于存储类的附加信息。

                                            int                  cbWndExtra ;     //该变量为应用程序存储窗口所特有的数据的变量, 称之为窗口附加内存

                                           HANDLE       hInstance ;         //该变量指定包含窗口过程的程序的实例句柄

                                            HICON          hIcon ;              //指定窗口类的图标句柄,该变量为NULL时,系统将提供一个默认的图标

                                            HCURSOR    hCursor ;         //指定窗口类的光标句柄

                                            HBRUSH       hbrBackground ;   //指定窗口类的背景画刷句柄

                                            LPCTSTR     lpszMenuName ;    //该变量是一个以空终止的字符串,指定菜单资源的名字(注:菜单并不是一个窗口)

                                            LPCTSTR     lpszClassName ;     //该变量是一个以空终止的字符串,指定窗口类的名字

                                     } WNDCLASS ;

 

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

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

 

                针对Windows的消息处理机制,窗口过程函数被调用的过程为:  ·1 在设计窗口类的时候,将窗口过程函数的地址赋值给lpfnWndProc成员变量;  ·2调用RegisterClass(&wndclass)注册窗口类,那么系统就有了该窗口函数的地址;  ·3当应用程序接收到某一窗口的消息时,调用DispatchMessage( &msg)将消息回传给系统。系统则利用先前注册窗口类时得到的回调函数的指针,调用回调函数对消息进行处理。

              基于一个窗口类创建的窗口使用同一个窗口过程函数。

 

                注册窗口类:这相当于在设计窗口类之后,告知操作系统所设计的窗口类,以便在调用该窗口类创建窗口时,系统知道该窗口类已被设计出,并可以找到该窗口类的基本特征,去创建窗口。

                    调用RegisterClass函数对其进行注册,注册成功后方可创建该类型的窗口。注册函数的声明为:

                    ATOM  RegisterClass( CONST  WNDCLASS   *lpWndClass ) ;

                       该函数的参数为所设计的窗口类对象的指针。

 

         创建窗口:

               使用CreateWindow函数创建该注册过的窗口类的窗口,该函数声明为:

                          HWND      CreateWindow (

                                     LPCTSTR       lpClassName ,    //该参数指定窗口类的名称,即在设计窗口类时WNDCLASS结构体中lpszClassName成员变量所指定的名称

                                     LPCTSTR       lpWindowName ,  //指定窗口的名字,如果在窗口样式中指定标题栏,窗口的名字将 显示在标题栏上

                                     DWORD          dwStyle ,        //指定创建的窗口的样式,该变量表示的某个具体的窗口的样式

                                     int                        x ,

                                     int                        y ,

                                     int                        nWidth ,

                                     int                        nHeight ,     // x ,y ,nWidth ,nHeight分别指定窗口左上角的x,y坐标,窗口的宽度,高度。当x为CW_USEDEFAULT,系统将为窗口选择默认的左上角坐标并忽略y参数;当nWdith为CW_USEDEFAULT,系统将为窗口选择默认的宽度和高度,并忽略nHeight参数。

                                     HWND                 hWndParent ,     //指定被创建窗口的父窗口句柄

                                     HMENU               hMenu ,         //指定窗口的菜单句柄

                                     HANDLE              hInstance ,    //指定窗口所属的应用程序实例的句柄

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

                                        ) ;

 

           最后显示及更新窗口

                    窗口创建之后,调用ShowWindow函数显示窗口,该函数声明为

                                                BOOL    ShowWindow (

                                                             HWND  hWnd,    //创建窗口后返回的窗口句柄

                                                             int   nCmdShow   //指定窗口显示的状态

                                                        ) ;

 

                    更新窗口,在调用ShowWindow函数之后,紧接着调用UpdateWindow函数来刷新窗口,该函数声明为

                                       BOOL  UpdateWindow (

                                                       HWND  hWnd      //指定的是创建成功后的窗口的句柄

                                                        ) ;

               UpdateWindow函数通过发送一个WM_PAINT消息来刷新窗口(发送给窗口过程函数进行处理,并没有放到消息队列里)。

 

           总结:创建一个完整的窗口的过程为  ·1设计一个窗口类,这一步设计的是一类窗口的基本特征; ·2注册窗口类, 这一步是告知操作系统已设计好了一类窗口,当调用该类创建窗口时,系统知道该类的存在; ·3创建窗口,这一步时根据已注册的窗口类,创建具体的窗口,这一步涉及到所要创建的窗口的具体特征; ·4显示和更新窗口,将上步创建的窗口进行显示及更新。