Windows 编程基础知识

来源:互联网 发布:c语言清华大学出版社 编辑:程序博客网 时间:2024/05/16 12:21

MSG Structure:

typedef struct tagMSG {     // msg     HWND hwnd;   UINT message;   WPARAM wParam;   LPARAM lParam;   DWORD time;   POINT pt;} MSG;
消息类参数说明:

hwnd:窗口资源句柄

message:消息名称,采用宏定义的无符号整形

wParam、lParam:消息附加参数:如键盘按下产生一个WM_CHAR消息,具体按下那个键则由附加参数说明

time:标识消息产生时间

pt:结构体变量,标识产生消息时光标位置


WNDCLASS Structure:

typedef struct {    UINT style;    WNDPROC lpfnWndProc;    int cbClsExtra;    int cbWndExtra;    HINSTANCE hInstance;    HICON hIcon;    HCURSOR hCursor;    HBRUSH hbrBackground;    LPCTSTR lpszMenuName;    LPCTSTR lpszClassName;} WNDCLASS, *PWNDCLASS;

窗口类参数说明:

style:窗口类类型(可选CS_HREDRAW水平重画,CS_VREDRAW垂直重画等,windows中有宏定义,数值特殊位为1其余为0,可进行按位与或非运算)

lpfnWndProc:窗口过程函数(回调函数),接收函数指针,程序员只提供函数代码块的编写,不负责函数的调用,由操作系统在从消息队列中捕获窗口消息后、进行消息处理时调用

3、4参数分别为类和窗口的附加内存,通常情况下设为0

hInstance:当前应用程序实例号,用WinMain()函数中的形参赋值,具体数值有操作系统分配

hIcon:用LoadIcon()函数赋予初值

hCursor:用LoadCursor()赋值

hbrBackground:由GetStockObject()获得,该函数retrieves a handle to one of the stock pens, brushes, fonts, or palettes


消息循环:

MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}

TranslaMessage():将相关消息进行转换:例如将WM_KEYUP,WM_KEYDOWN消息转化为WM_CHAR消息,不影响原来消息,只产生新的消息

DispatchMessage():将收到消息传到窗口过程函数中处理,等价于将消息路由给操作系统


Windows应用程序消息循环机制:1.应用程序创立2.操作系统为该应用程序分配一个消息队列3.应用程序利用GetMessage()函数从消息队列中取出消息4.TranslaMessage(),DispatchMessage()将消息转换路由给操作系统


窗口过程函数(回调函数):

WindowProc:

<pre name="code" class="cpp">LRESULT CALLBACK WindowProc(          HWND             hwnd,    UINT             uMsg,    WPARAM             wParam,    LPARAM             lParam);

回调函数中用swith()语句对不同消息进行判断处理,对无关消息采用缺省DefWindowProc()函数进行处理,常见的消息:WM_PAINT(只能用Begin_Paint和End_Paint对设备上下文进行关联)WM_CHAR,WM_LBUTTONDOWN,WM_CLOSE,WM_DESTORY(采用PostQuitMessage(0)传递一个消息退出代码压入消息队列,当GetMessage()获取WM_QUIT消息时,返回0,退出WinMain中上述while循环)等等...


函数调用约定_stdcall与_cdecl的区别:

  函数参数传递顺序与堆栈清除机制不同,除可变参数的api函数调用外,一般函数均采用_stdcall方式,不同编译器的默认编译选项(stdcall和cdecl)会有差异,需注意





0 0
原创粉丝点击