现在我写了一个对话框的继承,继承顺序是: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中的不能显示??
求教~~~
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中的不能显示??
求教~~~
解决方案 »
- VC++ 怎么获取web api返回的json或者xml数据
- CColorDialog 类中的 SetCurrentColor 如何使用?
- opengl中鼠标的问题
- Unicode转化Ansi后,如何获得转化后Ansi字符串的正确长度
- 散分,问下有没有想去武汉发展的兄弟?
- 请教:在对话框里加了一个toolsbar,但上面的tooltip没有显示
- [求助]串口发送数据速度快后,接收错误问题……采用的是串口精灵的代码,硬件是USB转串口
- 什么是ActiveX
- 怎么判断线段与一个矩形或者圆相交?方法越多越好,不要是初中的那种解法。没意思。
- 一个特别耐人寻味的VC程序,非常让人琢磨不透啊
- syslink控件!
- AfxMessageBox("test")弹出的窗体如何自动取消掉??
This function is required for each call to the BeginPaint function, but only after painting is complete.
绘图需要保证有“非法绘图区域”,只有在非法绘图区域(也就是InvalidateRect/Invalidate函数设置的区域)绘制的才会显示。我估计你在你整个绘制系统中不同的函数里定义了多个CPaintDC,这样当一个CPaintDC析构时,自动把所有的区域都validate了,这样就绘制无效了。
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.
}------------------------------------------------------------------------
{
CDialogB::OnPaint(); //父类中画了一条线,但是子类中并没有画出来
//这里不需要调用父类的CDialogB的OnPaint()函数,你想要绘制图形,直接在这里绘制就可以了 CPaintDC dc(this);//这条线画不出来,上面那行代码注释,则可以画出来
dc.MoveTo( 10,10 );
dc.LineTo( 50,50 );}
MSDN中对WM_PAINT的解释中有这样一句话:
The DefWindowProc function validates the update region.
因此,当你调用父类的OnPaint时,原本无效的客户区变得有效了,而你又在子类中再次CClient dc(this)时,得到的是一个空的无效区域,因此,无法绘制。除了以上几位的回答外,你还可以在子类的OnPaint中用GetDC来达到你的目的。