一般来说不会出现这种情况,因为你必须等该消息处理函数处理完毕后,Windows才处理下一个消息。
解决方案 »
- INK : fatal error LNK1104: cannot open file "advapi32.libshell32.lib"
- 怎么编写ActiveX时钟控件,像Windows时钟那样,给个思路!
- 奇怪,把打印机设为黑白,打印的东西还是彩色
- 调用OnCreate函数后、如果修改窗口显示的内容
- 哪位大哥有特权级指令大全???顶者有分。
- 在程序中如何区分“本地硬盘”和“移动硬盘”呢?
- 前两天在写个五子棋,第一次用MFC,好多不懂的地方,还好有大家的帮助,现在程序写出来了,谢谢大家!
- 一个电脑用两只鼠标(来者有份)
- 谁知道VC中强制关机的函数是什么?
- 请问如何将wchar_t*类型转换成char*类型?
- 请问怎样用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;
}
若是排队消息应该没有重入的问题吧.不知道我说的对不对.