摘要:本文通過VC++ .NET下的消息映射和消息處理,以及菜單和對話框的使用,設計實現了一個簡單的畫圖程序。
關鍵詞:消息映射 消息處理函數 菜單 對話框
中圖分類號:TP311.52文獻標識碼:A 文章編號:1674-098X(2012)03(b)-0000-00
Microsoft公司推出的Visual Studio.NET集成了C#,VB.NET,VC++.NET等開發工具界面,更好地為.NET應用程序提供了開發平臺。這里使用VC++.NET語言,設計出一個鼠標交互式的繪圖程序,通過鼠標事件消息的調用實現交互式繪圖,從而進一步理解VisualC++.NET的編程基本方法和應用。
一、設計原理
要實現鼠標交互式繪圖,必須通過調用鼠標事件消息WM_LBUTTONDOWN,WM_LBUTTONUP,以及成員函數Moveto( )和Lineto( )和相應參數來實現隨機繪圖。本繪圖法可以實現:當鼠標移動時,系統能相應的確定鼠標的坐標,然后根據鼠標坐標前后不同的變化而動態地顯示出一個臨時的圖形,如圓、橢圓、矩形、直線等。在繪圖程序設計過程中要始終注意前景色和背景色的設置,因為計算機雖然執行了指令,但是如果前景色與背景色一致,就無法看到繪制的圖形,為了方便的選用前景色與背景色,可構造一個CColorDialog類的對象,通過對象數據成員的初始化,調用Domodal()函數,顯示顏色對話框,然后應用程序通過相關的成員函數獲得相應的信息來取得所使用的顏色值。
二、創建繪圖程序的具體過程
1、創建一個新的項目,名稱為Graphic,在“MFC應用程序向導”對話框中選擇“單文檔”,基礎類選擇“Cview”,單擊“完成”,結束MFC應用程序向導,生成單文檔(SDI)應用程序框架。
2、添加菜單。在視圖→資源視圖中選擇“Menu”,添加菜單項:點、直線、矩形、橢圓、顏色、設置,并為每個菜單項設置ID標識,依次為IDM_DOT、IDM_LINE、IDM_RECT、IDM_ELLIPSE、IDM_COLOR、IDM_SETTING。
3、添加消息和消息處理函數。單擊CGraphicView類屬性窗口的“Messages”工具圖標,在屬性窗口添加消息WM_LBUTTONDOWN和WM_LBUTTONUP,然后在GraphicView.cpp中給菜單項和WM_LBUTTONDOWN和WM_LBUTTONUP消息響應函數分別添加代碼。
4、對話框的設置。在資源視圖中添加一個對話框資源“IDD_DLG_SETTING”加入所需的控件,并為控件關聯變量,最后為整個對話框添加一個類“SettingDlg”其基類為“Cdialog”。注意在GraphicView.cpp文件中一定要有語句 #include\"SettingDlg.h\"否則對話框類將無法識別。
5、程序的實現代碼如下:
5.1在GraphicView.cpp文件中添加的代碼:
在資源視圖中只添加了菜單資源,并沒有實現菜單的功能,即沒有對應的命令處理函數與菜單項對應,程序運行后添加的菜單項是灰色的,即處于不可用狀態。因此,添加菜單項后,還應該為新的菜單項指定一個處理函數。利用ClassWizard類向導添加菜單命令的WM_COMMAND消息處理函數后,向導將自動添加一個如下格式的消息映射:ON_COMMAND(MenuItemID,MemberFuntion)其中參數MenuItemID是菜單項的ID標識(添加菜單項時設置的標識),參數MemberFuntion是處理該消息的成員函數名。本例中的菜單處理函數代碼如下:
void CGraphicView::OnDot()
{ m_nDrawType=1; //選擇菜單“點”時,變量“m_nDrawType”的值賦為“1” }
void CGraphicView::OnLine()
{ m_nDrawType=2; //選擇菜單“直線”時,變量“m_nDrawType”的值賦為“2”}
void CGraphicView::OnRect()
{ m_nDrawType=3; //選擇菜單“矩形”時,變量“m_nDrawType”的值賦為“3”}
void CGraphicView::OnEllipse()
{ m_nDrawType=4; //選擇菜單“橢圓”時,變量“m_nDrawType”的值賦為“4”}
5.2在SettingDlg.cpp中添加“設置”對話框中的“示例”部分的代碼:
單擊SettingDlg類屬性對話框窗口的“Messages”工具圖標,在屬性窗口添加消息WM_PAINT,該消息的消息響應函數代碼如下:
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); }
這樣就可以在“示例”中看到設置的線型、線寬和顏色了。
三、結尾
VC++.NET這一可視化開發環境具有強大的功能,這個程序的編寫運用了VC++.NET中的基礎知識,如:屬性的設置、對話框的設置、消息和消息處理函數的調用,并采用了微軟MFC類庫中一些基礎類的構造和使用方法,較完整、系統地運用了面向對象的編程技術,實現了較好的繪圖功能。 本文中所有的方法和語句都是在VC++.NET 2003及Windows XP系統上調試通過的。
參考文獻:
[1](美)DavisChapman 學用VisualC++6.0[M] 北京:清華大學出版社,1999。
[2]李蘭友 VisualC++.NET圖形圖像編程 北京:電子工業出版社,2002。
[3]馬云、葉喜濤、張毅峰等譯 Visual C++.NET寶典[M] 北京:電子工業出版社,2003。