2022-09-18
運行結果圖:

點擊上面的紅色圖示后:

點擊“確定”后:

繪圖步驟:
(1)打開vs,點擊“檔案”,點擊“新建”,點擊“專案”,填寫專案名稱,例如:“adamas”,修改存放的路徑,點擊“下一步”,“應用程式型別”選擇“單個檔案”,“專案樣式”選擇“MFC standard”,點擊“完成”,
(2)為運行結果圖添加選單與按鈕的步驟:
創建選單:
首先,找到“資源”,點擊,找到“其他視窗”,點擊“資源視圖”,在“資源視圖”欄中點擊“adamas”,展開后,點擊“adamas.rc”,找到“menu”檔案夾后點擊,展開后,點擊“IDR_MAINFRAME”,
將“IDR_MAINFRAME”中的選單欄多余的部分洗掉,只留下“檔案(F)”,“幫助(H)”,在“檔案”的下拉選單中只留下“退出(X)”,在“檔案”,“幫助”選單的后面添加“圖形(D)”,在“圖形(D)”的下拉框中添加“繪圖”,樣式如下:

改變選單中“繪圖”的屬性,選中“繪圖”,右擊,“屬性”,在右面的屬性欄中找到ID,將其ID改為“IDM_DRAWPIC”,
---------------------------------------------------------------------
創建圖示:
在“資源視圖”中,點擊“toolbar”檔案夾,在出現的圖示中,第一行不需要的圖示都拖到第二行的坐標去掉,在最后一個空白的圖示中使用工具列中的鉛筆工具繪制一個紅色的繪圖圖示,之后選中該圖示,右擊“屬性”,在右邊的屬性欄中找到"ID",將“ID”改為“IDM_DRAWPIC”,
(3)添加一個對話框的步驟:
找到“資源視圖”,點擊“Dialog”檔案夾,右擊“添加資源”,點擊“新建”,在對話框中添加工具,找到左邊的“工具列”,點擊,將“Static Text”拖動到對話框中,要添加兩回,因此拖動兩次,先隨意放到對話框中的任意位置,將工具列中的“Edit Control”同理也添加兩次,在對話框中有一個“確定”和一個“取消”按鈕,選中“取消”按鈕,按鍵盤上的“Delete”鍵洗掉,
在對話框中,選中其中一個“Static Text”,右擊“屬性”,找到“Caption”,將其右邊的“static”改為“等分點的個數”,同樣的方式,將另一個“Static Text”的顯示名稱改為“圓的半徑”,如下圖:

雙擊此對話框,在彈出的“添加MFC類”框中,輸入要添加的類,例如:“CInputDlg”,點擊“確定”,
為輸入對話框成員變數,點擊“專案”,點擊“類向導”,將“類名”定位到“CInputDlg”,點擊“成員變數”,雙擊第一個控制元件“IDC_EDIT1”,在彈出的“添加控制元件”的框中,“類別”選擇“值”、“名稱”寫為“m_n”、“變數型別”寫為“int”,在“控制元件”的下面點擊“其他”,在這兒,“最小值”設為“5”、“最大值”設為“50”,點擊“完成”,如下:


控制元件2按照同樣的方式,雙擊“IDC_EDIT2”,在彈出的“添加控制元件”的框中,“類別”選擇“值”、“名稱”寫為“m_r”、“變數型別”寫為“double”,在“控制元件”的下面點擊“其他”,在這兒,“最小值”設為“200.0”、“最大值”設為“320.0”,點擊“完成”,
(4)給對話框的源檔案撰寫代碼
首先在建構式中,設定“圓的半徑”為“300.0”,“圓的等分點”為“30”,找到“解決方案資源管理器”,點擊“源檔案”檔案夾,點擊“CInputDlg.cpp”,在建構式中初始化內容,
1 CInputDlg::CInputDlg(CWnd* pParent /*=nullptr*/) 2 : CDialogEx(IDD_DIALOG1, pParent) 3 , m_n(0) 4 , m_r(0) 5 { 6 m_n = 30; 7 m_r = 300.0; 8 }
設計“編輯框”的初始狀態為選中狀態,步驟:
點擊“專案”,點擊“類向導”,將類名定位到“CInputDlg”,點擊“訊息”,在“搜索框”中搜索“ShowWindow”,在下面的欄中,雙擊出現的選項“WM_SHOWWINDOW”,將其添加到右邊的“現有處理程式”中,在右邊的“現有處理程式”中選中“OnShowWindow”,點擊右邊的“編輯代碼”的選項,代碼如下:
1 void CInputDlg::OnShowWindow(BOOL bShow, UINT nStatus) 2 { 3 CDialogEx::OnShowWindow(bShow, nStatus); 4 5 // TODO: 在此處添加訊息處理程式代碼 6 GetDlgItem(IDC_EDIT1)->SetFocus();//將游標移動到控制元件1(IDC_EDIT1)的編輯框()edit中 7 ((CEdit *)GetDlgItem(IDC_EDIT1))->SetSel(0, -1);//表示編輯控制元件中的全部文本被選中 8 9 }
(5)添加一個二維點類
點擊“專案”,點擊“添加類”,類名設定為“CP2”,在頭檔案中添加成員變數x、y,在它的源檔案中的建構式,設定x、y的初始值為0.
CP2.h檔案
1 #pragma once 2 class CP2 3 { 4 public: 5 CP2(void); 6 ~CP2(void); 7 public: 8 double x; 9 double y; 10 };
CP2.cpp檔案
1 #include "pch.h" 2 #include "CP2.h" 3 CP2::CP2(void) { 4 x = 0; 5 y = 0; 6 } 7 8 CP2::~CP2(void) { 9 }
(6)打開“adamasView.h”檔案,添加成員變數與函式
添加“CP2.h”頭檔案
#include"CP2.h"
添加成員變數,在第三個“protected:”下面添加
1 protected: 2 CP2 *p;//動態陣列p 3 int n;//等分點的個數 4 double r;//圓的半徑
添加繪制金剛石的函式,在從上往下數的第二個“public:”下面添加一行代碼
void Diamond();
(7)對選單欄中的“繪圖”選項添加“事件處理程式”,并撰寫代碼
選擇“資源視圖”,點擊“Menu”檔案夾,點擊“IDR_MAINFRAME”,找到“繪圖”,選中,右擊“添加事件處理程式”,在彈出的框中“類串列”選擇“CadamasView”,點擊“確定”,
OnDrawpic函式
1 void CadamasView::OnDrawpic() 2 { 3 // TODO: 在此添加命令處理程式代碼 4 CInputDlg dlg; 5 if (IDOK == dlg.DoModal()) { 6 n = dlg.m_n; 7 r = dlg.m_r; 8 } 9 else 10 { 11 return; 12 } 13 RedrawWindow(); 14 p = new CP2[n]; 15 Diamond(); 16 delete[]p; 17 }
說明:
第4行代碼,定義了一個“CInputDlg”類(對話框)的物件,
第5行代碼“dlg.DoModal”是指顯示一個“模態對話框”,“模態對話框”是值如果我們想要執行其他的應用程式時,必須點擊該彈出來的“模態對話框”中的“確定”或者點擊“叉號”,對該對話框進行相應,“IDOK”是指如果用戶點擊了“確定”后執行的代碼,
第6,7行代碼指的是將對話框接收到的“等分點的個數”與“圓的半徑”傳到內部函式中,進行資訊處理,第9-12行代碼表示,如果用戶在彈出的“模態對話框”中選擇點擊模態對話框的“叉號”,則不做操作,
第13行代碼“RedrawWindow()”表重繪視窗函式,應該是指在彈出的“模態對話框”選擇后,進行對函式后臺的處理,按照不同的選擇進行重新重繪,
第14行代碼指的是按照在對話框中輸入的“等分點的個數n”進行動態的創建一個一維陣列,存放傳進來的數字,
第15行繪制金剛石的函式,
第16行在程式末尾,將動態陣列占用的空間釋放,
Diamond函式代碼:
1 void CadamasView::Diamond() { 2 CDC *pDC = GetDC(); 3 CRect rect; 4 GetClientRect(&rect); 5 pDC->SetMapMode(MM_ANISOTROPIC); 6 pDC->SetWindowExt(rect.Width(), rect.Height()); 7 pDC->SetViewportExt(rect.Width(), -rect.Height()); 8 pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2); 9 rect.OffsetRect(-rect.Width() / 2,-rect.Height() / 2); 10 CPen NewPen, *pOldPen; 11 NewPen.CreatePen(PS_SOLID, 1, RGB(255,215 , 0)); 12 pOldPen = pDC->SelectObject(&NewPen); 13 double Alpha, Theta; 14 Theta = 2 * PI / n; 15 Alpha = PI / 2 - Theta; 16 for (int i = 0; i < n; i++) { 17 p[i].x = r * cos(i*Theta + Alpha); 18 p[i].y = r * sin(i*Theta + Alpha); 19 } 20 for (int i = 0; i <= n - 2; i++) { 21 for (int j = i + 1; j <= n - 1; j++) { 22 pDC->MoveTo(round(p[i].x), round(p[i].y)); 23 pDC->LineTo(round(p[j].x), round(p[j].y)); 24 } 25 } 26 pDC->SelectObject(pOldPen); 27 NewPen.DeleteObject(); 28 ReleaseDC(pDC); 29 }
說明:
第2行代碼中使用GetDC()函式創建了一個CDC類的物件,CDC類的物件呼叫CDC內部的成員函式可以完成大部分的繪圖操作,*pDC是一個指標,可用于將其他內容選入設備背景關系,
第3行代碼創建了一個矩形,第4行代碼是將創建好的矩形作為引數傳入“GetClientRect”客戶區矩形的函式中,此處,客戶區矩形與視窗矩形的區別是:視窗矩形包含客戶區矩形,客戶區矩形是不包含外框和選單欄的,
第5行代碼“SetMapMode”表示的是設定映射模式,什么是映射模式?通俗地說,映射模式就是指將輸入內容x,y大小與顯示幕和列印機輸出的圖形的大小轉變為一致,即將輸入的邏輯單位(一般是英尺或者毫米)與輸出的物理單位(一般數像素或者是點陣數)轉化為一致的,“ MM_ANISOTROPIC”是一種映射模式,指的是“ 用戶定義的值,但是x和y方向任意”,
第6行代碼“SetWindowExt”是指設定視窗的寬和高,是邏輯單位的大小,
第7行代碼“SetViewportExt”是指設定視圖的尺寸,指的是物理單位,此處,將x軸的方向設定為從左向右,將y軸的方向設定為從下到上,
第8行代碼,設定視圖中心點的位置,中心點位于客戶區寬度的一半,客戶區高度的一半,
第9行代碼,是指客戶區與矩形重合,
第10行代碼定義了一個新畫筆、一個舊畫筆的指標,第11行創建了一個新畫筆,實線、1像素、金色,第12行將新畫筆選入設備背景關系即顯示在顯示幕上,不使用系統默認的畫筆(系統默認的畫筆是實線、1像素、黑色),
第13行定義了兩個變數,Theta:等分角的度數,Alpha:起始角,第14行,使用PI時,要在上面宣告一個宏,
#define PI 3.14
第16-19行,依次找到所有等分點的x、y坐標,
第20-25行,依次將各個等分點與其他等分點連接,第22行,使用round函式時,要添加一個頭檔案,
#include<math.h>
第26行恢復設備背景關系,即將原來系統默認的畫筆恢復,第27行洗掉新創建的畫筆,第28行釋放設備背景關系占用的資源,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509036.html
標籤:其他
