MFC圖形繪制——繪制直尺和坐標系


一、實驗目的

1.掌握建立MFC應用程序的方法;

2.掌握映射模式。

二、實驗內容

1.在MFC中繪制直尺,直尺需要有刻度,類似於日常學生使用的透明塑料直尺,需要建立四個直尺,分別分布在屏幕客戶區的上、下、左、右四個邊界。尺子需要有刻度,那客戶區上端的尺子距離,應該有厘米、5毫米、1毫米刻度,刻度用豎線顯示,長度分別為7毫米、6毫米、5毫米,外觀類似於學生直尺,右端留出一公分,防止4個尺子碰在一起。

2.畫出一坐標系,給出x坐標變化范圍、y坐標變化范圍,畫出坐標軸,並在坐標軸上標出刻度、原點,要求坐標軸充滿客戶區。

三、實驗步驟

(一)在MFC中繪制直尺。

1.設計思路:

(1)聲明客戶區矩形

(2)獲得客戶區坐標

(3)設置映射模式

(4)分四個方向畫尺子,並且通過循環畫出尺子刻度

注意:

映射模式選用的是MM_LOMETRIC,其對應的坐標系特征是:每個邏輯坐標被轉換為0.1 mm。正x向右,正y向上。

 

2.代碼如下:

(1)聲明客戶區矩形並設置映射模式

void CRulerView::OnDraw(CDC* pDC)

{

    CRulerDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRect rect;   //聲明客戶區矩形
    GetClientRect(&rect);   //獲得客戶區坐標
    pDC->SetMapMode(MM_LOMETRIC);  //設置映射模式為:MM_LOMETRIC,即每個邏輯坐標被轉換為0.1 mm。正x向右,正y向上。
    //設置實際的客戶區窗口的長度和寬度范圍
    int height=rect.Height()*2.5;
    int width=rect.Width()*2.5;
    int i;

(2)畫頂部的尺子

//top ruler 畫頂部的尺子

    //先在最上部畫一條直線,作為尺子的度量邊緣,從上(/左)往下(/右)畫
    pDC->MoveTo(0,0); 
    pDC->LineTo(width-100,0);
    COLORREF c=RGB(0,0,255);
    //開始進行循環,畫尺子的刻度
    for( i=0;i<width-100;i+=10)
    {  
        //尺子距離為1厘米的,刻度豎線長度為7毫米
        if(i%100==0)
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-70);
        }

        //尺子距離為5毫米的,刻度豎線長度為6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-60);
        }

        //尺子距離為1毫米的,刻度豎線長度為5毫米
        else
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-50);
        }

    }

(3)畫底部的尺子

//bottom ruler  畫底部的尺子
    //先在底部畫一條直線,作為尺子的度量邊緣(從上/左往下/右畫)
    pDC->MoveTo(width,-height+100);
    pDC->LineTo(100,-height+100);
    //開始進行循環,畫尺子的刻度
    for( i=0;i<width-100;i+=10)
    {    //尺子距離為1厘米的,刻度豎線長度為7毫米
        if(i%100==0)
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+30);
        }
         //尺子距離為5毫米的,刻度豎線長度為6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+40);
        }
        //尺子距離為1毫米的,刻度豎線長度為5毫米
        else
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+50);
        }
    }

(4)畫左邊的尺子

//left ruler  畫左邊的尺子
    //先在最左部畫一條直線,作為尺子的度量邊緣(從上/左往下/右畫)
    pDC->MoveTo(0,-height);
    pDC->LineTo(0,-100);
    //開始進行循環,畫尺子的刻度
    for( i=0;i<height-100;i+=10)
    {
         //尺子距離為1厘米的,刻度豎線長度為7毫米
        if(i%100==0)
        {
            pDC->MoveTo(0,-height+i);
            pDC->LineTo(70,-height+i);
        }
         //尺子距離為5毫米的,刻度豎線長度為6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(0,-height+i);
           pDC->LineTo(60,-height+i);
        }
        //尺子距離為1毫米的,刻度豎線長度為5毫米
        else
        {
            pDC->MoveTo(0,-height+i);
            pDC->LineTo(50,-height+i);
        }
    }

(5)畫右邊的尺子

//right ruler  畫右邊的尺子
    //先在最右邊畫一條直線,作為尺子的度量邊緣(從右往左畫)
    pDC->MoveTo(width,0);
    pDC->LineTo(width,-height+150);
    //開始進行循環,畫尺子的刻度
    for( i=0;i<height-150;i+=10)
    {  
         //尺子距離為1厘米的,刻度豎線長度為7毫米
        if(i%100==0)
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-70,-i);
        }
         //尺子距離為5毫米的,刻度豎線長度為6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-60,-i);
        }
        //尺子距離為1毫米的,刻度豎線長度為5毫米
        else
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-50,-i);
        }
    }

2.運行結果截圖:

 

(二)繪制坐標系。

1.設計思路:

(1)聲明客戶區矩形

(2)獲得客戶區坐標

(3)設置映射模式

(4)畫出X軸、Y軸,並且通過循環畫出坐標變化范圍

注意:

映射模式選用的是MM_LOMETRIC,其對應的坐標系特征是:每個邏輯坐標被轉換為0.1 mm。正x向右,正y向上。

2.代碼如下:

(1)聲明客戶區矩形並設置映射模式

void CCoordinateSystemView::OnDraw(CDC* pDC)

{
    CCoordinateSystemDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRect rect;//聲明客戶區矩形
    GetClientRect(&rect);//獲得客戶區坐標

    int height=(int)rect.Height()*2.5;
    int width=(int)rect.Width()*2.5;
    int i;
     pDC->SetMapMode(MM_LOMETRIC);  //設置映射模式為:MM_LOMETRIC,即每個邏輯坐標被轉換為0.1 mm。正x向右,正y向上。
     pDC->SetWindowExt(width,height); //設置窗口
     pDC->SetViewportExt(width,-height); //x軸水平向右,y軸垂直向上
     //pDC->SetViewportOrg(width/2,height/2); //客戶區中心為坐標系原點

(2)畫X軸和Y軸

    //畫X軸
     pDC->MoveTo(0,-height/2);
     pDC->LineTo(width,-height/2);
     //畫Y軸
     pDC->MoveTo(width/2,0);
     pDC->LineTo(width/2,-height);

(3)畫X軸和Y軸的坐標刻度

    //畫X軸負半軸刻度
     for( i=0;i<=width/2;i+=100)
     {
         pDC->MoveTo(i,-height/2);
         pDC->LineTo(i,-height/2+70);
     }
     //畫X軸正半軸刻度
     for( i=width/2;i<=width;i+=100)
     {
         pDC->MoveTo(i,-height/2);
         pDC->LineTo(i,-height/2+70);
     }
     //畫y軸正半軸刻度
     for( i=0;i<=height/2;i+=100)
     {
         pDC->MoveTo(width/2,i);
         pDC->LineTo(width/2+70,i);
     }
     //畫X軸負半軸刻度
     for( i=-height/2;i<=height;i+=100)
     {
         pDC->MoveTo(width/2,-i);
         pDC->LineTo(width/2+70,-i);
     }

2.運行結果截圖:

 

 

四、實驗結果與討論

(一)在MFC中繪制出的直尺如下圖所示:

 

 

(二)在MFC中繪制出的坐標系如下圖所示:

 

 

 

五、總結

(一)本次實驗按時按量完成。

(二)通過本次實驗,掌握了建立MFC應用程序的方法。

(三)通過本次實驗,我掌握了映射模式及其使用。

(四)實驗過程中遇到的問題及注意點:

1.客戶區實際長度和寬度的設置范圍應該為怎么樣才能適配屏幕?

2.需要注意的是:映射模式選用的是MM_LOMETRIC,其對應的坐標系特征是:每個邏輯坐標被轉換為0.1 mm。正x向右,正y向上。

 

 

 

參見源碼:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/ruler

              https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/CoordinateSystem


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM