好久没接触MFC了,问个菜问题。
我建了个基于对话框的工程,写了2个画图函数
int CAaaDlg:: Line(float x1,float y1,float x2,float y2)
{
CPaintDC dc(this); 
                        dc.MoveTo(x1,y1);
                        dc.LineTo(x2,y2);
return 1;
}int CAaaDlg:: Circle(float x1,float y1,int radius)
{
CPaintDC dc(this); 
                        dc.MoveTo(x1,y1);
                        dc.Ellipse(x1-radius,y1-radius,x1+radius,y1+radius);
return 1;
}OnPaint如下
void CAaaDlg::OnPaint() 
{
aa();
CDialog::OnPaint();
}
在函数aa里调用了自己写的那2个函数,
CAaaDlg *dlg;
dlg = (CAaaDlg*)AfxGetMainWnd();
dlg->Line(50,30,170,40);
dlg->Circle(170,140, 20);不过运行时为什么只画了线,没有圆,急盼高手解答。

解决方案 »

  1.   

    CPaintDC dc(this); 
    这行代码在每次OnPaint函数被调用时只可用一次,不能重复使用,可以改成在OnPaint中写这行代码,把dc指针作为参数传给其它函数,其它函数都不要再构造CPaintDC对象。
      

  2.   

    把画图的方法都放到OnPaint()里实现,当你想响应这个方法的时候就用Invalidate();
      

  3.   

    要想保持绘图一直存在,把画图放到OnPaint中,这样刷新的时候会重新绘图
      

  4.   


    void CXXXXX::OnPaint()
    {
        //Get device context for painting
        CPaintDC dc(this);    DrawYourOwnGraphics(&dc);    //在这个函数里面绘制,DC 作为指针传递过去。    ReleaseDC(&dc);    //Do not call CWnd::OnPaint() for painting messages
    }
    如果你需要大量绘图,要避免闪烁请使用双缓冲并处理 OnEraseBkgnd。
    此问题我已回答多次。
      

  5.   

    已经解决,用CClientDC最简单了。
      

  6.   

    挺快啊,我还没开口了你用CPaintDC后,每次都 ReleaseDC(&dc);掉就可以
      

  7.   

    年轻人,你给分少我不介意。不过有些忠告我要给你:
    1、DC 是系统资源,使用时必须向系统申请和释放,频繁的操作物理 DC 于效率和稳定性上都有欠妥当;
    2、如果你遇到了画面闪烁的问题,你会明白 OnPain 传指针的原因;
    3、有些事情不能只看表面、图简单。