摘要:本文通過(guò)VC++ .NET下的消息映射和消息處理,以及菜單和對(duì)話框的使用,設(shè)計(jì)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的畫圖程序。
關(guān)鍵詞:消息映射 消息處理函數(shù) 菜單 對(duì)話框
中圖分類號(hào):TP311.52文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2012)03(b)-0000-00
Microsoft公司推出的Visual Studio.NET集成了C#,VB.NET,VC++.NET等開(kāi)發(fā)工具界面,更好地為.NET應(yīng)用程序提供了開(kāi)發(fā)平臺(tái)。這里使用VC++.NET語(yǔ)言,設(shè)計(jì)出一個(gè)鼠標(biāo)交互式的繪圖程序,通過(guò)鼠標(biāo)事件消息的調(diào)用實(shí)現(xiàn)交互式繪圖,從而進(jìn)一步理解VisualC++.NET的編程基本方法和應(yīng)用。
一、設(shè)計(jì)原理
要實(shí)現(xiàn)鼠標(biāo)交互式繪圖,必須通過(guò)調(diào)用鼠標(biāo)事件消息WM_LBUTTONDOWN,WM_LBUTTONUP,以及成員函數(shù)Moveto( )和Lineto( )和相應(yīng)參數(shù)來(lái)實(shí)現(xiàn)隨機(jī)繪圖。本繪圖法可以實(shí)現(xiàn):當(dāng)鼠標(biāo)移動(dòng)時(shí),系統(tǒng)能相應(yīng)的確定鼠標(biāo)的坐標(biāo),然后根據(jù)鼠標(biāo)坐標(biāo)前后不同的變化而動(dòng)態(tài)地顯示出一個(gè)臨時(shí)的圖形,如圓、橢圓、矩形、直線等。在繪圖程序設(shè)計(jì)過(guò)程中要始終注意前景色和背景色的設(shè)置,因?yàn)橛?jì)算機(jī)雖然執(zhí)行了指令,但是如果前景色與背景色一致,就無(wú)法看到繪制的圖形,為了方便的選用前景色與背景色,可構(gòu)造一個(gè)CColorDialog類的對(duì)象,通過(guò)對(duì)象數(shù)據(jù)成員的初始化,調(diào)用Domodal()函數(shù),顯示顏色對(duì)話框,然后應(yīng)用程序通過(guò)相關(guān)的成員函數(shù)獲得相應(yīng)的信息來(lái)取得所使用的顏色值。
二、創(chuàng)建繪圖程序的具體過(guò)程
1、創(chuàng)建一個(gè)新的項(xiàng)目,名稱為Graphic,在“MFC應(yīng)用程序向?qū)А睂?duì)話框中選擇“單文檔”,基礎(chǔ)類選擇“Cview”,單擊“完成”,結(jié)束MFC應(yīng)用程序向?qū)?,生成單文檔(SDI)應(yīng)用程序框架。
2、添加菜單。在視圖→資源視圖中選擇“Menu”,添加菜單項(xiàng):點(diǎn)、直線、矩形、橢圓、顏色、設(shè)置,并為每個(gè)菜單項(xiàng)設(shè)置ID標(biāo)識(shí),依次為IDM_DOT、IDM_LINE、IDM_RECT、IDM_ELLIPSE、IDM_COLOR、IDM_SETTING。
3、添加消息和消息處理函數(shù)。單擊CGraphicView類屬性窗口的“Messages”工具圖標(biāo),在屬性窗口添加消息WM_LBUTTONDOWN和WM_LBUTTONUP,然后在GraphicView.cpp中給菜單項(xiàng)和WM_LBUTTONDOWN和WM_LBUTTONUP消息響應(yīng)函數(shù)分別添加代碼。
4、對(duì)話框的設(shè)置。在資源視圖中添加一個(gè)對(duì)話框資源“IDD_DLG_SETTING”加入所需的控件,并為控件關(guān)聯(lián)變量,最后為整個(gè)對(duì)話框添加一個(gè)類“SettingDlg”其基類為“Cdialog”。注意在GraphicView.cpp文件中一定要有語(yǔ)句 #include\"SettingDlg.h\"否則對(duì)話框類將無(wú)法識(shí)別。
5、程序的實(shí)現(xiàn)代碼如下:
5.1在GraphicView.cpp文件中添加的代碼:
在資源視圖中只添加了菜單資源,并沒(méi)有實(shí)現(xiàn)菜單的功能,即沒(méi)有對(duì)應(yīng)的命令處理函數(shù)與菜單項(xiàng)對(duì)應(yīng),程序運(yùn)行后添加的菜單項(xiàng)是灰色的,即處于不可用狀態(tài)。因此,添加菜單項(xiàng)后,還應(yīng)該為新的菜單項(xiàng)指定一個(gè)處理函數(shù)。利用ClassWizard類向?qū)砑硬藛蚊畹腤M_COMMAND消息處理函數(shù)后,向?qū)⒆詣?dòng)添加一個(gè)如下格式的消息映射:ON_COMMAND(MenuItemID,MemberFuntion)其中參數(shù)MenuItemID是菜單項(xiàng)的ID標(biāo)識(shí)(添加菜單項(xiàng)時(shí)設(shè)置的標(biāo)識(shí)),參數(shù)MemberFuntion是處理該消息的成員函數(shù)名。本例中的菜單處理函數(shù)代碼如下:
void CGraphicView::OnDot()
{ m_nDrawType=1; //選擇菜單“點(diǎn)”時(shí),變量“m_nDrawType”的值賦為“1” }
void CGraphicView::OnLine()
{ m_nDrawType=2; //選擇菜單“直線”時(shí),變量“m_nDrawType”的值賦為“2”}
void CGraphicView::OnRect()
{ m_nDrawType=3; //選擇菜單“矩形”時(shí),變量“m_nDrawType”的值賦為“3”}
void CGraphicView::OnEllipse()
{ m_nDrawType=4; //選擇菜單“橢圓”時(shí),變量“m_nDrawType”的值賦為“4”}
5.2在SettingDlg.cpp中添加“設(shè)置”對(duì)話框中的“示例”部分的代碼:
單擊SettingDlg類屬性對(duì)話框窗口的“Messages”工具圖標(biāo),在屬性窗口添加消息WM_PAINT,該消息的消息響應(yīng)函數(shù)代碼如下:
void SettingDlg::OnPaint()
{CPaintDC dc(this);
UpdateData();
CPen pen(m_nLineStyle,m_nLineWidth,m_clr);
dc.SelectObject (pen);
CRect rect;
GetDlgItem(IDC_SAMPLE)->GetWindowRect (rect);
ScreenToClient(rect);
dc.MoveTo (rect.left +20,rect.top +rect.Height ()/2);
dc.LineTo (rect.right -20,rect.top +rect.Height ()/2); }
這樣就可以在“示例”中看到設(shè)置的線型、線寬和顏色了。
三、結(jié)尾
VC++.NET這一可視化開(kāi)發(fā)環(huán)境具有強(qiáng)大的功能,這個(gè)程序的編寫運(yùn)用了VC++.NET中的基礎(chǔ)知識(shí),如:屬性的設(shè)置、對(duì)話框的設(shè)置、消息和消息處理函數(shù)的調(diào)用,并采用了微軟MFC類庫(kù)中一些基礎(chǔ)類的構(gòu)造和使用方法,較完整、系統(tǒng)地運(yùn)用了面向?qū)ο蟮木幊碳夹g(shù),實(shí)現(xiàn)了較好的繪圖功能。 本文中所有的方法和語(yǔ)句都是在VC++.NET 2003及Windows XP系統(tǒng)上調(diào)試通過(guò)的。
參考文獻(xiàn):
[1](美)DavisChapman 學(xué)用VisualC++6.0[M] 北京:清華大學(xué)出版社,1999。
[2]李蘭友 VisualC++.NET圖形圖像編程 北京:電子工業(yè)出版社,2002。
[3]馬云、葉喜濤、張毅峰等譯 Visual C++.NET寶典[M] 北京:電子工業(yè)出版社,2003。