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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

}

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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    srand((unsigned)time(NULL));  //使用系统时间初始化随机种子,使得每次产生不同的随机数
    COLORRET crColor;  //声明一个COLORRET变量crColor,用于存放像素点的颜色值
    int x,y;  //声明像素点位置坐标
    /* 用随机颜色在x轴负向绘制对角点为(-150,-50)和(-50,50)的正方形*/
    for(y=-50;y<50;y++)
        for(x=-150;x<-50;x++)
            pDC->SetPixelV(x,y,RGB(rand()%255,rand()%255,rand()%255));  //产生0~255的随机数
    /* 读取正方形内每个像素点的颜色crColor,并在x轴正向的对称位置上绘制该正方形*/
    for(y=-50;y<50;y++)
        for(x=-150;x<-50;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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    CPoint p0(-100,-50),p1(100,50);  //定义直线段的起点坐标和终点坐标
    CPen NewPen,*pOldPen;  //定义一个CPen类的画笔对象NewPen和一个画笔对象指针pOldPen
    NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));  //调用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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    rect.DeflateRect(100,100);  //将矩形两个方向都缩小100个像素
    CPen NewPen,*pOldPen;  //定义一个CPen类的画刷对象NewPen和一个画刷对象指针pOldPen
    NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));  //创建一个1像素宽的蓝色实线画笔
    pOldPen=pDC->SelectObject(&NewPen);  //将新画笔选入设备上下文,同时用pOldPen指针保存原画笔指针
    pDC->Rectangle(rect);  //绘制方角矩形
    CBrush NewBrush,*pOldBrush;  //定义一个CBrush类的画刷对象NewBrush和一个画刷对象指针pOldBrush
    NewBrush.CreateSolidBrush(RGB(255,0,0));  //创建一个红色画刷
    pOldBrush=pDC->SelectObject(&NewBrush);  //将新画刷选入设备上下文,同时用pOldBrush指针保存原画刷指针
    pDC->RoundRect(rect,CPoint(200,200));  //绘制圆角矩形
    /*将设备上下文恢复原状*/
    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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    rect.OffsetRect(rect.Width()/2,-rect.Height()/2);
    /*定义两个矩形*/
    CRect rect1(CPoint(-250,50),CPoint(250,150));
    CRect rect2(CPoint(-250,-150),CPoint(250,-50));
    CBrush Brush(HS_BDIAGONAL,RGB(255,0,0));  //构造红色阴影画刷,也可以用CratHatchBrush()函数来定义
    pDC->FillRect(&rect1,&Brush);  //使用阴影画刷填充rect1
    pDC->FillSolidRect(&rect2,RGB(255,0,0));  //使用红色填充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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    rect.DeflateRect(100,100);
    CBrush *pOldBrush;
    pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);  //为设备上下文选入透明画刷
    int r=rect.Height()/2;  //根据矩形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()/2,rect.Height()/2);  //设置客户区中心为坐标系原点
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正

    CPoint Twelve(0,rect.Height()/2),Three(rect.Width()/2,0);  //定义12点和3点的位置
    CPen penBlack,penBlue,*pOldPen;
    penBlue.CreatePen(PS_SOLID,1,RGB(0,0,255));  //蓝色实线画笔
    penBlack.CreatePen(PS_DASHDOT,1,RGB(0,0,0));  //黑色点划线画笔
    /*从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);

时间: 2024-08-01 22:31:08

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

MFC绘图小实验(2)

1,以正五边形的5个顶点为基础,隔点存储构成五角星.填充模式采用WINDING.五角星边界线为5个像素宽的蓝色实线,内部使用红色填充. CRect rect; //定义矩形 GetClientRect(&rect); //获得客户区矩形 pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口 pDC->SetViewportExt(rect.Wi

DCDC纹波小实验

关于使用示波器测试纹波的注意事项 使用示波器的AC耦合方式测量 由于示波器的头套容易引人噪声,因此在测试前必需把探头的头套去掉 因为电源的高频噪声很容易通过小电感就可以滤掉,因此更关心的是中低频的噪声.测试时将示波器的带宽限制调到尽可能的低(20MHz),避免从表笔引入噪声(我之前就吃过这方面的亏) DCDC后端接LDO AMS1117-5V的Datasheet上要求的最低压差(VIN-VOUT)为1.1V到1.25V,这就要求输入要大于5V+1.1V=6.1V,如果输入不满足这个条件会怎么样呢

初识句柄操作(控制台窗口小实验)

今日学习了控制台使用句柄操作的方法. 我们都知道,使用iostream也可以向屏幕中输出语句. 但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream和它们是C++两套不同的输入. 因此,我们需要句柄类来帮助我们完成这个操作. 下面直接上练习小代码,为贪食蛇清屏的小片段. 经一番查找,习得基本用法. 1 void clrscr(void) { 2 //控制台窗口信息类型 存有缓冲区大小 当前光标位置 窗口显示

留言本小实验

实验目的: 利用PHP实现发布留言,并存在txt文本文件中,还可以从文本文件中读取留言,并显示在网页上. 实验代码: 先要用个表单提交留言,写一个简单的html如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2 <html xmlns="http://www

ES6小实验-let和const(2)

继续小实验,上次写到块级作用域,那么为什么需要块级作用域呢?书中给了两个场景: 1.没有块级作用域,内层变量可能会覆盖外层变量.举例: var tmp = new Date() function f() { console.log(tmp) if(false) { var tmp = "hello world" } } f();//undefined 内层的tmp变量把外层的tmp变量覆盖,所以输出结果为undefined 2.用来计数的循环变量泄露为全局变量,举例: var s =

关于java中equals与==的区别的小实验

java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的是二者是都为同一对象,是一种操作符. 做了几个小实验比较结果. 实验一: String str1="ab": String str2="ab": System.out.println(s1==s2)://trueSystem.out.println(str1.equals(str2));//true 这里的str1与str2都指向了常量池中的同一对象,所以S

【MFC】MFC绘图不闪烁——双缓冲技术

MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/[email protected]/blog/static/49846449201033093333394/] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层

ES6小实验-字符串的扩展

ES6里面的对字符串的扩展实际上就是增加了一些方法,使对字符串的操作更加完善,下面做几个小实验来验证下: includes(): 返回布尔值,表示是否找到了参数字符串,支持第二的参数,表示开始的位置 'use strict'; var s = 'Hello world!'; console.log(s.includes('Hello'));//true startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部,支持第二的参数,表示开始的位置 'use strict'; var

QT 与MFC绘图技术比较

在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等.在前面4讲中介绍了MFC经常用的TeeChart控件和Hight-Speed Chart Ctrl,这两个都是MFC绘图控件的经典(另外,在Qt中还有QwtPlot和QCustomPlot两大神器).许多人问如何绘制动态变化的曲线,为此专门写下这篇文章. C++ GUI 绘图控件目录 MFC(VC) VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入 VS2010 使用TeeChart绘图控件