本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除
目录
4.示例拓展
1.实验内容
本实例实现的是绘制一个正弦曲线。
https://blog.csdn.net/q357010621/article/details/80784763
MFC的Ondraw和OnPaint函数的作用
2.实验原理
首先通过SetViewportOrg函数设置坐标原点,然后使用MoveTo和LineTo函数绘制坐标轴和曲线。下面介绍这两个函数。
(1)MoveTo函数。该函数用于设置画笔位置。
函数原型如下:
CPoint MoveTo( int x, int y );
参数说明:
● x:横坐标。
● y:纵坐标。
//表示设置起点为(x1,y1),单纯的设置一个起点,并不画线
pDC->MoveTo(x1,y1);
(2)LineTo函数。该函数用当前画笔画一条线,从当前位置连到一个指定的点。
BOOL LineTo( int x, int y );
参数说明:
● x:横坐标。
● y:纵坐标。
//表示设置起点为(x1,y1),单纯的设置一个起点,并不画线
pDC->MoveTo(x1,y1);
//由设置的起点到(x2,y2)
pDc->LineTo(x2,y2);
3.实验代码
(1)新建一个基于单文档的应用程序。
(2)主要程序代码如下:
void CMFC_实例宝典View::OnDraw(CDC* pDC)
{
CMFC_实例宝典Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
/*if (!pDoc)
return;*/
double PI = 3.14;
// TODO: 在此处为本机数据添加绘制代码
//建立画笔
CPen cpen, pen;
pen.CreatePen(PS_SOLID, 4, RGB(0, 0, 0));
cpen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
pDC->SelectObject(&cpen);
//指定原点
pDC->SetViewportOrg(100, 245);
pDC->SetTextColor(RGB(255, 0, 0));
//绘制横坐标
CString sPIText[] = { _T("-1/2π"), _T(""), _T("1/2π"), _T("π"), _T("3/2π"), _T("2π"), _T("5/2π"), _T("3π"), _T("7/2π"), _T("4π"), _T("9/2π"), _T("5π") };
for (int n = -1, nTmp = 0; nTmp <= 660; n++, nTmp += 60)
{
pDC->LineTo(60 * n, 0);
pDC->LineTo(60 * n, -5);
pDC->MoveTo(60 * n, 0);
pDC->TextOut(60 * n - sPIText[n + 1].GetLength() * 3, 16, sPIText[n + 1]);
}
pDC->MoveTo(0, 0);
CString sTmp;
//绘制纵坐标
for (int n = -4, nTmp = 0; nTmp <= 180; n++, nTmp = 60 * n)
{
pDC->LineTo(0, 60 * n);
pDC->LineTo(5, 60 * n);
pDC->MoveTo(0, 60 * n);
sTmp.Format(_T("%d"), -n);
pDC->TextOut(10, 60 * n, sTmp);
}
double y, radian;
pDC->SelectObject(&pen);
for (int x = -60; x<600; x++)
{
//弧度=x坐标/曲线宽度*角系数*π
//y坐标=振幅*曲线宽度*sin(弧度)
radian = x / ((double)60 * 2)*PI;
y = sin(radian) * 2 * 60;
pDC->MoveTo((int)x, (int)y);
pDC->LineTo((int)x, (int)y);
}
cpen.DeleteObject();
pen.DeleteObject();
}
(3)实验结果
4.示例拓展
根据此例,读者可以绘制余弦曲线,双曲线等等。