CDC绘曲线图问题

宇宙379 2011-08-14 06:59:49
本人从USB口接到数据,并绘图显示。需要绘制几条曲线,于是定义了几个cdc,如CDC * c1 = GetDC();c2,c2...
再分别定义了相应的画笔,再分别moveTo,LineTo。
最后发现问题,一条曲线最后总是moveTo了另外曲线的起始位置,请问什么原因?
画笔问题么,还是CDC定义的问题,抑或其他呢?
谢谢
...全文
348 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2011-08-16
  • 打赏
  • 举报
回复
现在你来看

是在百货店努力找把可用的螺丝刀的简单方便
还是去品牌店直接买一把方便呢?
gz_qmc 2011-08-16
  • 打赏
  • 举报
回复
不是控件

也可以说是控件,是自创的控件

别太迷恋窗口,窗口只是一个区域的概念
无非是用类来封装了很多对区域的描述和操作而已

你直接在某个矩形范围完成简单的绘制和鼠标消息定义
和控件有啥本质区别呢?

窗口类的封装,好比百货商店,你想用的功能基本都有
有人说,因此他很简单,很方便

可惜对于实践中的编程大都是靠专业的
好比你需要把专业的多功能螺丝刀,而百货商店怎么可能满足你
宇宙379 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gz_qmc 的回复:]
这是10条曲线的,就一个DC
不知道够不够你用
[/Quote]
这是控件做的吧?什么控件啊
宇宙379 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hb19820102 的回复:]
引用 8 楼 a379039233 的回复:
定义一个CDC画图很麻烦的,因为我要画9条线,每次要moveTo下条线的起始位置。
还有我每次运行完程序关闭时,总是出现Debug Assertion Failed。错误,好像是内存泄露。我定义的9个CDC没有释放(我在InitDialog中初始化他的)因为我不知道在哪释放?画图过程中都要用到。请问怎么做呢?


画图的话,建议你使用微软的新……
[/Quote]
哦,GDI+刚听说,查下他的资料。谢谢了。。。
宇宙379 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hezhe1008 的回复:]
你画多少条线也用不着那么多CDC呀

C/C++ code

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 if ( m_bDraw )
 {
  CClientDC dc(this) ;
  dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
  CPen pen( PS……
[/Quote]

按照你的这样我每次都要moveTo下一条线的起点,非常麻烦的。
gz_qmc 2011-08-15
  • 打赏
  • 举报
回复
我不建议楼主用线程画图
建议就在窗口的类里自定义消息函数画
而线程只负责在更新的时候发送消息

直接在线程里画图迟早要倒霉的
fandh 2011-08-15
  • 打赏
  • 举报
回复
楼主好像是多线程画图吧,如果是多线程,建议用一个线程画图,不要每个线程都画。因为有可能你几个线程所用的设备是相同的!
你每次moveto时,要记录以前鼠标所在的位置,lineto完成后,再moveto回去恢复设备的环境!
gz_qmc 2011-08-15
  • 打赏
  • 举报
回复
如果需要,换画笔是必须的

大概流程是这样

CDC *pDC=GetDC();
选择画笔1
画曲线1
.........
选择画笔n
画曲线n


如果你的数据安排得恰当,一个循环就搞定,代码就简单明了了
而且画笔你可以定义类的数组,在程序初始化的地方就创建好

for(int i=0;i<n;i++)
{
选择画笔i
画曲线i
}
宇宙379 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gz_qmc 的回复:]
一开始思路就错了,就一个CDC
几条曲线只是几个数据缓冲区而已
[/Quote]
请问每次画图时都要选择新的画笔么?
pdc.selectObject(&pen1);
//Draw with pen1
pdc.selectObject(&pen2);
//Draw with pen2
....
但是我要画很多曲线,每次都要选择画笔很麻烦,能不能先选择好画笔呢?
于是我就定义了几个CDC,先为每个选择好画笔.听你说好像不行啊?
gz_qmc 2011-08-15
  • 打赏
  • 举报
回复
这是10条曲线的,就一个DC
不知道够不够你用

呔妖怪来嘛 2011-08-15
  • 打赏
  • 举报
回复
你画多少条线也用不着那么多CDC呀

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 if ( m_bDraw )
 {
  CClientDC dc(this) ;
  dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
  CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
  CPen *pOldPen = dc.SelectObject(&pen);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(m_ptOld);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  dc.MoveTo(m_ptOld);
  dc.LineTo(point);
  m_ptOld = point ;
  dc.SelectObject(pOldPen);
 }
 CView::OnMouseMove(nFlags, point);
}
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 a379039233 的回复:]
定义一个CDC画图很麻烦的,因为我要画9条线,每次要moveTo下条线的起始位置。
还有我每次运行完程序关闭时,总是出现Debug Assertion Failed。错误,好像是内存泄露。我定义的9个CDC没有释放(我在InitDialog中初始化他的)因为我不知道在哪释放?画图过程中都要用到。请问怎么做呢?
[/Quote]

画图的话,建议你使用微软的新标准 GDI+

GDI之所以还存在是为了保持与老程序的兼容。新开发的程序应该使用GDI+。

GDI+绘图代码简单,并且功能远比GDI要强大。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gz_qmc 的回复:]
我不建议楼主用线程画图
建议就在窗口的类里自定义消息函数画
而线程只负责在更新的时候发送消息

直接在线程里画图迟早要倒霉的
[/Quote]

我也是这个意思,UI处理本身就是个线程,所以绘图应该在WM_PAIN中绘图。
VC MFC 应该是在 OnPaint 函数中。

CPaintDC dc (this);
CPen pen(PS_SOLID, 1, 0xff0000); //红色画笔
CPen* pOld = dc.SelectObject (&pen);

//-----------------------------
//在这里画图
//-----------------------------

dc.SelectObject (pOld);

//以上代码没有调试,差不多就是这样一个结构。
宇宙379 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gz_qmc 的回复:]
如果需要,换画笔是必须的

大概流程是这样

CDC *pDC=GetDC();
选择画笔1
画曲线1
.........
选择画笔n
画曲线n


如果你的数据安排得恰当,一个循环就搞定,代码就简单明了了
而且画笔你可以定义类的数组,在程序初始化的地方就创建好

for(int i=0;i<n;i++)
{
选择画笔i
画曲线i
}
[/Quote]
定义一个CDC画图很麻烦的,因为我要画9条线,每次要moveTo下条线的起始位置。
还有我每次运行完程序关闭时,总是出现Debug Assertion Failed。错误,好像是内存泄露。我定义的9个CDC没有释放(我在InitDialog中初始化他的)因为我不知道在哪释放?画图过程中都要用到。请问怎么做呢?
宇宙379 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fandh 的回复:]
楼主好像是多线程画图吧,如果是多线程,建议用一个线程画图,不要每个线程都画。因为有可能你几个线程所用的设备是相同的!
你每次moveto时,要记录以前鼠标所在的位置,lineto完成后,再moveto回去恢复设备的环境!
[/Quote]

没用多线程,对vc多线程不大熟。一个CDC的话很麻烦,我要画9条先,每次都要moveTo下条线的起始位置,太麻烦了。
gz_qmc 2011-08-14
  • 打赏
  • 举报
回复
一开始思路就错了,就一个CDC
几条曲线只是几个数据缓冲区而已

shn521 2011-08-14
  • 打赏
  • 举报
回复
代码呢

19,468

社区成员

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

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