1. 程式人生 > >MFC(5):動態五角星繪製小練習

MFC(5):動態五角星繪製小練習

需求說明:繪製一個五角星,介面有三個按鈕,分別為“大”、“中”、“小”;點選相應的按鈕,五角星會發生變化

解決思路:在五角星的外接圓上,選擇五個等分點作為五角星的五個頂點;根據相鄰點不相連的原則,構建五角星的五個頂點;基於外接圓半徑大小控制畫出五角星的大小

程式實現:

(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的使用,瞭解五角星的構成原理,把握五個定點的連線方式