1. 程式人生 > >Visual C++ MFC的圖形繪製——常見問題彙總(不定期更新)

Visual C++ MFC的圖形繪製——常見問題彙總(不定期更新)

                  Visual C++ MFC的圖形繪製——常見問題彙總

目錄

一.常見問題

1. 選單介面製作

2.命令響應函式 

3.新增私有變數

4.訊息響應函式

二.後記

三.補充程式碼


 

一.常見問題

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);
	}
}