Windows程序运行原理
概述
入口函数----窗口-----消息循环----回调函数
1.程序入口函数WinMain
int WINAPI WinMain(
HINSTANCE hInstance;
HINSTANCE hPrevInstance;
LPSTR lpCmdLine; //run command
int nCmdShow; //show state
);
WinMain函数由操作系统调用,里面的所有参数都由操作系统赋值.
操作系统启动应用程序时,给它分配一个实例号,放到hInstance中,如果有参数,则放到lpCmdLine中,以及应用程序的状态等都由操作系统调用WinMain来实现.
2.窗口
1)设计一个窗口类;
2)注册一个窗口;
3)创建窗口;
4)显示及更新窗口;
1)WNDCLASS wndclass;
2)RegisterClass(CONST WNDCLASS *lpWndClass);
3)HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam);
4)BOOL ShowWindow(HWND hWnd, int nCmdShow);
UpdateWindow(HWND hwnd);
typedef struct{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra; //窗口类的额外数据
int cbWndExtra; //窗口的额外数据
HINSTANCE hInstance; //the instance of current application
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS,*PWNDCLASS;
--lpfnWndProc 过程函数(回调函数)
处理事件的代码;
由操作系统调用;
放置由用户编写的代码;
3.过程函数(回调函数)
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
操作系统针对特定事件根据什么来调用相应过程函数进行处理?
调用的是接受消息的窗口所属类型中lpfnWndProc成员指定的函数.每一种窗口都有自己专属的回调函数.
--hInstance 当前应用程序实例号
由WinMain函数中的hInstance形参赋值
4.消息
操作系统将每一个事件包装成消息的结构体MSG传递给应用程序
MSG定义:
typedef struct tagMSG{
HWND hwnd; //handle to window --1
UINT message; // --2
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}
--1 句柄
资源的标识
图标,光标,窗口,实例
--2 宏
用来代替数值,WM开头
5.消息循环
应用程序通过GetMessage函数来调用操作系统放到消息队列中的消息.
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
TranslateMessage()对取到的WM_KEYDOWN,WM_KEYUP消息进行转换,转换为一个WM_CHAR消息
放到消息队列中。
DispatchMessage()将收到的消息传到操作系统,然后操作系统将MSG结构体中前四个参数传
递给回调节函数,并调用这个回调函数中进行处理。
VC++之Windows程序运行原理小计
最新推荐文章于 2020-02-02 17:48:10 发布