这学期开了一门计算机图形学的课程,感觉蛮有趣的,所以想把书上的那些样例程序都实现一遍,了解基本的绘图原理和要点。

1,使用用户自定义的映射模式,设置窗口大小和视区相等的二维坐标系。视区中x轴水平向右为正,y轴垂直向上为正,原点位于屏幕客户区中心。

void CTestoneView::OnDraw(CDC* pDC)
{
CTestoneDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here CRect rect; //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 }

2,在屏幕上使用SetPixelV()函数将crColor参数设置为随机颜色,用像素点在x轴负向画出对角点为(-150,-50)和(-50,50)的正方形。然后使用GetPixel()函数依次读出该正方形内各像素点的颜色,在x轴正向的对称位置上重新绘制该正方形。

    CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 srand((unsigned)time(NULL)); //使用系统时间初始化随机种子,使得每次产生不同的随机数
COLORRET crColor; //声明一个COLORRET变量crColor,用于存放像素点的颜色值
int x,y; //声明像素点位置坐标
/* 用随机颜色在x轴负向绘制对角点为(-150,-50)和(-50,50)的正方形*/
for(y=-;y<;y++)
for(x=-;x<-;x++)
pDC->SetPixelV(x,y,RGB(rand()%,rand()%,rand()%)); //产生0~255的随机数
/* 读取正方形内每个像素点的颜色crColor,并在x轴正向的对称位置上绘制该正方形*/
for(y=-;y<;y++)
for(x=-;x<-;x++)
{
crColor=pDC->GetPixel(x,y);
pDC->SetPixelV(-x,y,crColor);
}

3,从起点P0(-100,-50)到终点P1(100,50)绘制一段1像素宽的蓝色直线。

        CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 CPoint p0(-,-),p1(,); //定义直线段的起点坐标和终点坐标
CPen NewPen,*pOldPen; //定义一个CPen类的画笔对象NewPen和一个画笔对象指针pOldPen
NewPen.CreatePen(PS_SOLID,,RGB(,,)); //调用Cpen类的CreatePen()成员函数,创建一个像素宽的蓝色实线画笔
pOldPen=pDC->SelectObject(&NewPen); //调用CDC类的SelectObject()成员函数将新画笔选入设备上下文,同时用pOldPen指针保存原画笔指针
pDC->MoveTo(p0); //将当前位置移动到直线段起点p0
pDC->LineTo(p1); //从起点绘制直线段到终点p1
pDC->SelectObject(pOldPen); //在新画笔使用完毕后,调用CDC类的SelectObject()成员函数,用pOldPen指针保存的原画笔将设备上下文恢复原状

4,将客户区矩形上下文边界各收缩100个像素绘制重叠的方角矩形和圆角矩形。矩形边框为1像素宽的蓝色边界线。方角矩形内部使用默认画刷填充,圆角矩形内部填空红色,圆角取为(200,200)。

    CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 rect.DeflateRect(,); //将矩形两个方向都缩小100个像素
CPen NewPen,*pOldPen; //定义一个CPen类的画刷对象NewPen和一个画刷对象指针pOldPen
NewPen.CreatePen(PS_SOLID,,RGB(,,)); //创建一个1像素宽的蓝色实线画笔
pOldPen=pDC->SelectObject(&NewPen); //将新画笔选入设备上下文,同时用pOldPen指针保存原画笔指针
pDC->Rectangle(rect); //绘制方角矩形
CBrush NewBrush,*pOldBrush; //定义一个CBrush类的画刷对象NewBrush和一个画刷对象指针pOldBrush
NewBrush.CreateSolidBrush(RGB(,,)); //创建一个红色画刷
pOldBrush=pDC->SelectObject(&NewBrush); //将新画刷选入设备上下文,同时用pOldBrush指针保存原画刷指针
pDC->RoundRect(rect,CPoint(,)); //绘制圆角矩形
/*将设备上下文恢复原状*/
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);

注:由于是将客户区缩小100个像素定义的矩形,所以随着窗口大小的改变,矩形能自动改变大小。

5,以(-250,50)为左下角点,以(250,150)为右上角点绘制矩形,使用红色HS_BDIANGONAL阴影模式填充。以(-250,-150)为左下角点,以(250,-50)为右上角点绘制矩形,使用红色填充。

    CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 rect.OffsetRect(rect.Width()/,-rect.Height()/);
/*定义两个矩形*/
CRect rect1(CPoint(-,),CPoint(,));
CRect rect2(CPoint(-,-),CPoint(,-));
CBrush Brush(HS_BDIAGONAL,RGB(,,)); //构造红色阴影画刷,也可以用CratHatchBrush()函数来定义
pDC->FillRect(&rect1,&Brush); //使用阴影画刷填充rect1
pDC->FillSolidRect(&rect2,RGB(,,)); //使用红色填充rect2

注:阴影画刷定义后,可以直接在Fillrect函数中使用,并不需要进入系统。

6,将客户区矩形左右边界各收缩100个像素,分别绘制矩形、矩形内切圆和矩形内切椭圆。绘制过程按圆、椭圆和矩形顺序完成。设定圆、椭圆和矩形的边界线为1像素宽黑色实线,内部全部使用透明画刷填充。

    CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 rect.DeflateRect(,);
CBrush *pOldBrush;
pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); //为设备上下文选入透明画刷
int r=rect.Height()/; //根据矩形rect的高度定义圆的半径
CRect rect1(CPoint(-r,-r),CPoint(r,r)); //定义圆的外接矩形
pDC->Ellipse(rect1); //绘制圆
pDC->Ellipse(rect); //绘制椭圆
pDC->Rectangle(rect); //绘制外接矩形
pDC->SelectObject(pOldBrush); //将设备上下文恢复原状

注:1,由于SelectStockObject()函数的返回类型是CGdiObject*,而pOldBrush的类型是CBrush*,需要进行强制类型转换。

2,如果不适用透明画刷,按照先画圆,后画椭圆、矩形的顺序绘制,因为图形使用默认的白色画刷填充,绘制结果只有矩形,圆和椭圆会被遮挡。

7,在客户区内从12点到3点逆时针绘制黑色点划线椭圆弧,从12点到3点顺时针绘制蓝色实线椭圆弧。

    CRect rect;  //定义矩形
GetClientRect(&rect); //获得客户区矩形
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式
pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右为正,y轴垂直向上为正
pDC->SetViewportOrg(rect.Width()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 CPoint Twelve(,rect.Height()/),Three(rect.Width()/,); //定义12点和3点的位置
CPen penBlack,penBlue,*pOldPen;
penBlue.CreatePen(PS_SOLID,,RGB(,,)); //蓝色实线画笔
penBlack.CreatePen(PS_DASHDOT,,RGB(,,)); //黑色点划线画笔
/*从12点到3点顺时针绘制蓝色实线椭圆弧*/
pDC->SetArcDirection(AD_CLOCKWISE); //顺时针绘制12点到3点
pOldPen=pDC->SelectObject(&penBlue);
pDC->Arc(rect,Twelve,Three);
/*从12点到3点逆时针绘制黑色点划线椭圆弧*/
pDC->SetArcDirection(AD_COUNTERCLOCKWISE); //逆时针绘制12点到3点
pOldPen=pDC->SelectObject(&penBlack);
pDC->Arc(rect,Twelve,Three);
pDC->SelectObject(pOldPen);

MFC绘图小实验(1)的更多相关文章

  1. MFC绘图小实验(3)

    1,使用默认的文本背景模式,在点(-200,20)处输出黄底红字“Computer Graphics Based on VC++”;在(50,20)处输出黄底红字“BoChuang Research ...

  2. MFC绘图小实验(2)

    1,以正五边形的5个顶点为基础,隔点存储构成五角星.填充模式采用WINDING.五角星边界线为5个像素宽的蓝色实线,内部使用红色填充. CRect rect; //定义矩形 GetClientRect ...

  3. PBR综合小实验视频-狮子XL

    这个是上学时候录的一个策略路由小实验

  4. HTML5自学笔记[ 13 ]canvas绘图小实例之方块移动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. ubuntu下格式化内存当硬盘使的小实验

    内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...

  7. MongoDB 主从复制小实验

    MongoDB 主从复制小实验 操作环境描述:WIN8  64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...

  8. PS小实验-去除水印

    PS小实验-去除水印 水印是一些品牌商覆盖在图片或视频上的一个商标logo或小文本,比如大家最讨厌的百度logo,作者本人也是比较讨厌水印的,让好端端的一张图片变得美中不足. 个人觉得用photosh ...

  9. 1.4 Crack小实验

    0_day 第一章 基础知识 1.4 Crack小实验 <0day_2th>王清 著 电子书 下载链接:https://pan.baidu.com/s/11TgibQSC3-kYwCInm ...

随机推荐

  1. Adding support for distinct operation for table API on DataStream

    https://github.com/apache/flink/pull/6521/files/66c3bd5d52a5e4af1f83406035b95774e8b6f636#diff-680b30 ...

  2. git for windows 无法提交修改的处理

    在git for windows里面不能commit修改,提示open shell open shell以后,使用git add [filename],会报错: fatal: Unable to cr ...

  3. 使用flume将kafka数据sink到HBase【转】

    1. hbase sink介绍 1.1 HbaseSink 1.2 AsyncHbaseSink 2. 配置flume 3. 运行测试flume 4. 使用RegexHbaseEventSeriali ...

  4. 纯html实现将网页页面分享到微信朋友圈添加缩略图图片的方法

    在分享页面中的body中最前面添加一个隐藏的div,里面放一个300*300的正方形图片即可:如下 <div style="display:none"><img ...

  5. 【TensorFlow】TF-tf.nn.dropout

    官方的接口是这样的 tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None) 根据给出的keep_prob参数,将输入te ...

  6. 06-老马jQuery教程-jQuery高级

    1.jQuery原型对象解密 jQuery里面的大部分API都是在jQuery的原型对象上定义的.jQuery源码中对原型对象做了简写的处理.也就是说:jQuery.fn === jQuery.pro ...

  7. 为python 添加新功能-dump

    一直觉得thinkphp提供的dump函数挺好用的,但是python里面没有,就一直想着写个简单的. dir是我比较常用的一个内置函数了,但是显示效果实在有点受不了,每次我都要从大量的字符串里找到我需 ...

  8. 5. 支持向量机(SVM)软间隔

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  9. 3. Recursive AutoEncoder(递归自动编码器)

    1. AutoEncoder介绍 2. Applications of AutoEncoder in NLP 3. Recursive Autoencoder(递归自动编码器) 4. Stacked ...

  10. EntityFramework Model有外键时,Json提示循环引用 解决方法

    正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...