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

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. View:Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()的理解

    Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.提供了 getLeft(), getTop(), getBottom(), getRight() 这些API来获取 ...

  2. Nexus 搭建maven 私有仓库

    nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如 ...

  3. ie6遮罩层兼容 100%高度的实现

    .black { position:absolute;width:100%;height:100%;opacity:0.5;filter:alpha(opacity=50);background:#0 ...

  4. python(49):把文件压缩成zip格式的文件

    有时需要用到压缩文件,网上搜集了一段代码: 分享一下: import os import zipfile def make_zip(localPath, pname): zipf = zipfile. ...

  5. 开源中国(oschina.net)能给我一个交代吗?

    一年前准备把goolge上面diocp项目移动到开源中国上面,当时觉得开源中国的的速度还不错,都叫开源中国了,觉得应该稳定. 后来把今年开源mybean项目也放在上面了,还有一些小的项目都放在上面,就 ...

  6. 【C/C++】关于隐式转换·面试题分析

    题目 以下两个程序片段A 和B ,问哪个能进入循环? 片段A: unsigned short i; unsigned ; ; i < index-; i++) { ........ } 片段B: ...

  7. 10个非常炫酷的jQuery相册动画赏析

    我们经常可以在网页上看到形式各异的jQuery相册插件,由于现在浏览器对HTML5和CSS3的兼容越来越好了,所以很多jQuery相册插件都运用了CSS3的相关特性,形成了许多炫酷的动画特效.本文收集 ...

  8. AIX查看CPU、内存等信息

    AIX下查看CPUAIX操作系统AIX的硬件信息可以通过prtconf命令看到.1. 查看逻辑CPU个数#pmcycles -mCPU 0 runs at 4204 MHzCPU 1 runs at ...

  9. iOS实现tableViewCell或collectionCell中点击界面按钮跳转

    //找到父类界面 - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = n ...

  10. python seaborn 画图

    python seaborn 画图 59888745@qq.com 2017.08.02 distplot( )  kdeplot( ) distplot( )为hist加强版, kdeplot( ) ...