这段代码其实并不是在"对话框"上作图.
  注意:
CWnd* p=GetDlgItem(IDC_S);
CDC* c=p->GetDC();
  所获取的CWnd和CDC其实只是对话框上的控件IDC_S的,然后,也都是在IDC_S上作图的.
明白这点,对你的问题:WM_PAINT在调用UpdateWindow或RedrawWindow时发出。
  上面的代码中在OnPaint()中调用UpdateWindow()是不是有些矛盾?
  就应该好理解了.
  调用UpdateWindows是让控件IDC_S产生一个WM_PAINT的事件,不是再次触发对话框的OnPaint事件.

解决方案 »

  1.   

    Invalidate()只是标记 c 无效,即 c 需要重画,并没干多少事,UpdateWindows检查谁要重画,产生一个事件通知其它过程去干.
      

  2.   

    packager大侠说:“调用UpdateWindows让控件IDC_S产生一个WM_PAINT的事件,不是再次触发对话框的OnPaint事件.”  请问: 所产生的WM_PAINT的事件,将触发谁的OnPaint事件,难道是控件IDC_S的OnPaint()?
            我有些糊涂! 我是个初学者
                               请高手指明!          非常感谢 packager 、wine 和各位高手
                    
      

  3.   

    1.然也,让IDC_S重画.
    2.WINE的讲述可谓精辟至极.
      

  4.   

    这主要是,你对MFC的消息机制理解的不太够的原因导致:
    1、当对话框窗口被其他窗口覆盖或对话框窗口被移出至屏幕外,需要重画对话框自己本身时,OnPaint事件被触发。
    2、你的OnPaint()函数里的主要工作:是去绘制在对话框里面的一个控件(其ID号为IDC_S)的颜色,绘制颜色的范围是在该控件的(0,0,10,10)。
    3、缘于对话框窗口已经重绘,那么,IDC_S控件也需要重绘,所以UpdateWindow()也就触发IDC_S的OnPaint()。
    4、为什么其它正常情况,不要再触发对话框中的其它子控件OnPaint()事件呢?原因很简单,因为,你是去获IDC_S控件的DC,你自己往IDC_S控件上画颜色,这件事,默认的MFC是不会干这件事的,在这种情况下,它也不知道,所以,你要自己去通知你的IDC_S控件去重新绘制一下。
      

  5.   

    另外,再补充一点:其中的p->Invalidate();可以忽略,因为UpdateWindow()会重做这件事情。把它注释掉,程序工作正常。