您的位置:首页 > 编程语言

Windows 编程基础知识

2015-01-08 15:28 471 查看
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)会有差异,需注意

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息