本文僅用于學(xué)習(xí)交流,商業(yè)用途請(qǐng)支持正版!轉(zhuǎn)載請(qǐng)注明:http://www.cnblogs.com/mxbs/p/6216464.html
MFC畫(huà)線(xiàn)功能要點(diǎn)有二:其一,鼠標(biāo)按下時(shí)記錄初始位置為線(xiàn)的起始端點(diǎn),其二,利用不同的方法實(shí)現(xiàn)畫(huà)線(xiàn)。下面著重學(xué)習(xí)總結(jié)畫(huà)線(xiàn)功能實(shí)現(xiàn)方法。
在OnLButtonDown函數(shù)中記錄起始端點(diǎn),CPoint m_ptOrigin = point;
在OnLButtonUp函數(shù)中實(shí)現(xiàn)畫(huà)線(xiàn)。方法如下:
畫(huà)線(xiàn)方法一:利用SDK全局函數(shù)實(shí)現(xiàn)視圖窗口畫(huà)線(xiàn)功能
//獲取設(shè)備描述表
HDC hdc;
//調(diào)用全局函數(shù)獲得當(dāng)前窗口的設(shè)備描述表,CWnd::m_hWnd根據(jù)繼承原理,CDrawView繼承了CWnd類(lèi)的數(shù)據(jù)成員
hdc = ::GetDC(m_hWnd);
//移動(dòng)到線(xiàn)條的起點(diǎn)
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//第四個(gè)參數(shù)用于保存鼠標(biāo)移動(dòng)前的位置,此處不需要,設(shè)為NULL
//畫(huà)線(xiàn)
LineTo(hdc,point.x,point.y);
//釋放設(shè)備描述表
::ReleaseDC(m_hWnd,hdc);
畫(huà)線(xiàn)方法二:利用MFC的CDC類(lèi)實(shí)現(xiàn)畫(huà)線(xiàn)功能
//說(shuō)明:CDC類(lèi)封裝了所有與繪圖相關(guān)的操作
CDC* pDC = GetDC();//定義CDC類(lèi)型的指針,利用CWnd類(lèi)的成員函數(shù)GetDC獲得當(dāng)前窗口的設(shè)備描述表對(duì)象的指針
pDC -> MoveTo(m_ptOrigin);//利用CDC類(lèi)的成員函數(shù)MoveTo和LineTo完成畫(huà)線(xiàn)功能
pDC -> LineTo(point);
ReleaseDC(pDC);
畫(huà)線(xiàn)方法三:利用CClientDC類(lèi)
//說(shuō)明:此類(lèi)派生于CDC類(lèi),在構(gòu)造時(shí)調(diào)用GetDC()函數(shù),在析構(gòu)時(shí)調(diào)用ReleaseDC()函數(shù),因此無(wú)需顯示調(diào)用這兩個(gè)函數(shù)。
//CClientDC dc(this);//在當(dāng)前視圖窗口畫(huà)線(xiàn)方法
CClientDC dc(GetParent());//獲取當(dāng)前視圖窗口的父窗口,可以在父窗口畫(huà)線(xiàn)
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
畫(huà)線(xiàn)方法四:利用CWindowDC類(lèi)
//CWindowDC dc(this);//只能在視類(lèi)中畫(huà)線(xiàn)
CWindowDC dc(GetParent());//可以在父窗口中畫(huà)線(xiàn)
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
如果我們要更多功能的繪制方法,可以利用更多的資源和方法,如:
更多方法之:繪制彩色線(xiàn)條(設(shè)備描述表中默認(rèn)有一個(gè)黑色畫(huà)筆)
CPen pen(PS_SOLID,5,RGB(255,255,0));//創(chuàng)建畫(huà)筆對(duì)象
CClientDC dc(this);
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
更多方法之:繪制連續(xù)線(xiàn)條
//* 此時(shí)需要添加鼠標(biāo)移動(dòng)消息響應(yīng)函數(shù)OnMouseMove,當(dāng)鼠標(biāo)移動(dòng)時(shí)記錄位置并繪制短線(xiàn),然后需要將此時(shí)鼠標(biāo)位置設(shè)置為下一次繪制的起點(diǎn)坐標(biāo),
//* 這樣便可以繪制連續(xù)線(xiàn)條了。為此,添加一個(gè)判斷是否在畫(huà)線(xiàn)的布爾變量m_bTrue,在視類(lèi)構(gòu)造函數(shù)中初始化為true,在OnLButtonDown中初始化為true,
//* 在OnLButtonUp中初始化為false,OnMouseMove函數(shù)如下:
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
//創(chuàng)建一個(gè)紅色的、寬度為1的實(shí)線(xiàn)畫(huà)筆
CPen pen(PS_SOLID,1,RGB(255,0,0));
//把創(chuàng)建的畫(huà)筆選入設(shè)備描述表
CPen *pOldPen = dc.SelectObject(&pen);
if(m_bTrue == true)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin = point;//如果不修改起點(diǎn) 坐標(biāo),畫(huà)線(xiàn)效果是扇形
}
//恢復(fù)設(shè)備描述表
dc.SelectObject(pOldPen);
這樣就可以繪制連續(xù)線(xiàn)條了。
更多方法之:使用畫(huà)刷繪圖
//創(chuàng)建一個(gè)紅色畫(huà)刷
CBrush brush(RGB(255,0,0));
//創(chuàng)建并獲得設(shè)備描述表
CClientDC dc(this);
//用紅色畫(huà)刷填充鼠標(biāo)拖動(dòng)過(guò)程形成的矩形區(qū)域
dc.FillRect(CRect(m_ptOrigin,point),&brush);
更多方法之:位圖畫(huà)刷
//注:需要先添加一個(gè)位圖資源,ID為IDB_BITMAP1
//創(chuàng)建位圖對(duì)象
CBitmap bitmap;
//加載位圖資源
bitmap.LoadBitmapW(IDB_BITMAP1);
//創(chuàng)建位圖畫(huà)刷
CBrush brush(&bitmap);
//創(chuàng)建并獲得設(shè)備描述表
CClientDC dc(this);
//用位圖畫(huà)刷填充鼠標(biāo)拖動(dòng)過(guò)程形成的矩形區(qū)域
dc.FillRect(CRect(m_ptOrigin,point),&brush);
先介紹這么多吧,這些都是我的學(xué)習(xí)總結(jié),
如果有疑問(wèn),可以聯(lián)系giserdev@163.com,更多內(nèi)容請(qǐng)參考:http://www.cnblogs.com/mxbs/,技術(shù)交流請(qǐng)加QQ群:586571286。
聯(lián)系客服