VC++之Windows程序运行原理小计

来源:互联网 发布:渡边 知乎 编辑:程序博客网 时间:2024/06/07 21:22


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结构体中前四个参数传
递给回调节函数,并调用这个回调函数中进行处理。