VC编程之vc DoEvent
小标 2019-03-28 来源 : 阅读 1464 评论 0

摘要:本文主要向大家介绍了VC编程之vc DoEvent,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之vc DoEvent,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之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;
}

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程