现在我写了一个对话框的继承,继承顺序是:CDialogA->CDialogB->CDialog
CDialogB中的OnPaint如下:void CDialogB::OnPaint()
{    CPaintDC dc(this); // device context for painting
    dc.MoveTo( 5,5 );
    dc.LineTo( 100,5 );    CDialog::OnPaint();

}
CDialogA中的OnPaint如下:void CDialogA::OnPaint()
{
 
  CDialogB::OnPaint(); //父类中画了一条线,但是子类中并没有画出来
  CPaintDC dc(this);//这条线画不出来,上面那行代码注释,则可以画出来
  dc.MoveTo( 10,10 );
  dc.LineTo( 50,50 );}
CDialogA 是继承CDialogB,如上面得注释,为什么CDialogA中的不能显示??
求教~~~

解决方案 »

  1.   

    dc析构的时候,EndPaint了。
    This function is required for each call to the BeginPaint function, but only after painting is complete. 
      

  2.   

    http://topic.csdn.net/t/20021016/19/1102579.html 看看这个。
      

  3.   

    引用他人:
    绘图需要保证有“非法绘图区域”,只有在非法绘图区域(也就是InvalidateRect/Invalidate函数设置的区域)绘制的才会显示。我估计你在你整个绘制系统中不同的函数里定义了多个CPaintDC,这样当一个CPaintDC析构时,自动把所有的区域都validate了,这样就绘制无效了。 
      

  4.   

    在子窗口的OnPaint中,不要调父窗口的OnPaint
    void CDialogB::OnPaint()
    {    CPaintDC dc(this); // device context for painting
        dc.MoveTo( 5,5 );
        dc.LineTo( 100,5 );//    CDialog::OnPaint(); // 严格禁止调用父窗口的OnPaint.
                              // 如果想让父窗口的先画,自己再话,那么需要在父窗口中封装一个函数:
                                  // OnDraw(CDC *pMemDC),这个函数中,不能定义CPaintDC dc(this)
                              // 而是使用传进去的dc. 最后,可以由子窗口来调用OnDraw.
        
    }------------------------------------------------------------------------
      

  5.   

    void CDialogA::OnPaint()
    {
     
      CDialogB::OnPaint(); //父类中画了一条线,但是子类中并没有画出来
    //这里不需要调用父类的CDialogB的OnPaint()函数,你想要绘制图形,直接在这里绘制就可以了  CPaintDC dc(this);//这条线画不出来,上面那行代码注释,则可以画出来
      dc.MoveTo( 10,10 );
      dc.LineTo( 50,50 );}
      

  6.   

    父类中的OnPaint调用的是DefWindowProc,
    MSDN中对WM_PAINT的解释中有这样一句话:
    The DefWindowProc function validates the update region.
    因此,当你调用父类的OnPaint时,原本无效的客户区变得有效了,而你又在子类中再次CClient dc(this)时,得到的是一个空的无效区域,因此,无法绘制。除了以上几位的回答外,你还可以在子类的OnPaint中用GetDC来达到你的目的。