MFC繪製圖形、使用滑動條移動圖形(VS2013)

(ps:用VC做可能會有問題,建議VS)
先來效果圖
在這裏插入圖片描述
在這裏插入圖片描述

一、添加成員變量

在這裏插入圖片描述
在這裏插入圖片描述
本文添加的成員變量較多,如上圖。這裏的hengxx,zongxx是圖形的偏移量,初始值爲0記得給它們初始化.兩個滑動條要添加變量m_heng,m_zong。之後要通過滑動滑動條來得到偏移量賦值給hengxx,zongxx.

二、用畫筆、畫刷等繪製圖形

注意要一層一層地畫
在OnPaint()函數中添加如下代碼:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

CDialogEx::OnPaint();
		CWnd * pWnd = GetDlgItem(IDC_STATIC11);
		CDC * dc = pWnd->GetDC();//注意這裏獲取了新的 dc
		pWnd->Invalidate();
		pWnd->UpdateWindow();

		CRect rectView;
		CRgn rgn;
		GetDlgItem(IDC_STATIC11)->GetClientRect(&rectView);
		rgn.CreateRectRgn(rectView.left, rectView.top, rectView.right, rectView.bottom);
		dc->SelectClipRgn(&rgn);

		CPen pNewPen(PS_SOLID, 2, RGB(0, 0, 0));
		CPen *pOldPen;
		pOldPen = dc->SelectObject(&pNewPen);
		CRect rect1(100 + heng1, 30+ zong1, 375 + heng1, 305 + zong1);
		CRect rect2(145 + heng2, 70 + zong2, 335 + heng2, 265+ zong2);
		CRect rect3(165 + heng3, 90 + zong3, 315 + heng3,250 + zong3);
		CRect rect4(180 + heng4, 110 + zong4, 300 + heng4, 230 + zong4);
		CRect rect5(180 + heng5, 110 + zong5, 300 + heng5, 230 + zong5);
		dc->Ellipse(&rect1);      //畫圓形   
		dc->Rectangle(&rect2);    //畫矩形
		dc->Rectangle(&rect3);    //畫矩形
		dc->Rectangle(&rect4);    //畫矩形
		dc->Ellipse(&rect5);
		CBrush pNewBrush1(RGB(255, 255, 0));
		CBrush pNewBrush2(RGB(240, 0, 86));
		CBrush pNewBrush3(RGB(0, 229, 0));
		CBrush pNewBrush4(RGB(0, 0, 255));
		CBrush pNewBrush5(RGB(112, 243, 255));
		CBrush *pOldBrush;
		pOldBrush = dc->SelectObject(&pNewBrush1);//選入新畫刷
		dc->Ellipse(&rect1);
		pOldBrush = dc->SelectObject(&pNewBrush2);
		dc->Rectangle(&rect2); //用新畫刷繪製矩形
		pOldBrush = dc->SelectObject(&pNewBrush3);
		dc->Rectangle(&rect3);
		pOldBrush = dc->SelectObject(&pNewBrush4);
		dc->Rectangle(&rect4);
		pOldBrush = dc->SelectObject(&pNewBrush5);
		dc->Ellipse(&rect5);
		dc->SelectObject(pOldPen);//恢復原有的筆
		dc->SelectObject(pOldBrush);
		dc->DeleteDC();

三、給Radio、兩個滑動條添加對應的處理代碼

前面我添加了一個整形變量m_SelRadio,初始值設爲0,因爲我習慣使用這種方法來確定我們選中了哪個radio 控件中的哪個選項,大家也可以採用自己習慣的方法。
示例:在OnBnClickedRadio1()函數中添加如下代碼:
在這裏插入圖片描述
這個表示,如果選中radio1,這個變量就變成1,便於後面判斷。
剩下的4個radio用同樣的方法,給m_SelRadio分別賦不同的值。

void CPaintDlg::OnBnClickedRadio3()
{
	m_SelRadio = 3;

	// TODO:  在此添加控件通知處理程序代碼
}
void CPaintDlg::OnBnClickedRadio1()
{
	m_SelRadio = 1;
	// TODO:  在此添加控件通知處理程序代碼
}


void CPaintDlg::OnBnClickedRadio2()
{
	m_SelRadio = 2;

	// TODO:  在此添加控件通知處理程序代碼
}


void CPaintDlg::OnBnClickedRadio4()
{
	m_SelRadio = 4;

	// TODO:  在此添加控件通知處理程序代碼
}


void CPaintDlg::OnBnClickedRadio5()
{
	m_SelRadio = 5;

	// TODO:  在此添加控件通知處理程序代碼
}

對於滑動條,添加如下代碼設置偏移量範圍:

void CPaintDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO:  在此添加控件通知處理程序代碼

	m_heng.SetRange(-100, 100);
	*pResult = 0;

}


void CPaintDlg::OnNMCustomdrawSlider2(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO:  在此添加控件通知處理程序代碼
	m_zong.SetRange(-100, 100);
	*pResult = 0;
}

四、獲取滑動條滑動得到的值賦給偏移量,使圖形移動

添加消息OnHScroll
在函數OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)中添加以下代碼:

// TODO:  在此添加消息處理程序代碼和/或調用默認值
	if (m_SelRadio == 1)//如果選中radio1
	{
		heng1 = m_heng.GetPos();//得到滑動條的值賦給偏移量
		zong1 = m_zong.GetPos();
		Invalidate(FALSE);
	}
	if (m_SelRadio == 2)
	{
		heng2 = m_heng.GetPos();
		zong2 = m_zong.GetPos();
		Invalidate(FALSE);
	}
	if (m_SelRadio == 3)
	{
		heng3 = m_heng.GetPos();
		zong3 = m_zong.GetPos();
		Invalidate(FALSE);
	}
	if (m_SelRadio == 4)
	{
		heng4 = m_heng.GetPos();
		zong4 = m_zong.GetPos();
		Invalidate(FALSE);
	}
	if (m_SelRadio == 5)
	{
		heng5 = m_heng.GetPos();
		zong5 = m_zong.GetPos();
		Invalidate(FALSE);
	}
	InvalidateRect(NULL);
	Invalidate(FALSE);
	UpdateWindow();
	
	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);

OK,大功告成啦~
最最後,這裏隆重感謝@XiaoFeiYang~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章