现在的位置: 首页 > 综合 > 正文

孙鑫VC++讲座笔记-(1)——Windows程序内部运行原理

2013年04月30日 ⁄ 综合 ⁄ 共 2440字 ⁄ 字号 评论关闭

关于的消息解释,我个人觉得在这一课,解释的不是很清晰,他只是简单的介绍了一下Windows是消息驱动的,并且简单介绍了下消息MSG的结构。这一课最主要详细介绍的是一个Windows窗口程序的设计和运行步骤。

入口函数:一个Windows程序是在什么情况下启动的呢,也即我们创建了一个Windows程序后,当运行该已建程序时,OS是如何启动我们的这个程序的呢?这就是WindowsWinMain函数,函数原型为:

int WINAPI WinMain( HINSTANCE hInstance,      // handle to current instance

                              HINSTANCE hPrevInstance,  // handle to previous instance

                              LPSTR lpCmdLine,         // command line

                              int nCmdShow             // show state);

在该入口函数内我们所要做的共有以下四个具体过程:

1、      设计并注册一个窗口类

2、      创建已经设计和注册好的窗口类

3、      显示及更新所创建的窗口

4、      启动消息循环

首先在设计窗口类时我们只需按照我们的具体需要填写MS给我们提供的WNDCLASS这个结构就可以了,以下是该结构的简单释义:

typedef struct _WNDCLASS { UINT    style;        //窗口的类型

    WNDPROC lpfnWndProc;  //窗口过程函数指针(回调函数)

    int     cbClsExtra; //窗口类附加字节,为该类窗口所共享。通常0

    int     cbWndExtra; //窗口附加字节。通常设为0

    HANDLE  hInstance;  //当前应用程序事例句柄。

    HICON   hIcon;      //图标句柄 LoadIcon();

    HCURSOR hCursor;    //光标句柄 LoadCursor();

    HBRUSH  hbrBackground; //画刷句柄 (HBRUSH)GetStockObject();

    LPCTSTR lpszMenuName;  //菜单名字

    LPCTSTR lpszClassName; //类的名字

} WNDCLASS;

而注册窗口类时采用WindowsAPI函数RegisterClassA ();原型为ATOM WINAPI RegisterClass(CONST WNDCLASSA *lpWndClass)

其次对已经注册的类进行创建只需调用函数CreateWindow()就可以了,原型为:

HWND CreateWindow(

  LPCTSTR lpClassName,  // pointer to registered class name

  LPCTSTR lpWindowName, // pointer to window name

  DWORD dwStyle,        // window style

  int x,                // horizontal position of window

  int y,                // vertical position of window

  int nWidth,           // window width

  int nHeight,          // window height

  HWND hWndParent,      // handle to parent or owner window

  HMENU hMenu,          // handle to menu or child-window identifier

  HANDLE hInstance,     // handle to application instance

  LPVOID lpParam        // pointer to window-creation data);

第三就是显示窗口采用ShowWindow()函数,原型为:

BOOL ShowWindow(HWND hWnd,     // handle to window

                        int nCmdShow   // show state of window);

更新窗口采用UpdateWindow(),原型为:

BOOL UpdateWindow(HWND hWnd   // handle of window);

至于新建的窗口在显示后是否要更新这一点我不得而知,从程序运行起来的效果感觉似乎时可有可无的,真实的情况就等待孙鑫以后帮我解开这个迷吧?

第四也就是启动消息循环,关于这个我们可以用GetMessage()PeekMessage()两个函数。这两者的具体区别暂时不想多做分析,需要说明的是他们都是从系统消息队列(或程序消息队列中获取消息)。其获取的消息通过TranslateMessage(&msg)函数进行消息转换或者说是翻译成新的程序消息,再将该新消息通过DispatchMessage(&msg)分派消息到窗口过程函数也即窗口的回调函数处理(内在机制由OS调用窗口回调函数进行消息处理)。

通过以上四步,则整个窗口应用程序就可以运行起来了,但是在第四步的窗口过程函数到底是个什么函数?其实这个函数就是我们在设计窗口类时所指定的回调函数,为此不可避免的Windows程序的设计和运行必须得有一个处理消息的函数,也即以上这个回调函数,其函数原型为LRESULT CALLBACK WindowProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )。这个函数的形式就是如此,但是函数名我们是对其进行修改的。在这个函数内我们就可以针对我们需要的消息,编写处理过程代码。

【上篇】
【下篇】

抱歉!评论已关闭.