偶在一个很简单的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}
—————————————————————————————————————

解决方案 »

  1.   

    你的调试窗口一会就跳出来一下,将程序挡住,一会又把程序提到当前,导致窗口老是被重绘
    因为窗口的一部分由被遮盖到显示,都要调用ondraw()
      

  2.   

    你要知道OnDraw函数的调用发生在什么时候窗口改变大小,移动,等等,都调用这个函数
      

  3.   

    窗口最初绘制时调用一次,这是主线程调用的,
    最初显示时又要调用一次,而此时MessageBox("kkkk");没有返回,所以当前的线程阻塞,不会再弹出窗口重绘时(只要窗口改变,最小化,移动等等)要调用这个函数,但你点击了OK或者其他按键, 所以调试的时候,程序总是在这里循环执行
      

  4.   

    void CMy11View::OnDraw(CDC* pDC)哈哈,才2次啊?你走运,你要是放在OnPaint()里试试,估计10次都不止,移动,改变大小,重画都要调用的。先去理解消息吧:)
      

  5.   

    抱歉,我上面说的是错误的!我试验了一下,应该是这样的:
    窗口初始绘制时调用OnDraw一次,
    最初显示时需要重画调用OnDraw一次,所以你的MessageBox出现了2次,
    以后出现最小化,最大化,窗口切换等(但不包括移动)视图窗口都要重画,
    重画就要调用OnDraw,
    你调试的时候,VC编译器先是弹出视图窗口,这个操作调用了OnDraw,在函数里遇到断点,然后马上把编译器窗口显示在桌面最前端,而视图窗口放到后面,这又调用了OnDraw,如此循环,所以会出现你说的“程序总是在这里循环执行”!!!
    上面所有这些重画消息都是framework线程调用的,MessageBox在另一个线程,不会阻塞framework线程!!!以上属于个人观点,我也是初学者,还请朋友们指正,共同进步!
      

  6.   

    只要窗口重绘,不管何种方式使之重绘,都会调用OnPaint()函数
    在OnPaint()函数内容如下:
    void CView::OnPaint()
    {
    // standard paint routine
    CPaintDC dc(this);
    OnPrepareDC(&dc);
    OnDraw(&dc);
    }
    所以在OnDraw(...)中不管写什么程序,只要窗口被刷新或重新显示,OnDraw中的代码都会被执行一遍,所以,只要你反复的Alt+Tab该窗口,都会让该窗口OnDraw一次,所以会出现很多MessageBox;