1.4.3消息循环

消息循环:
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;
}
发布了47 篇原创文章 · 获赞 3 · 访问量 871

猜你喜欢

转载自blog.csdn.net/qq_42148307/article/details/105191702
今日推荐