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 //第二个消息的附加参数 );
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)