• 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);

  • 相关阅读:
    nginx 域名跳转一例~~~(rewrite、proxy)
    军哥 LNMP 常见问题
    Zabbix安装
    PHP远程连接mysql
    Zend Studio 下载
    军哥LNMP优化
    网络流量监控分析工具 Ntopng 安装
    Linux VPS禁止某个IP访问
    DDoS deflate
    MySQL数据库的优化
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/6659163.html
Copyright © 2020-2023  润新知