关于消息处理函数 一般来说不会出现这种情况,因为你必须等该消息处理函数处理完毕后,Windows才处理下一个消息。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是类似消息重入的问题,请看以下例子:我在主程序中用Create()创建了一个窗口TopWnd,该窗口的父窗口为NULL(为了主程序在最小化时该窗口不最小化),在TopWnd中向主窗口发送消息,比如点击了一个按钮后,// 主程序的MainFrame中处理TopWnd发送消息的代码void CMainFrame::OnTopWndMessage(WPARAM wParam,LPARAM lParam){ static BOOL bInThisFunction=FALSE; if (bInThisFunction == TRUE) return; // avoid to re-enter bInThisFunction=TRUE; if (判断) { AfxMessageBox("提示语句"); } else { 其它代码 } bInThisFunction=FALSE;}注意上述代码中的AfxMessageBox语句,当执行了AfxMessageBox后,如果TopWnd再发送此消息,则会再进入此消息处理函数(证明是会弹出多个Message Box)。1: 分析: 因为TopWnd的父窗口不是AfxGetMainWnd()(或其子窗口),所以它拥有自己的消息泵 (Message Pump);否则不会发生重入的问题。2: 解决: 留意上述代码的bInThisFunction布尔变量,由它实现防止重入的工作。 3: BTW: 可以参考CFrameWnd::RecalcLayout(),也进行了这样的处理,不过我不知道 为什么它要防止重入。 // X:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\WINFRM.CPP void CFrameWnd::RecalcLayout(BOOL bNotify){ if (m_bInRecalcLayout) return; m_bInRecalcLayout = TRUE; 重新计算位置的代码 m_bInRecalcLayout = FALSE;} WINDOWS的消息有两种:排队消息和非排队消息,你说的是非排队消息吧.若是排队消息应该没有重入的问题吧.不知道我说的对不对. 我觉得应该去查查关于SendMessage和PostMessage的文档。 socket 怎么发送和接受不定长的struct呢? 一个简单batch file,新手求解答 ado 访问数据库 新人请到-VC知识库来! 关于TCP客户端的问题 在MDI中如何限制只有一个文档对象 MFC程序界面在Win7中等(125%)字体下显示不正常 Unhandled exception in music.exe 0xc0000005:Access Violation 问题(vc),求助高手 编译时老是跳出提示APPMODUL.CPP 大家来研究一下PDG格式 请问怎样用socket远程唤醒处于睡眠状态的机器??? 请教有关web page拼接问题?
(为了主程序在最小化时该窗口不最小化),在TopWnd中向主窗口发送消息,
比如点击了一个按钮后,// 主程序的MainFrame中处理TopWnd发送消息的代码
void CMainFrame::OnTopWndMessage(WPARAM wParam,LPARAM lParam)
{
static BOOL bInThisFunction=FALSE; if (bInThisFunction == TRUE) return; // avoid to re-enter
bInThisFunction=TRUE; if (判断) {
AfxMessageBox("提示语句");
}
else {
其它代码
}
bInThisFunction=FALSE;
}注意上述代码中的AfxMessageBox语句,当执行了AfxMessageBox后,如果
TopWnd再发送此消息,则会再进入此消息处理函数(证明是会弹出多个Message Box)。1: 分析:
因为TopWnd的父窗口不是AfxGetMainWnd()(或其子窗口),所以它拥有自己的消息泵
(Message Pump);否则不会发生重入的问题。
2: 解决:
留意上述代码的bInThisFunction布尔变量,由它实现防止重入的工作。
3: BTW:
可以参考CFrameWnd::RecalcLayout(),也进行了这样的处理,不过我不知道
为什么它要防止重入。
// X:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\WINFRM.CPP
void CFrameWnd::RecalcLayout(BOOL bNotify)
{
if (m_bInRecalcLayout)
return; m_bInRecalcLayout = TRUE;
重新计算位置的代码
m_bInRecalcLayout = FALSE;
}
若是排队消息应该没有重入的问题吧.不知道我说的对不对.