MFC绘图小实验(1)
这学期开了一门计算机图形学的课程,感觉蛮有趣的,所以想把书上的那些样例程序都实现一遍,了解基本的绘图原理和要点。
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)的更多相关文章
- MFC绘图小实验(3)
1,使用默认的文本背景模式,在点(-200,20)处输出黄底红字“Computer Graphics Based on VC++”;在(50,20)处输出黄底红字“BoChuang Research ...
- MFC绘图小实验(2)
1,以正五边形的5个顶点为基础,隔点存储构成五角星.填充模式采用WINDING.五角星边界线为5个像素宽的蓝色实线,内部使用红色填充. CRect rect; //定义矩形 GetClientRect ...
- PBR综合小实验视频-狮子XL
这个是上学时候录的一个策略路由小实验
- HTML5自学笔记[ 13 ]canvas绘图小实例之方块移动
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- ubuntu下格式化内存当硬盘使的小实验
内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...
- MongoDB 主从复制小实验
MongoDB 主从复制小实验 操作环境描述:WIN8 64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...
- PS小实验-去除水印
PS小实验-去除水印 水印是一些品牌商覆盖在图片或视频上的一个商标logo或小文本,比如大家最讨厌的百度logo,作者本人也是比较讨厌水印的,让好端端的一张图片变得美中不足. 个人觉得用photosh ...
- 1.4 Crack小实验
0_day 第一章 基础知识 1.4 Crack小实验 <0day_2th>王清 著 电子书 下载链接:https://pan.baidu.com/s/11TgibQSC3-kYwCInm ...
随机推荐
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
- CCFollow
// CCFollow // 作用:创建一个跟随动作 // 参数1:跟随的目标对象 // 跟随范围,离开范围就不再跟随 //创建一个参照物spT // CCSprite ...
- JVM Troubleshooting
案例分享:如何通过JVM crash 的日志和core dump定位和分析Instrument引起的JVM crash https://docs.oracle.com/javase/7/docs/we ...
- Sql Server 查询库表记录数
), RowCnt INT) EXEC sp_MSforeachtable 'INSERT INTO #temp SELECT ''?'', COUNT(*) FROM ?' desc DROP TA ...
- 12.22日wagas学习笔记
第一部分:vue-cli3 vue.config.js配置: baseUrl:process.env.NODE_ENV === 'production'?'/production-sub-path': ...
- hive添加UDF
hive添加UDF 步骤如下: 函数分为永久和临时函数,后者会话退出则消失,前者不会 查看已有函数(创建好后也可以通过这个来查看是否成功) show functions; 写UDF的java文件,如: ...
- 使用httpclient下载 页面、图片
代码 import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.c ...
- How To Install Java with Apt-Get on Ubuntu 16.04
Introduction Java and the JVM (Java's virtual machine) are widely used and required for many kinds o ...
- 网络构建入门技术(2)——IP子网划分
说明(2017-5-10 10:54:31): 1. 为什么要子网划分? 子网划分就是,网络位变长,主机位变短的过程.实际上就是将一个大网络,划分成多个小网络的过程. 目的就是为了解决IP地址不够用的 ...
- 【Unity笔记】使物体(船)漂浮在水面上——浮力
在官方论坛看到一个关于怎么使物体漂浮在水面上的讨论:https://forum.unity3d.com/threads/floating-a-object-on-water.31671/ 水动力系统 ...