MFC(5):動態五角星繪製小練習
阿新 • • 發佈:2018-12-19
需求說明:繪製一個五角星,介面有三個按鈕,分別為“大”、“中”、“小”;點選相應的按鈕,五角星會發生變化
解決思路:在五角星的外接圓上,選擇五個等分點作為五角星的五個頂點;根據相鄰點不相連的原則,構建五角星的五個頂點;基於外接圓半徑大小控制畫出五角星的大小
程式實現:
(1)建立對話方塊應用程式DrawPentagram;CTRL + A刪除對話方塊中的預設按鈕
(2)拖拽三個按鈕,Caption屬性分別設定為“大”、“中”、“小”;ID設定為IDC_BIG、IDC_MIDDLE和IDC_SMALL
(3)在DrawPentagramDlg.h標頭檔案中,新增繪製五角星的函式宣告:
//繪製空心五角星函式
void DrawHollowPentagram(double radius);
//繪製實心五角星
void DrawSolidPentagram(double radius);
(4)在DrawPentagramDlg.cpp檔案中新增繪製五角星的函式實現
//空心五角星的實現 void CDrawPentagramDlg::DrawHollowPentagram(double radius) { //定義五角星的五個點的座標的陣列 CPoint pts[5]; //建立畫筆工具 CDC *pDC = GetDC(); //根據外接圓半徑計算每個頂點的座標 for(int i = 0; i < 5; i++) { pts[i].x = (long)(150 - radius * sin((i * 72 + 36) * 2 * 3 * 3.14 / 360)); pts[i].y = (long)(150 + radius * cos((i * 72 + 36) * 2 * 3 * 3.14 / 360)); } //首先將畫筆移動到第一個點,將其與第二個點連線 for(int i = 0; i < 5; i++) { pDC->MoveTo(pts[i]); //線段起點 pDC->LineTo(pts[(i + 2) % 5]); //線段終點 } }
//實心五角星的實現 void CDrawPentagramDlg::DrawSolidPentagram(double radius) { CDC *pDC = GetDC(); CPen penBlue(PS_SOLID, 2, RGB(0, 0, 255)); //建立藍色畫筆 CPen *pOldPen = pDC->SelectObject(&penBlue);//將畫筆與DC關聯 CBrush brushRed(RGB(0, 0, 255)); //建立藍色畫刷 CBrush *pOldBrush = pDC->SelectObject(&brushRed);//將畫刷與DC關聯 pDC->SetPolyFillMode(WINDING); //設定填充色 CPoint pts[5]; for(int i = 0; i < 5; i++) { pts[i].x = (long)(150 - radius * cos((i * 144 - 18) * 3.14 / 180)); pts[i].y = (long)(150 + radius * sin((i * 144 - 18) * 3.14 / 180)); } //根據五個定點繪製多邊形(五角星的外輪廓) CPoint v[5] = {pts[0], pts[1], pts[2], pts[3], pts[4]}; pDC->Polygon(v, 5); //恢復畫筆和畫刷工具 pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); }
(5)按鈕的設計
//大五角星的繪製
void CDrawPentagramDlg::OnBnClickedBig()
{
//設定外接圓半徑
this->Invalidate();
this->UpdateWindow();
double radius = 100;
DrawHollowPentagram(radius);
//DrawSolidPentagram(radius);
}
//中五角星的繪製
void CDrawPentagramDlg::OnBnClickedMiddle()
{
// TODO: 在此新增控制元件通知處理程式程式碼
this->Invalidate();
this->UpdateWindow();
double radius = 75;
//DrawHollowPentagram(radius);
DrawSolidPentagram(radius);
}
//小五角星的繪製
void CDrawPentagramDlg::OnBnClickedSmall()
{
// TODO: 在此新增控制元件通知處理程式程式碼
this->Invalidate();
this->UpdateWindow();
double radius = 50;
//DrawHollowPentagram(radius);
DrawSolidPentagram(radius);
}
(6)程式效果圖
(7)小結
熟悉繪圖API的使用,瞭解五角星的構成原理,把握五個定點的連線方式