关于的消息解释,我个人觉得在这一课,解释的不是很清晰,他只是简单的介绍了一下Windows是消息驱动的,并且简单介绍了下消息MSG的结构。这一课最主要详细介绍的是一个Windows窗口程序的设计和运行步骤。
入口函数:一个Windows程序是在什么情况下启动的呢,也即我们创建了一个Windows程序后,当运行该已建程序时,OS是如何启动我们的这个程序的呢?这就是Windows的WinMain函数,函数原型为:
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 )。这个函数的形式就是如此,但是函数名我们是对其进行修改的。在这个函数内我们就可以针对我们需要的消息,编写处理过程代码。