消息循环:
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
从消息队列中取出消息:GetMessage()
BOOL GetMessage(
LPMSG lpMsg, // 将取出的消息放入这个指针指向 的MSG结构体中
HWND hWnd, // 接受那个窗口的消息,NULL表示接受所有窗口
UINT wMsgFilterMin, //
UINT wMsgFilterMax // 消息最小最大值,为0表示接收所有消息
);
GetMessage()接收除WM_QUIT消息外均返回非零值,WM_QUIT消息返回0,出错返回-1.
TranslateMessage 将将取出的虚拟键消息转成字符消息。再将字符消息放入消息队列中
DispatchMessage将消息回传给操作系统,由操作系统调用窗口过程函数进行处理。
1.4.4编写窗口过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // 对应消息的窗口句柄
UINT uMsg, // 消息代码,整数值
WPARAM wParam, //
LPARAM lParam // 消息代码的附加参数
);
WindowProc函数名可以随便取。
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
//将char code is %d写入szChar缓冲区
MessageBox(hwnd,szChar,"char",0);
//弹出消息框,第三个参数为标题,0表示只有一个确定按钮。
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked",0);
HDC hdc;//显示文字或者图形时要用到设备描述表(Device Context),简称DC。
hdc=GetDC(hwnd);//获取与窗口关联的DC句柄
TextOut(hdc,0,50,"程序员之家",strlen("程序员之 家"));//在(0,50)输出文本,最后一个参数为文本长度
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT: //每当窗口客户区一部分或者全部无效时,就会重绘窗 口,发送该消息。
HDC hDc;
PAINTSTRUCT ps;
hDc=BeginPaint(hwnd,&ps);//在WM_PAINT中调用窗口的 DC,必须用BeginPaint。而其他地方只能用GetDC。
TextOut(hDc,0,0,"http://www.sunxin.org",strlen(http://www.sunxin.org));
EndPiant(hwnd,&ps);
break;
case WM_CLOSE: //单击关闭按钮是发送该消息
if(IDYES==MessageBox(hwnd,"是否真的结 束?","message",MB_YESNO))
{
DestroyWindow(hwnd);//在销毁窗口时发送WM_DESTROY消息
让程序退出。
}
break;
case WM_DESTROY:
PostQuitMessage(0);//发送WM_QUIT消息,终止消息循环
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
//程序没有处理的消息进行默认处理
}
return 0;
}