之前的學習都是對現有MFC程序的瞭解,對比之前窗口創建過程,在MFC中判斷每一步的具體流程,現在有了比較清晰的認識,但具體的細節還要在之後的學習中不斷完善。
現在知道了MFC創建後就有許多的代碼,這些代碼爲我們的窗口創建提供了許多便利,我們不需要考慮太多關於窗口框架的問題。那麼,我們如何在現有的MFC結構下編寫自己的程序呢,接下來我們就學習一下如何在窗口中畫線。
我們要實現的效果是,按下鼠標左鍵並拖動鼠標到另一點,屏幕顯示兩點之間的線段。
首先在VC6.0菜單中點擊查看——建立類嚮導,即可增加響應函數,需要在CDrawView類下增加響應函數LButtonDown,並選擇編輯就跳轉到編譯環境。
注:當增加一個消息響應函數時,實際上在3個地方進行了修改。第一個是在頭文件中加入消息響應函數原型的聲明,第二個是在源文件(.cpp)中加入消息響應函數的一個宏,通過這個宏把我們的消息和消息響應函數關聯起來了。第三個是在源文件中增加了消息響應函數的定義(實現部分)。
然後在CDrawView類中創建一個私有成員變量,在結構體中進行初始化
private:
CPoint m_ptOrigin;
CDrawView::CDrawView()
{
// TODO: add construction code here
m_ptOrigin = 0;
}
在OnLButtonDown中保存當前鼠標左鍵按下的點
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin = point;
CView::OnLButtonDown(nFlags, point);
}
接下來要確定線段的終點,需要另一個按鍵鬆開的響應,同前一個步驟類似
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
}
接下來就利用4種方法創建了畫線命令,同時介紹了線型和顏色的選擇。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/****************wjl***********************
方法一:
這個是用平臺SDK 來完成的劃線功能
用的API函數(全局函數)來完成的
*********************************
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);
******************wjl*********************/
/****************wjl***********************
方法二:
因爲MFC具有高度的封裝性,MFC中所有和窗口
相關的操作都封裝到CWnd類中了,
所有和作圖相關的操作都封裝到CDC類中了。
接下來利用MFC裏面的CDC類來進行劃線的操作
CDC *pDC=GetDC(); // 這裏的GetDC是CWnd類中的函數
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
***************wjl************************/
/****************wjl***********************
方法三:
介紹另外一個類 CClientDC,它在創建對象的時候
自動調用了GetDC,並且在結束的時候自動釋放DC
// CClientDC dc(this); // 這個是和View窗口相關的操作,
CClientDC dc(GetParent()); //這個時候框架窗口相關的操作
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
***************wjl************************/
/****************wjl***********************
方法四:
另外一個類CWindowDC,和CClientDC類似,他們都自動
調用GetDC,並且在結束的時候自動釋放DC。不同的是
CWindowDC可以訪問整個窗口區域,包括客戶區和非客戶區
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
CWindowDC dc(GetDesktopWindow()); // 劃線到整個屏幕
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
***************wjl************************/
/****************wjl***********************
<*如何改變線寬和顏色*>
1. 首先要創建畫筆,利用MFC提供的CPen類
CPen pen(參數一,參數二,參數三);
第一個參數指畫筆的類型 實線PS_SOLID、虛線PS_DASH、點線PS_DOT
第二個參數指的是畫筆的寬度
第三個參數是筆的顏色RGB(0-255)
2. 當你創建完畫筆之後並不會生效,你需要將這個筆
選擇到設備描述表DC當中,這樣當你調用DC的時候才能
使用你定義好的畫筆。
利用SelectObject()把當前的畫筆選擇到DC中,同時保存先前的
畫筆(SelectObject的返回值就是先前的畫筆類型)
3.注意:虛線PS_DASH和點線PS_DOT 只有在線寬小於等於1的時候纔會效果
CPen pen(PS_DOT,1,RGB(0,0,255));
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen); // 這裏保存了先前畫筆類型的指針
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen); // 將之前的畫筆類型還原
***************wjl************************/
CView::OnLButtonUp(nFlags, point);
}