问个菜问题,有关OnPaint

cooldrone 2009-03-18 05:58:44
好久没接触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);

不过运行时为什么只画了线,没有圆,急盼高手解答。
...全文
75 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-03-19
  • 打赏
  • 举报
回复
看看CPU占用率是不是100%了?
chogimoga 2009-03-19
  • 打赏
  • 举报
回复
挺快啊,我还没开口了

你用CPaintDC后,每次都 ReleaseDC(&dc);掉就可以
cooldrone 2009-03-19
  • 打赏
  • 举报
回复
已经解决,用CClientDC最简单了。
DavidHsing 2009-03-19
  • 打赏
  • 举报
回复
年轻人,你给分少我不介意。不过有些忠告我要给你:
1、DC 是系统资源,使用时必须向系统申请和释放,频繁的操作物理 DC 于效率和稳定性上都有欠妥当;
2、如果你遇到了画面闪烁的问题,你会明白 OnPain 传指针的原因;
3、有些事情不能只看表面、图简单。
DavidHsing 2009-03-18
  • 打赏
  • 举报
回复

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。
此问题我已回答多次。
oyljerry 2009-03-18
  • 打赏
  • 举报
回复
要想保持绘图一直存在,把画图放到OnPaint中,这样刷新的时候会重新绘图
fishion 2009-03-18
  • 打赏
  • 举报
回复
把画图的方法都放到OnPaint()里实现,当你想响应这个方法的时候就用Invalidate();
hxzmm 2009-03-18
  • 打赏
  • 举报
回复
用CClientDC,不要用CPaintDC
cnzdgs 2009-03-18
  • 打赏
  • 举报
回复
CPaintDC dc(this);
这行代码在每次OnPaint函数被调用时只可用一次,不能重复使用,可以改成在OnPaint中写这行代码,把dc指针作为参数传给其它函数,其它函数都不要再构造CPaintDC对象。
cooldrone 2009-03-18
  • 打赏
  • 举报
回复

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧