一、實驗目的
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