zoukankan      html  css  js  c++  java
  • 【MFC学习笔记-作业6-sin图像】【OnDraw(CDC* pDC)】

    根据这段源代码 一步一步剖析CDC的使用


    void CDrawSinXView::OnDraw(CDC* pDC)
    {
    CDrawSinXDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    //建立画笔
    CPen pen_Zuobixi,pen_sinx;
    pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));
    pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));
    pDC->SelectObject(&pen_Zuobixi);
    //指定原点
    pDC->SetViewportOrg(100,255);
    pDC->SetTextColor(RGB(255,0,0));
    //绘制横坐标
    CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
    int n=-1;
    int nTemp=0;
    while (nTemp<=660)
    {
       pDC->LineTo(60*n,0);
       pDC->LineTo(60*n,-5);
       pDC->MoveTo(60*n,0);
       pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);
       n++;
       nTemp +=60;
    }
    pDC->MoveTo(0,0);
    CString strTemp;
    //绘制纵坐标
    for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60)
    {
       pDC->LineTo(0,60*n);
       pDC->LineTo(5,60*n);
       pDC->MoveTo(0,60*n);
       strTemp.Format("%d",-n);
       pDC->TextOut(10,60*n,strTemp);
    }
       double y,radian; 
    pDC->SelectObject(&pen_sinx);
    for(int x=-60;x<600;x++)
    {
       //弧度=X坐标/曲线宽度*角系数*π
       //Y坐标=振幅*曲线宽度*sin(弧度)
       radian =x/((double)60*2)*PI;
       y=sin(radian)*2*60;
       pDC->MoveTo((int)x,(int)y);
       pDC->LineTo((int)x,(int)y);
    }
    pen_sinx.DeleteObject();
    pen_Zuobixi.DeleteObject();
    
    }
    

    void CDrawSinXView::OnDraw(CDC* pDC)

    这个函数在File 中 的view.cpp中.


    一个一个剖析..

    CDrawSinXDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here


    系统自带的,并不清楚有什么卵用....




    <span style="font-family: Arial, Helvetica, sans-serif;">//建立画笔</span>
    CPen pen_Zuobixi,pen_sinx;
    pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));
    pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));
    pDC->SelectObject(&pen_Zuobixi);

    如注释所示

    1.用CPen 建立一个画笔,并且规定画笔的虚实线(画笔类型),粗,颜色;

    此处详情见

    http://blog.sina.com.cn/s/blog_71f17cbd0100qsgn.html

    2.通过SelectObject来选择当前的画笔

    3.RGB 0 0 0 是黑色

    4.RGB 0 0 255是 蓝色 


    //指定原点
    pDC->SetViewportOrg(100,255);
    pDC->SetTextColor(RGB(255,0,0));
    

    1.SetViewportOrg 来设定原点的坐标 ..

    2.SetTextColor     设置字体颜色



    //绘制横坐标
    CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
    int n=-1;
    int nTemp=0;
    while (nTemp<=660)
    {
       pDC->LineTo(60*n,0);
       pDC->LineTo(60*n,-5);
       pDC->MoveTo(60*n,0);
       pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);
       n++;
       nTemp +=60;
    }
    pDC->MoveTo(0,0);
    

    1.LinkTo,表示画笔从当前位置往(x,y)的位置画去

    2.MoveTo 表示画笔回到(x,y)的位置(不留下轨迹)

    3.TextOut  (x,y,string);




    CString strTemp;
    //绘制纵坐标
    for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60)
    {
       pDC->LineTo(0,60*n);
       pDC->LineTo(5,60*n);
       pDC->MoveTo(0,60*n);
       strTemp.Format("%d",-n);
       pDC->TextOut(10,60*n,strTemp);
    }
    


    1.与上面的类似...但是利用FOrmat来得到CSrting;





    double y,radian;   //绘制sinx 
    pDC->SelectObject(&pen_sinx);
    for(int x=-60;x<600;x++)
    {
       //弧度=X坐标/曲线宽度*角系数*π
       //Y坐标=振幅*曲线宽度*sin(弧度)
       radian =x/((double)60*2)*PI;
       y=sin(radian)*2*60;
       pDC->MoveTo((int)x,(int)y);
       pDC->LineTo((int)x,(int)y);
    }
    pen_sinx.DeleteObject();
    pen_Zuobixi.DeleteObject();
    


    直接绘制吧..

    记得DeleteObject来删除画笔...


    照猫画虎 完成了 -2Pi->2Pi 的sin图像。。

    代码如下:

    void CWj1401_0302140107_6View::OnDraw(CDC* pDC)
    {
    	CPen pen_Zuobixi,pen_sinx;							//创建画笔
    	pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));		//描述画笔
    	pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));		//描述画笔
    	pDC->SelectObject(&pen_Zuobixi);					//设定谁为现在的画笔
    	//指定原点
    	pDC->SetViewportOrg(300,255);						//指定原点
    	pDC->SetTextColor(RGB(255,0,0));					//指定文本颜色
    	//绘制横坐标
       CString sPIText[]={"-2π","-3/2π","-1π","-1/2π","","1/2π","1π","3/2π","2π"};		//创建文本
       int n=-1;
       int nTemp=0;
       while (nTemp<=480)
       {
        pDC->LineTo(60*n,0);
        pDC->LineTo(60*n,-5);
        pDC->MoveTo(60*n,0);
        pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);  // (横坐标,纵坐标,字符串)
        n++;
    	nTemp +=60;
    	}
    	pDC->MoveTo(180,0);
    	CString strTemp;
        //绘制纵坐标
    for(n=-2,nTemp = 0;nTemp<=240;n++,nTemp+=60)
    {
       pDC->LineTo(180,60*n);
       pDC->LineTo(185,60*n);
       pDC->MoveTo(180,60*n);
       strTemp.Format("%d",-n);
       pDC->TextOut(190,60*n,strTemp);
    }
       double y,radian; 
        pDC->SelectObject(&pen_sinx);
       for(int x=-60;x<420;x++)
    {
       //弧度=X坐标/曲线宽度*角系数*π
       //Y坐标=振幅*曲线宽度*sin(弧度)
       radian =x/((double)60*2)*PI;
       y=-cos(radian)*60;
       pDC->MoveTo((int)x,(int)y);
       pDC->LineTo((int)x,(int)y);
    }
    pen_sinx.DeleteObject();
    pen_Zuobixi.DeleteObject();
    
    
    }


  • 相关阅读:
    Python基础04_str_方法
    Python基础03_pycharm
    Python基础02_基本数据类型_以及while
    Python基础01_介绍_HelloWorld
    Linux基础知识_Shell编程笔记
    python基础之centos6.5 升级 python2.7, 安装pip, MySQLdb
    不得不补:PHP的JSON, SQL
    JS类小功能
    1083.是否存在相等的差(20)
    c++ 的vector sort遇到栈错误
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480355.html
Copyright © 2011-2022 走看看