根据这段源代码 一步一步剖析CDC的使用

void CDrawSinXView::OnDraw(CDC* pDC)
{
CDrawSinXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//建立画笔
CPen pen_Zuobixi,pen_sinx;
pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));
pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));
pDC->SelectObject(&pen_Zuobixi);
//指定原点
pDC->SetViewportOrg(100,255);
pDC->SetTextColor(RGB(255,0,0));
//绘制横坐标
CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
int n=-1;
int nTemp=0;
while (nTemp<=660)
{
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]);
n++;
nTemp +=60;
}
pDC->MoveTo(0,0);
CString strTemp;
//绘制纵坐标
for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60)
{
pDC->LineTo(0,60*n);
pDC->LineTo(5,60*n);
pDC->MoveTo(0,60*n);
strTemp.Format("%d",-n);
pDC->TextOut(10,60*n,strTemp);
}
double y,radian;
pDC->SelectObject(&pen_sinx);
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);
}
pen_sinx.DeleteObject();
pen_Zuobixi.DeleteObject(); }

void CDrawSinXView::OnDraw(CDC* pDC)

这个函数在File 中 的view.cpp中.

一个一个剖析..

CDrawSinXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

系统自带的,并不清楚有什么卵用....

<span style="font-family: Arial, Helvetica, sans-serif;">//建立画笔</span>
CPen pen_Zuobixi,pen_sinx;
pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));
pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));
pDC->SelectObject(&pen_Zuobixi);

如注释所示

1.用CPen 建立一个画笔,并且规定画笔的虚实线(画笔类型),粗,颜色;

此处详情见

http://blog.sina.com.cn/s/blog_71f17cbd0100qsgn.html

2.通过SelectObject来选择当前的画笔

3.RGB 0 0 0 是黑色

4.RGB 0 0 255是 蓝色

//指定原点
pDC->SetViewportOrg(100,255);
pDC->SetTextColor(RGB(255,0,0));

1.SetViewportOrg 来设定原点的坐标 ..

2.SetTextColor     设置字体颜色

//绘制横坐标
CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
int n=-1;
int nTemp=0;
while (nTemp<=660)
{
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]);
n++;
nTemp +=60;
}
pDC->MoveTo(0,0);

1.LinkTo,表示画笔从当前位置往(x,y)的位置画去

2.MoveTo 表示画笔回到(x,y)的位置(不留下轨迹)

3.TextOut  (x,y,string);

CString strTemp;
//绘制纵坐标
for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60)
{
pDC->LineTo(0,60*n);
pDC->LineTo(5,60*n);
pDC->MoveTo(0,60*n);
strTemp.Format("%d",-n);
pDC->TextOut(10,60*n,strTemp);
}

1.与上面的类似...但是利用FOrmat来得到CSrting;

double y,radian;   //绘制sinx
pDC->SelectObject(&pen_sinx);
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);
}
pen_sinx.DeleteObject();
pen_Zuobixi.DeleteObject();

直接绘制吧..

记得DeleteObject来删除画笔...

照猫画虎 完成了 -2Pi->2Pi 的sin图像。。

代码如下:

void CWj1401_0302140107_6View::OnDraw(CDC* pDC)
{
CPen pen_Zuobixi,pen_sinx; //创建画笔
pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0)); //描述画笔
pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255)); //描述画笔
pDC->SelectObject(&pen_Zuobixi); //设定谁为现在的画笔
//指定原点
pDC->SetViewportOrg(300,255); //指定原点
pDC->SetTextColor(RGB(255,0,0)); //指定文本颜色
//绘制横坐标
CString sPIText[]={"-2π","-3/2π","-1π","-1/2π","","1/2π","1π","3/2π","2π"}; //创建文本
int n=-1;
int nTemp=0;
while (nTemp<=480)
{
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]); // (横坐标,纵坐标,字符串)
n++;
nTemp +=60;
}
pDC->MoveTo(180,0);
CString strTemp;
//绘制纵坐标
for(n=-2,nTemp = 0;nTemp<=240;n++,nTemp+=60)
{
pDC->LineTo(180,60*n);
pDC->LineTo(185,60*n);
pDC->MoveTo(180,60*n);
strTemp.Format("%d",-n);
pDC->TextOut(190,60*n,strTemp);
}
double y,radian;
pDC->SelectObject(&pen_sinx);
for(int x=-60;x<420;x++)
{
//弧度=X坐标/曲线宽度*角系数*π
//Y坐标=振幅*曲线宽度*sin(弧度)
radian =x/((double)60*2)*PI;
y=-cos(radian)*60;
pDC->MoveTo((int)x,(int)y);
pDC->LineTo((int)x,(int)y);
}
pen_sinx.DeleteObject();
pen_Zuobixi.DeleteObject(); }

【MFC学习笔记-作业6-sin图像】【OnDraw(CDC* pDC)】的更多相关文章

  1. 【MFC学习笔记-作业7-小型画图软件】【】

    作业要求: 按下鼠标右键画圆. 按下鼠标左键移动曲线. 丝毫没有思路..网上教程又比这个程序复杂100倍... 好吧 总算找到一个合适的了... 转载至:http://blog.chinaunix.n ...

  2. 孙鑫MFC学习笔记11:保存图像

    1.CPtrArray指针数组 2.CPtrArray返回void指针,需要做类型转换 3.View类中的OnPaint调用OnPrepareDC和OnDraw,如果覆盖OnPaint,就不会调用On ...

  3. 【MFC学习笔记-作业8-蝴蝶飞~】【什么鬼作业】

    作业要求: 用定时器控制蝴蝶在窗口废物,如图所示... 这是什么鬼作业啊...蝴蝶还要我这个手残手画啊233333333          (ノಠ .ಠ)ノ彡┻━┻ 不过多亏之前几个鬼作业的福 收获颇 ...

  4. 【MFC学习笔记-作业10-稍微难一点的画图】

    设计如图所示的菜单,并编写相应用的消息处理函数.. 菜单1: 画图 画线 画矩形 画图 菜单2:颜色 红色(r) CTRL+F2; 绿色(g) CTRL +F1 蓝色(b) CTRL+F3: 问题:V ...

  5. 【MFC学习笔记-作业9-基于单击响应的计算平均成绩】【】

    要求..单击出现 一个输入成绩的框,点确定后,计算平均成绩 意义很大~ 完成对话框   再写个鼠标点击的响应部分 鼠标点击的响应部分为难点.... void CWj1401_0302140107_9V ...

  6. 【MFC学习笔记-作业5-小数据库】【单选框,复选框,滚动条,列表框】

    界面已经实现完毕. 要完成的操作就是1.性别分组(2选1) 2.属性勾选 3.年龄通过滚动条调整 4.职称通过下方的列表框选择 5.输入姓名 6.存入左方的列表框 7.当选择左方列表框的人时,可以显示 ...

  7. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  8. C#数字图像处理算法学习笔记(三)--图像几何变换

    C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:

  9. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

随机推荐

  1. struts2采用convention-plugin实现零配置

    最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置. 配置文件精简了,的确是简便 ...

  2. Android系统的开机画面显示过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7691321 好几个月都没有更新过博客了,从今天 ...

  3. Swift中NSData与NSDictionary之间的相互转换

    原创Blog,转载请注明出处 使用NSKeyedUnarchiver类来进行相互转换 1.NSDictionary转NSData var dictionaryExample : [String:Any ...

  4. HDU 2030 统计汉字

    BestCoder官方群:385386683 欢迎加入~ 寻人启事:2014级新生看过来! 汉字统计 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. 关于asp.net简单的下载问题

    关于asp.net的下载,只需将打开相应的文件路径就能在浏览器上实现下载功能,比如项目的同级目录上有一个文件 苍老师.zip<a href="苍老师.zip">< ...

  6. jquery .net 无刷新多文件上传

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中的使用,您也可以点击下面的链接进行演示 ...

  7. MVC 全局异常过滤器HandleErrorAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. ASP.NET MVC 自定义错误页面心得

    自定义错误页面的目的,就是为了能让程序在出现错误/异常的时候,能够有较好的显示体验. 所以,首先要先了解,我们可以在哪里捕获异常. 当程序发生错误的时候,我们可以在两个地方捕获: Global里面的A ...

  9. pom文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. LogBoy 之Android Studio控制台输出日志太多清空

    在使用Android studio的时候,有时候会由于手机输出的日志太多,导致控制台瞬间清空,尤其是遇见一些FATAL Exception时候,瞬间控制台就被清空了,根本捕获不到,导致其他调试的日志也 ...