(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~