MFC畫線功能總結


本文僅用於學習交流,商業用途請支持正版!轉載請注明:http://www.cnblogs.com/mxbs/p/6216464.html 

MFC畫線功能要點有二:其一,鼠標按下時記錄初始位置為線的起始端點,其二,利用不同的方法實現畫線。下面着重學習總結畫線功能實現方法。

  在OnLButtonDown函數中記錄起始端點,CPoint m_ptOrigin = point;

  在OnLButtonUp函數中實現畫線。方法如下:

  畫線方法一:利用SDK全局函數實現視圖窗口畫線功能

//獲取設備描述表
HDC hdc;
//調用全局函數獲得當前窗口的設備描述表,CWnd::m_hWnd根據繼承原理,CDrawView繼承了CWnd類的數據成員
hdc = ::GetDC(m_hWnd);
//移動到線條的起點
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//第四個參數用於保存鼠標移動前的位置,此處不需要,設為NULL
//畫線
LineTo(hdc,point.x,point.y);
//釋放設備描述表
::ReleaseDC(m_hWnd,hdc);

畫線方法二:利用MFC的CDC類實現畫線功能

//說明:CDC類封裝了所有與繪圖相關的操作
CDC* pDC = GetDC();//定義CDC類型的指針,利用CWnd類的成員函數GetDC獲得當前窗口的設備描述表對象的指針
pDC -> MoveTo(m_ptOrigin);//利用CDC類的成員函數MoveTo和LineTo完成畫線功能
pDC -> LineTo(point);
ReleaseDC(pDC);

  畫線方法三:利用CClientDC類

//說明:此類派生於CDC類,在構造時調用GetDC()函數,在析構時調用ReleaseDC()函數,因此無需顯示調用這兩個函數。
//CClientDC dc(this);//在當前視圖窗口畫線方法
CClientDC dc(GetParent());//獲取當前視圖窗口的父窗口,可以在父窗口畫線
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

畫線方法四:利用CWindowDC類
//CWindowDC dc(this);//只能在視類中畫線
CWindowDC dc(GetParent());//可以在父窗口中畫線
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

如果我們要更多功能的繪制方法,可以利用更多的資源和方法,如:

更多方法之:繪制彩色線條(設備描述表中默認有一個黑色畫筆)

CPen pen(PS_SOLID,5,RGB(255,255,0));//創建畫筆對象
CClientDC dc(this);
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);

更多方法之:繪制連續線條

//* 此時需要添加鼠標移動消息響應函數OnMouseMove,當鼠標移動時記錄位置並繪制短線,然后需要將此時鼠標位置設置為下一次繪制的起點坐標,     

//* 這樣便可以繪制連續線條了。為此,添加一個判斷是否在畫線的布爾變量m_bTrue,在視類構造函數中初始化為true,在OnLButtonDown中初始化為true,  

//* 在OnLButtonUp中初始化為false,OnMouseMove函數如下:                                                   

// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
//創建一個紅色的、寬度為1的實線畫筆
CPen pen(PS_SOLID,1,RGB(255,0,0));
//把創建的畫筆選入設備描述表
CPen *pOldPen = dc.SelectObject(&pen);
if(m_bTrue == true)
{
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);

  m_ptOrigin = point;//如果不修改起點 坐標,畫線效果是扇形
}
//恢復設備描述表
dc.SelectObject(pOldPen);

這樣就可以繪制連續線條了。

更多方法之:使用畫刷繪圖
//創建一個紅色畫刷
CBrush brush(RGB(255,0,0));
//創建並獲得設備描述表
CClientDC dc(this);
//用紅色畫刷填充鼠標拖動過程形成的矩形區域
dc.FillRect(CRect(m_ptOrigin,point),&brush);

更多方法之:位圖畫刷

//注:需要先添加一個位圖資源,ID為IDB_BITMAP1

//創建位圖對象
CBitmap bitmap;
//加載位圖資源
bitmap.LoadBitmapW(IDB_BITMAP1);
//創建位圖畫刷
CBrush brush(&bitmap);
//創建並獲得設備描述表
CClientDC dc(this);
//用位圖畫刷填充鼠標拖動過程形成的矩形區域
dc.FillRect(CRect(m_ptOrigin,point),&brush);

先介紹這么多吧,這些都是我的學習總結,

如果有疑問,可以聯系giserdev@163.com,更多內容請參考:http://www.cnblogs.com/mxbs/,技術交流請加QQ群:586571286。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM