vc DoEvent

vc中DoEvent函数一般写成:

MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //非阻塞查看消息队列是否有消息过来,有消息返回非零进入循环

//无消息返回0则跳出
{
TranslateMessage(&msg) ; //有消息时,虚拟键消息转换为字符消息
DispatchMessage(&msg);//发送消息给窗口程序
}



PeekMessage:

函数功能:该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。

函数原型:BOOL PeekMessage(LPMSG IpMsg,HWND hWnd,UINT wMSGfilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);

参数:

lpMsg:接收消息信息的MSG结构指针。

hWnd:其消息被检查的窗口的句柄。

wMsgFilterMin:指定被检查的消息范围里的第一个消息。

wMsgFilterMax:指定被检查的消息范围里的最后一个消息。

wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:

PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉

PM_REMOVE:PeekMessage处理后,消息从队列里除掉。

可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。

缺省地,处理所有类型的消息。若只处理某些消息,指定一个或多个下列值:

PM_QS_INPUT:Windows NT5.0和Windows 98:处理鼠标和键盘消息。

PM_QS_PAINT:Windows NT 5.0和Windows 98:处理画图消息。

PM_QS_POSTMESSAGE:Windows NT 5.0和Windows 98:处理所有被寄送的消息,包括计时器和热键。

PM_QS_SENDMESSAGE:Windows NT 5.0和Windows 98:处理所有发送消息。

返回值:如果消息可得到,返回非零值;如果没有消息可得到,返回值是零。


备注:和函数GetMessage不一样的是,函数PeekMesssge在返回前不等待消息被放到队列里。

PeekMesssge只得到那些与参数hWnd标识的窗口相联系的消息或被lsChild确定为其子窗口相联系的消息,并且该消息要在由参数 wMsgFiterMin和wMsgFiherMax确定的范围内。如果hWnd为NULL,则PeekMessage接收属于当前调用线程的窗口的消息 (PeekMessage不接收属于其他线程的窗口的消息)。如果hWnd为-1,PeekMessage只返回hWnd值为NULL的消息,该消息由函 数PostThreadMessage寄送。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消 息(即,无范围过滤)。

常数WM_KEYFIRST和WMKEYLAST可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRST和WM_MOUSELAST可用来接收所有的鼠标消息。

PeekMessage通常不从队列里清除WM_PANT消息。该消息将保留在队列里直到处理完毕。但如果WM_PAINT消息有一个空更新区,PeekMessage将从队列里清除WM_PAINT消息。



TranslateMessage() 函数

函数功能: 该函数将虚拟键消息转换为字符消息,(Windows 对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得到字符消息,需要键盘映射转换为字符的消息),字符消息被函数DispatchMessage() 函数寄送到调用线程的消息队列里, 当下一次线程调用函数GetMessage() 或 PeekMessage() 时被读出。

函数原型: BOOL TranslateMessage( CONST MSG* lpMsg );

参数: lpMsg: 指向含有消息的MSG结构的指针,该结构含有用函数GetMessage()或PeekMessage()从调用线程的消息队列里取得的消息信息。

击键时: 当我们敲击键盘上某个字符键时,系统将产生WM_KEYDOWN 和 WM_KEYUP 消息,这两个消息的附加参数(wParam和lParam)包含的是虚拟键代码和扫描码等信息,而我们在程序中往往需要得到的是某个字符的ASCII码(也就是直观上,能代表我们点击的是某个字符键)。 TranslateMessage函数就可以将WM_KEYDOWN 和 WM_KEYUP 消息的组合转化为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码), 并将转换后的新消息投放到调用线程的消息队列中。

返回值: 如果消息被转化(即,字符消息被寄送到调用线程的消息队列里),返回非零值, 如果消息是WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, 返回非零值,不考虑转换。 如果消息没被转换,即字符消息没有被寄送到调用线程的消息队列里,返回值是零。

备注: TranslateMessage函数不修改由参数lpMsg指向的消息。

消息WM_KEYDOWN和WM_KEYUP 组合产生一个WM_CHAR 或WM_DEADCHAR消息。

消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或WM_SYSDEADCHAR消息。

TranslateMessage仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。 如果应用程序为其它用途而处理虚拟键消息,不应该调用TranslateMessage函数。 例如,如果TranslateAcceletator函数返回一个非零值,则应用程序将不调用TranslateMessage函数哦。

windows CE: Windows CE 不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage函数产生的WM_CHAR 消息中的lKeyData 参数(lParam)的取值。

TranslateMessage函数只能用于转换由GetMessage或PeekMessage、函数接受收到的消息。


DispatchMessage:

函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。

函数原型:LONG DispatchMessage(CONST MSG*lpmsg);

参数:

lpmsg:指向含有消息的MSG结构的指针。

返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

备注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IPa1ram指向的函数,而不是调用窗口程序。



You can simulate the VB DoEvents() function using this:

bool DoEvents()
{
 MSG msg;
 while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 {
  if (msg.message == WM_QUIT)
  {
   returnfalse;
  }
  if (!AfxGetApp()->PreTranslateMessage(&msg))
  {
   ::TranslateMessage(&msg);
   ::DispatchMessage(&msg);
  }
 }
 returntrue;
}


你可能感兴趣的:(代码,message,VC,DoEvent)