- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC编程Windws消息处理机制、阻塞试验、SetTimer、MessageBox、小心消息响应处理函数多个并存2012_7
VC 编程Windows 消息处理机制、阻塞试验、SetTimer、MessageBox、小心消息响应处理
函数多个并存
wxleasyland@
2012.7
wxleasyland 试验:
VC6 标准WIN32 程序,Windows 消息处理机制:
1.在注册窗口类时,指定了消息处理函数WndProc ()。
2.WinMain ()里有消息循环:
while (GetMessage(msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, msg))
{
TranslateMessage (msg) ;
DispatchMessage(msg) ;
}
}
3.在WndProc()里,对各个消息进行处理!!
l 消息队列是线程所有,并非窗口所有和进程所有。
l 一个线程的所有窗口,比如父窗口 (主窗口)、对话框、 息框等都是使用这
个线程的同一个消息队列!!!!
l 窗口有消息循环。窗口里的控件应该就没有消息循环了吧。
试验:
一、MFC 中,用TIMER,发现,在TIMER 响应函数中,用MessageBox(),则会不断
地出现MessageBox。
而且当前响应函数会停止在MessageBox 上,直到MessageBox 返回才继续执行后面
的语句!
用 SendMessage 或 PostMessage 来试消息响应,也是一样:响应函数中有
MessageBox(),则会出现多个MessageBox。
说明MessageBox 阻塞了函数,却没有阻塞消息分发。
二、VC 建 WIN32 程序 (标准HELLO WORLD),试验发现,如果 WndProc ()里有
MessageBox,当前的WndProc()会暂时停止在MessageBox,直到MessageBox 返回才继
续执行后面的语句!!
如果MessageBox 出现,这时一个WM_PAINT 出现了,则会执行一个新的WndProc()。
即WndProc()并行出现了!!线程只有一个, WndProc()可以出现多个!
用ABOUT 对话框代替MessageBox,情况也是一样!ABOUT 对话框出现时,父窗口(即
主程序)点不出来,但父窗口WM_PAINT 能正常运行!!!
即像别的文章说的,对话框和消息框会有自己的消息循环,但线程是同一个线程,
所以线程的所有消息会被分发处理。
三、再试下面程序,
void CUnicodewcharDlg::OnButton4()
{
SendMessage(UM_SOCK); // UM_SOCK 为自定义消息,已经和OnRecv 相关联
}
BOOL running=FALSE ;
void CUnicodewcharDlg::OnRecv()
{
if (running==TRUE) {::MessageBox(NULL,ERROR,,MB_OK); return;}
running=TRUE ;
::MessageBox(NULL,OK,,MB_OK) ;
::MessageBox(NULL,返回,,MB_OK) ;
running=FALSE ;
}
发现,按OnButton4 后,先出现一个OK消息框,再点OnButton4,就出现ERROR
消息框。
如果OK消息框关闭了,则不会出现返回消息框,再点 OnButton4,仍是出现
ERROR消息框!!!!!!!
一定要ERROR消息框和OK消息框都关闭了,才会出现返回消息框,再点
OnButton4,才会出现OK消息框!!
说明是:
父窗消息循环,调用消息响应函数生成了第一个消息框,同时父窗调用的消息响应
函数阻塞,父窗消息循环阻塞;第一个消息框开始接手负责消息循环 (是自己有消息循
环还是把父窗的消息循环重入了继续使用?)。
第一个消息框消息循环,调用消息响应函数生成了第二个消息框,同时第一个消息
框调用的消息响应函数阻塞,第一个消息框消息循环阻塞;第二个消息框开始接手负责
消息循环(是自己有消息循环还是把父窗的消息循环重入了继续使用?)。
第二个消息框消息循环。。。
即:父窗阻塞-第一个消息框阻
文档评论(0)