1. 程式人生 > >MFC之繪圖篇:初步繪圖(開發平臺VS2010)

MFC之繪圖篇:初步繪圖(開發平臺VS2010)

步驟一:        在已有的外貌框架中為我們的選單項滑鼠右鍵新增訊息處理程式,用來處理當我們對該選單項進行點選時能夠傳遞某些東西。 如下圖所示:

在這時我們就會看到一個彈出的嚮導對話方塊,記住新增的事件處理程式在DrawView類中,這時我們就會發現改ID的好處了,我們就能對這些事件處理程式進行很好的區分,而不是一堆數字。如下圖所示:

用同樣的方法新增想要處理的程式在這裡我就只添加了直線、矩形、橢圓、顏色、設定添加了事件處理程式。 添加了事件處理程式之後我們再次點選執行時我們就會發現原來的灰色選單項中我們添加了事件處理程式的就不會再顯示為灰色。而且在DrawView類中為我們自動生成了一下程式碼:

     void CDrawView::OnLine() {  // TODO: 在此新增命令處理程式程式碼 }

void CDrawView::OnRectangle() {  // TODO: 在此新增命令處理程式程式碼 }

void CDrawView::OnEllipse() {  // TODO: 在此新增命令處理程式程式碼 }

void CDrawView::OnColor() {  // TODO: 在此新增命令處理程式程式碼 }

void CDrawView::OnSetting() {  // TODO: 在此新增命令處理程式程式碼 }

執行效果如圖所示:

步驟二:

          做了以上這些是不是離這個初步的繪製圖形不遠了呢,在這章裡答案是這樣的,但是隻在DrawView裡畫圖顯然過於不嚴謹,封裝性不夠好,為此我建立了圖形基類CShape類,然後建立了CRectangle,CEllipse,CLine三個公有繼承於CShape的圖形子類,以便於相對應相應的選單項。

如圖所示:

步驟三:

        做完了這些,我們就可以在這些類裡面做些什麼了,讓這個繪圖程式逐漸的鮮活起來。由圖形的基本屬性所知,繪製一個圖形需要一個起點和一個重點,在MFC中這些帶有二維屬性的點是CPoint類的,所以我們只需在基類CShape中定義兩個CPoint型別的變數m_ptOrigin和m_End分別儲存起點和終點(變數命名最好見名知意)。同理,我們新增int型變數m_DrawType儲存我繪製的型別

新增變數方式如圖:

步驟四:繪製圖形         我們先要在DrawView中定義三個相同的變數。然後要在剛新增的時間處理程式中分別對這三種圖形的線型進行設定。具體程式碼如下:

void CDrawView::OnLine() {  // TODO: 在此新增命令處理程式程式碼  m_DrawType=1;  }

void CDrawView::OnRectangle() {  // TODO: 在此新增命令處理程式程式碼  m_DrawType=2; }

void CDrawView::OnEllipse() {  // TODO: 在此新增命令處理程式程式碼  m_DrawType=3; }

做完這些我們當然還是不能繪圖。 步驟四:讓我們來想一想我們在用微軟的畫圖時是不是滑鼠左鍵點選時才會進行圖形的繪製,然後滑鼠右鍵鬆開時,這個圖形便繪製好了呢!所以我們就得利用類嚮導為我們天加這兩個訊息的處理。如下圖:

步驟五:         編寫繪製圖形實現程式碼,我們可以想象一下,當我們滑鼠左鍵在客戶區進行點選時,要把我們點選的點當成繪圖的起點,滑鼠右鍵在彈起時記錄成終點。然後繪製圖形的過程呢便是在滑鼠左鍵點選時到滑鼠左鍵彈起時這一過程繪製的圖形,所以我們要在LBottonDown時讓我的起點等於傳進來的點,實現程式碼如下:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {  // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值  m_ptOrigin=point;  CView::OnLButtonDown(nFlags, point); }

然後在LBottonUp中新增繪製的程式碼,程式碼如下:

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {  // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值  CClientDC dc(this); //建立dc  CPen pen(PS_SOLID,1,RGB(255,0,0)); //建立繪製的畫筆  CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //建立繪製時填充的畫刷  dc.SelectObject(&pen); //將畫刷和畫筆選入裝置描述表中  dc.SelectObject(pbrush);  switch (m_DrawType) //根據繪製種類進行繪製  {  case 1:   dc.MoveTo(m_ptOrigin);   dc.LineTo(point);   break;  case 2:   dc.Rectangle(CRect(m_ptOrigin,point));   break;  case 3:   dc.Ellipse(CRect(m_ptOrigin,point));   break;  default:   break;  }  CView::OnLButtonUp(nFlags, point); }  

執行後就可以繪製圖形了,如下圖所示:

但是一拖動邊框呢我們發現繪製的圖形就沒有了,這就涉及到圖形的重繪和儲存了,不是這章應該討論的內容。 今天就先講到這裡,預知後事如何,且聽下回分解。如有轉載,不勝榮幸,請註明出處。謝謝! 轉載。 https://blog.csdn.net/u012424783/article/details/25737067