偶在一个很简单的MFC单文档中的OnDraw函数中用MessageBox输出一段字符串,为什么字符串对话框要出现2次啊?————————————————————————————————————
void CMy11View::OnDraw(CDC* pDC)
{
CMy11Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0,0,"kkk");
MessageBox("kkkk");
// TODO: add draw code for native data here}
—————————————————————————————————————
void CMy11View::OnDraw(CDC* pDC)
{
CMy11Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0,0,"kkk");
MessageBox("kkkk");
// TODO: add draw code for native data here}
—————————————————————————————————————
因为窗口的一部分由被遮盖到显示,都要调用ondraw()
最初显示时又要调用一次,而此时MessageBox("kkkk");没有返回,所以当前的线程阻塞,不会再弹出窗口重绘时(只要窗口改变,最小化,移动等等)要调用这个函数,但你点击了OK或者其他按键, 所以调试的时候,程序总是在这里循环执行
窗口初始绘制时调用OnDraw一次,
最初显示时需要重画调用OnDraw一次,所以你的MessageBox出现了2次,
以后出现最小化,最大化,窗口切换等(但不包括移动)视图窗口都要重画,
重画就要调用OnDraw,
你调试的时候,VC编译器先是弹出视图窗口,这个操作调用了OnDraw,在函数里遇到断点,然后马上把编译器窗口显示在桌面最前端,而视图窗口放到后面,这又调用了OnDraw,如此循环,所以会出现你说的“程序总是在这里循环执行”!!!
上面所有这些重画消息都是framework线程调用的,MessageBox在另一个线程,不会阻塞framework线程!!!以上属于个人观点,我也是初学者,还请朋友们指正,共同进步!
在OnPaint()函数内容如下:
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
所以在OnDraw(...)中不管写什么程序,只要窗口被刷新或重新显示,OnDraw中的代码都会被执行一遍,所以,只要你反复的Alt+Tab该窗口,都会让该窗口OnDraw一次,所以会出现很多MessageBox;