怎么在mfc中画曲线

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在mfc中画曲线相关的知识,希望对你有一定的参考价值。

要做一个地图指示路径的导航软件,图上有些路径不能直线到达,要曲线才能,怎么画曲线啊。我看到一份代码,但是不太了解具体的意思,请给一下注释
int i,j;
CPen pen(PS_SOLID,3,RGB(255,69,0)); //画笔粗细以及颜色
CClientDC dc1(this);
CPen *pOldpen=dc1.SelectObject(&pen);
for(j=0;j<3000;j++)
dc1.MoveTo(zuobiao[spath[0]].x,zuobiao[spath[0]].y);
for(i=1;i<=k+1;i++)

for(j=0;j<8000;j++)
dc1.LineTo(zuobiao[spath[i]].x,zuobiao[spath[i]].y);

dc1.SelectObject(pOldpen);

  具体如下:
1)从CStatic派生,容易在对话框中使用。
2)能够随对话框的缩放自动改变大小,这里假设对话框中其它元素的位置基本不变。
3)曲线的粗细,颜色,线型(实,虚线)可以自由设置。
4)可以控制曲线的隐藏/显示。
5)两个坐标轴,Y轴根据数据自适应,实际数据最大最小值各偏离5%是坐标轴的最大最小值(简化起见,坐标轴采用五等分)。X轴是时间轴,一个像素点代表一个数据点,假设采样按一定的频率。
6)可以添加多条曲线。
7) 使用双缓冲,避免图形闪烁。
做一个CStatic派生控件的基本步骤:
1)定义一个从CStatic派生的类。
2)重载有关消息映射,WM_PAINT,WM_ERASEBKGND
3) 在OnPaint中绘图,在这里根据实际的需要做不同的计算,绘制。
  大致可分为以下几步,I布局计算,CStatic是整个绘图区,将这个区域划分为边缘空白,坐标轴区,曲线区等几个部分,需要算出各个部分的矩形顶点,以便控制曲线的绘制。
参考技术A 上面这段代码,就是用小段的直线,显示出曲线的效果
1. 先移动到第一个点
2. 然后向第二个点画直线
3. 向第三个点画直线
...
向第7999个点画直线
参考技术B 1、CPen(int nPenStyle, int nWidth, COLORREF crColor);第一句就是一个cpen的构造函数,包括线型,粗细和颜色;
2、然后创建一个指向客户区的设备,并将该画笔选入设备(也就是你要划线的区域);
3、如果用断线形成曲线的话,你这个程序的思路好像不大对吧,应该是一个MoveTo对应一个LineTo吧。。。。

在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果

【中文标题】在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果【英文标题】:Drawing lines in MFC VS2010 and VC++6.0 doesn't get the same result 【发布时间】:2012-02-08 05:00:50 【问题描述】:

这几天一直在学习MFC,想在VC++6.0和VS2010都用MoveTo()和LineTo()函数画线,但是在vs2010好像不行,我只加了两个窗口消息处理程序,WM_LBUTTONDOWN 和 WM_LBUTTONUP,在单文档项目中。 这是VC++6.0中的代码:

CPoint m_ptOrign;
void CStyleView::OnLButtonDown(UINT nFlags, CPoint point) 

    // TODO: Add your message handler code here and/or call default
    m_ptOrign=point;
    CView::OnLButtonDown(nFlags, point);


void CStyleView::OnLButtonUp(UINT nFlags, CPoint point) 

    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    dc.MoveTo(m_ptOrign);
    dc.LineTo(point);
    CView::OnLButtonUp(nFlags, point);

这是vs2010中的代码:

CPoint m_ptOrign;
void CStyleView::OnLButtonDown(UINT nFlags, CPoint point)

    // TODO: Add your message handler code here and/or call default
    m_ptOrign=point;
    CView::OnLButtonDown(nFlags, point);

void CStyleView::OnLButtonUp(UINT nFlags, CPoint point)

    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);

    dc.MoveTo(m_ptOrign);
    dc.LineTo(point);

    CView::OnLButtonUp(nFlags, point);

我添加到两个项目中的代码是一样的。当我松开左键时,该行立即出现在vc++6.0项目中,但它没有出现在vs 2010 mfc项目中。 如果 vs 2010 项目窗口的大小或位置发生变化,则会出现该行。 但是当我在 vs 2010 项目中使用dc.Rectangle(CRect(m_ptOrign,point)) 时,它运行良好。 不知道为什么.....

还有,如果我使用

CBrush *pBbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBbrush);
dc.Rectangle(CRect(m_ptOrign,point))

在vs2010中,又不行了,像画线的情况

【问题讨论】:

你为什么期望NULL_BRUSH 来绘制任何东西? 默认笔刷是白色。笔刷不影响矩形的边框。如果我不更换画笔,矩形将被填充一些颜色。如果我在同一点绘制两个矩形,(第一个小,第二个大或者它们很接近),小一个将完全被覆盖或擦除大的,小的就看不见了screen.@CodyGray 【参考方案1】:

LineTo 将使用当前选择到 DC 中的笔。由于您尚未选择笔,它将使用默认值。不知道为什么 VC6 和 VC2010 会不一样,可能和两个版本的 MFC 不同有关吧。

一般来说,抓住 DC 并开始使用它是个坏主意。更好的是在 OnPaint 或 OnDraw 方法中完成所有绘图。您可以调用 InvalidateRect 以将绘制消息发送到窗口。

【讨论】:

默认笔在背面,实心,1 点。对于用户操作的绘制,不需要使谁窗口无效(即通过 OnPaint 处理),使用本地 CClientDC 绘制就可以了。

以上是关于怎么在mfc中画曲线的主要内容,如果未能解决你的问题,请参考以下文章

请教C#中如何在 WinForm中画曲线图

玩转贝塞尔曲线,教你在Unity中画Bezier贝塞尔曲线(二阶三阶),手把手教你推导公式

玩转贝塞尔曲线,教你在Unity中画Bezier贝塞尔曲线(二阶三阶),手把手教你推导公式

如何在origin中绘制多条曲线

在MATLAB中,画一条曲线,用啥命令?

如何用origin画3d曲线图