Visual C++ MFC的圖形繪製——常見問題彙總(不定期更新)
Visual C++ MFC的圖形繪製——常見問題彙總
目錄
一.常見問題
1. 選單介面製作
題目描述:新建一個單文件型別的MFC AppWizard (exe)工程,工程取名為:Graphic。為此程式新增一個子選單,選單名稱為“繪圖”,併為其新增六個選單項,分別用來控制不同圖形的繪製
分析:從題中可以得知,需要做一個選單,並新增相應的子選單
常見問題:1.新建一個選單,做一個水平選單欄,並新增六個選單項(如圖)
發現報錯,修改,完成(機智如我,驕傲.jpg)
示例寫法:在原選單的基礎下,建立選單(命名為繪圖),並建立6個子選單。(這裡我寫個7的子選單)
2.命令響應函式
問題描述:當用戶選擇其中的一個選單項後,程式將按照當前的選擇進行相應圖形的繪製。新增的六個選單項的ID及名稱。然後分別為這六個選單項新增命令響應,本程式讓視類(CGraphicView)對這些選單命令進行響應。程式碼如下:
void CGraphicView::OnDot(){....................}
分析:在CGraphicView類中,新增相對應的命令響應函式
常見問題:1.預設類是CMainFrame,而這裡需要用CGraphicView類 (錯了的,回去面壁吧!)
3.新增私有變數
問題描述:在程式執行以後,當用戶單擊某個選單項時,應該把使用者的選擇儲存起來,以便隨後的繪圖操作使用。因此在CGraphicView類中新增一個私有變數m_nDrawType;用來儲存使用者的選擇,該變數的定義如下所述:
private: UINT m_nDrawType;
接著,在視類的建構函式中將此變數初始化為0
m_nDrawType=0;
分析:找到CGraphicView.h檔案添,新增私有變數m_nDrawType;然後在CGraphicView.cpp中 對私有變數 初始化
常見問題:1.找不到位置;2.格式 (寫法不唯一,也可以滑鼠右鍵新增變數)
示例寫法:1.對 CGraphicView.h 檔案操作
class CGraphicView : public CView //新增私有變數 類 的位置
{
////////////////////////// 上面的部分程式碼刪去////////////////////////////////////
protected:
//{{AFX_MSG(CGraphicView)
afx_msg void OnDot();
afx_msg void OnLine();
afx_msg void OnRectangle();
afx_msg void OnEllipse();
afx_msg void OnShanxing();
afx_msg void OnLianxuxian();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnXiantiao();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
///////////////// 新增private變數 //////////////////////////////////////////////
/////////////////////// 格式 ///////////////////////////////////////////////////
//////////////// private: ////////////////////////////////////////////////
/////////////// UINT m_nDrawType; //////////////////////////////////////
private:
UINT m_nDrawType;
CPoint m_ptOrigin;
CPoint m_ptOld;
BOOL m_bDraw;//設定為私有型別,true代表滑鼠點下,false代表滑鼠談起
};
2.對 CGraphicView.cpp 檔案操作
CGraphicView::CGraphicView() // 初始化 類 的位置
{
// TODO: add construction code here
m_nDrawType=0; //初始化
m_ptOrigin=0;
m_ptOld=0;
m_bDraw=FALSE;
}
4.訊息響應函式
問題描述:對於直線、矩形和橢圓,在繪製時都可有兩點來確定其圖形。當滑鼠左擊時得到一個點,當滑鼠左鍵鬆開時得到另外一個點。為視類CGraphicView分別捕獲滑鼠左鍵按下和彈起這兩個訊息。在滑鼠按下訊息響應函式中,儲存該點,程式碼如下:
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point){ ....................... }
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) { .......................... }
分析:在CGraphicView類中新增滑鼠訊息響應函式
常見問題:1.找不到滑鼠訊息響應函式在哪裡,不知道如何新增(迷茫.jpg)
2.新建 OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)
的函式(機智.jpg) 寫完後,不報錯,執行沒反應(疑惑.jpg)
3.知道如何新增訊息響應函式,滑鼠左鍵 寫成 滑鼠右鍵
寫完後,不報錯,滑鼠左鍵沒反應,右鍵有反應。(滑鼠左鍵表示:這鍋我不背!)
示例寫法:1. 建立類嚮導(快捷鍵 Ctrl+W)
2 .確認 Object IDs: 和 Class name; 並在 Messages 中雙擊 WM_LBUTTONBOWN ,最後點選確認
3. 重複上面步驟 新增WM_LBUTTONUP
二.後記
本文感謝,沉迷貪玩藍月的學委,班級扛把子學霸哥,Zombie,徐不帥 等提供各種錯誤案例(真機智.jpg)。
原本並不想寫這篇博文,但鑑於出現的問題過於奇怪,並在 班級扛把子學霸哥 的遊說下 ,寫下篇文章(我是不是上當了,腦闊疼,jpg),並保持不定期更新。
還是那就話,本人水平有限,才學不高;難免有問題,發現問題請發訊息。
三.補充程式碼
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
//建立並獲得裝置描述
CClientDC dc(this);
switch (m_nDrawType)
{
case 5:
m_bDraw=FALSE;//新加/*繪製扇形*/
break;
case 6: /*繪製連續線*/
dc.MoveTo(m_ptOrigin);/*呼叫MoveTo函式移動到原點*/
dc.LineTo(point);/*呼叫LineTo函式繪製到終點。*/
m_ptOrigin = point;
break;
case 7: /*繪製線條*/
break;
CView::OnLButtonUp(nFlags, point);
}
}
////////////////////////////////////////////////////////////
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//////////// 5. 扇形 ////////////////////////
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0)); //建立畫筆 大小1 顏色 紅色
CPen *pOldPen=dc.SelectObject(&pen);// 選擇畫筆
switch (m_nDrawType)
{
case 5:
if(m_bDraw==TRUE)
{
dc.MoveTo(m_ptOrigin);
//dc.LineTo(m_ptOld);//帶邊框
//dc.MoveTo(m_ptOld);//帶邊框
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
//m_ptOld=point; //帶邊框
}
dc.SelectObject(pOldPen); //呼叫畫筆
break;
///////////////// 7. 連續線條 /////////////////////////////
case 7:
if(m_bDraw==TRUE)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
}
dc.SelectObject(pOldPen);
break;
CView::OnMouseMove(nFlags, point);
}
}