好久没接触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);不过运行时为什么只画了线,没有圆,急盼高手解答。
我建了个基于对话框的工程,写了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);不过运行时为什么只画了线,没有圆,急盼高手解答。
这行代码在每次OnPaint函数被调用时只可用一次,不能重复使用,可以改成在OnPaint中写这行代码,把dc指针作为参数传给其它函数,其它函数都不要再构造CPaintDC对象。
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。
此问题我已回答多次。
1、DC 是系统资源,使用时必须向系统申请和释放,频繁的操作物理 DC 于效率和稳定性上都有欠妥当;
2、如果你遇到了画面闪烁的问题,你会明白 OnPain 传指针的原因;
3、有些事情不能只看表面、图简单。