MSG
typedef struct tagMSG{
HWND hwnd; //句柄:资源的标识
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time; //消息被传递出去的时间
POINT pt; //当消息被投递的时候,光标在屏幕上的一个位置
}MSG, *PMSG;
int WINAPI WinMain(
HINSTANCE hInstance, //当前应用程序的实例句柄
HINSTANCE hPrevInstance, //上一个应用程序的实例句柄
LPSTR IpCmdLine, //命令行(LP开头就是指针类型,STR表示字符串)
int nCmdShow //显示的状态
);
窗口的创建步骤:
(1)设计一个窗口类
(2)注册窗口类
(3)创建窗口
(4)显示及更新窗口
(1)设计一个窗口类
typedef _struct _WNDCLASS{
UINT style; //类的类型
WNDPROC lpfnWndProc; //回调函数
int cbClsExtra; //类的额外的数据
int cbWndExtra; //窗口额外的数据
HINSTANCE hInstance; //当前应用程序的实例号
HICON hIcon; //图标的句柄
HCURSH hCursor; //光标的句柄
HBRUSH hbrBackground; //画刷的句柄(背景)
LPCTSTR lpszMenuName; //(LP长指针,C是常量,所以就是一个常量字符串)菜单名字
LPCTSTR lpszClassName; //类的名字
}WNDCLASS, *PWNDCLASS;
回调函数:
原理:当应用程序收到给某一窗口的消息时,就应该调用某一函数来处理这条消息。
这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须
由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的那个函数(回调函数)来
处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。
每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过ipfnWndProc成员指定的。
(2)注册窗口类
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass //窗口类的结构体的指针
);
(3)创建窗口
步骤:定义句柄(HWND):用来保存创建窗口的标识
HWND CreadteWindow(
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);
(5)消息循环
1.获取消息:
BOOL GetMessage(
LPMSG lpMsg, //消息结构体的指针
HWND hwnd, //获得哪一个窗口(句柄)的消息,(设置为NULL:获取属于调用线程的任何消息)
UINT wMsgFilterMin, //消息的最小值
UINT wMsgFilterMax //消息的最大值
);
取出消息:返回true
当收到WM_QUIT消息的时候返回false
2.翻译消息:
TranslateMessage(
LPMSG lpMsg, //消息结构体的指针
);
作用:将取到的消息进行转换
DispatchMessage(
LPMSG lpMsg, //消息结构体的指针
);
作用:将收到的消息传到窗口的回调函数
回调函数(过程函数):
LRESULT CALLBACK WindowProc(
HWND hwnd, //窗口的句柄
UINT uMsg, //消息标识
WPARAM wParam, //第一个消息的附加参数
LPARAM lParam //第二个消息的附加参数
);