摘要:該文主要就VC++編程過程中對話框相關的兩個問題做了比較詳細的闡述,并提供了相應的解決方法:一是對話框類的刪除和重建問題;二是對話框類的變量初始化問題。
關鍵詞:VC++;對話框類;類更名;初始化
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)19-30054-02
The Rebuilding and Initialization of the Variable of Dialog Class in VC++
CUI Rong-hua1,2, LI Yuan-zong1
(1. Taiyuan University of Technology, Taiyuan 030024, China; 2. Nantong University, NanTong 226019, China)
Abstract: The text talk about two problems in VC++ programming process in a detail way, and provided the corresponding solution. The first problem is the delete and rebuild of the dialog class; The second problem is the initialization of the variable in dialog class.
Key words: VC++; Dialog Class; Class Rename; Initialization
1 引言
VC++是Microsoft推出編程軟件,它是集編輯、編譯、連接、調試、運行于一身的目前綜合性最高最強大有力的高端軟件開發工具。VC++開發環境繼承了C及C++語言的高效率、靈活的指針應用、嚴謹的結構及數據封裝、所編輯的軟件運行速度快等優點,又提供了方便實用的交互式可視化編程環境。熟練的掌握VC++能夠比較容易的開發出界面友好、操作簡單的使用軟件。目前它的應用極為廣泛。
提供了強大編程功能的VC++,它同時也對編程人員有著較高的要求。它要求編程人員擁有C和C++語言的基礎、熟練掌握VC++所提供的常用的一些類的基本知識、熟悉VC++基本的編程基本思想、熟悉VC++的源代碼結構等等。由于VC++的知識面廣,體系龐大。所以對VC++的使用者來說經常會遇到一些問題。下面討論的是對話框類重建和變量初始化問題。
2 對話框類的刪除重建
在使用VC++進行編程的過程中,為了將一個功能獨立出來單獨處理或使用一個新的對話框,需要建立一個新的類。建立一個類非常方便,如果想將已有的類刪除,則就不容易了。
先在VC++中的編程環境中新建一個基于對話框的程序TestProgram。在Workspace的ResourceView中的Dialog文件夾上右鍵選擇插入Dialog命令,ID為IDD_TRYCLASSDLG,建立一個跟新對話框對應的類CTryClassDlg。
在建立類CtryClassDlg后,由于某些原因,不想用該名稱作為該類的類名,想在已經建立好的程序中對該類更名,VC++中就沒有提供任何的為類更名的直接途徑。這時候的唯一方法就是將已經建立好的類刪除,然后從新建立。
在VC++的編程界面中,Workspace的ClassView中列出了程序中的所有類,而在ClassView中并沒有提供類的任何刪除命令,包括右鍵菜單(如圖1),而且Delete鍵也不起作用。
■
圖1 圖2
只能先在Workspace的FileView中找到該類所對應的頭文件(*.h)和源文件(*.cpp),選中后按Delete鍵刪除(注意:在FileView的頭文件和源文件刪除中,右鍵快捷菜單也不提供刪除命令)。這樣在的編程界面上已經見不到已刪除的類留下的任何信息。但問題并沒有解決。
當在已經建立的對話框上想從新建立一個類的時候會發現VC++并沒有反映。而且在建立的工程文件夾中TryClassDlg.h,TryClassDlg.cpp兩個文件還在,如果將這兩個文件刪除(如圖3),則在對話框(IDD_TRYCLASSDLG)上建立對應的類時會出現如圖4的提示——CtryClassDlg類所對應的頭文件TryClassDlg.h,源文件TryClassDlg.cpp不存在或文件名非法。這說明在工程的中,VC++還沒有真正的將CtryClassDlg類的關聯信息刪去。這個信息其實存在于工程文件夾的TestProgram.clw文件中。只要再將TestProgram.clw文件刪去,然后在對話框的編輯頁面上右鍵建立類向導然后按照提示照做,即可進行對話框對應類的從建。同樣也就解決了類的更名問題。
■
圖3
■
圖4
3 對話框類的變量初始化
一般來說或者一些教程上都要求對話框變量的初始化都最好放在消息WM_INITDIALOG對應的函數OnInitDialog()中進行。而且在對消息WM_INITDIALOG添加函數以后選擇Edit Code時光標自動停留在CDialog::OnInitDialog()函數下面的一行“//TODO:Add extra initialization here”這段字符上,如圖5所示。
■
圖5
這對于對話框之間沒有什么數據的直接傳遞,或者不講求數據傳遞的實時性程序來說,可以這么做。但如果有對話框進行的直接數據傳遞,或者要求對話框中(如編輯框)的數據的顯示值真實的反映其內存中的值的時候,這樣做就有問題了。
在工程TestProgram中的對話框(IDD_TRYCLASSDLG)中添加一編輯框(IDC_EDITDATASHOW)用來顯示整形變量m_EditDataShow的值(對話框(IDD_TRYCLASSDLG)所對應的類仍然使用CtryClassDlg)。直接用類向導對編輯框(IDC_EDITDATASHOW)定義變量,那VC++自動將其初始化放在對話框類的構造函數CtryClassDlg()中進行。不妨先將該初始化注釋掉。然后在OnInitDialog()所規定的地方對其進行初始化。OnInitDialog()函數內容如下:
BOOL CTryClassDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_EditDataShow=0;
return TRUE;//return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
這時對話框的中編輯框(IDC_EDITDATASHOW)中顯示的內容并非為零。而是另外一個隨機的跟沒有初始化一樣的數值。然而,內存中m_EditDataShow的值確實為零。
如果在m_EditDataShow=0;代碼下面加上UpdateData(1)函數,則從新運行后的程序編輯框(IDC_EDITDATASHOW)中顯示的內容為零。另外,也可以把m_EditDataShow=0;直接放在CDialog::OnInitDialog()代碼上面。
BOOL CTryClassDlg::OnInitDialog()
{
m_EditDataShow=0;
CDialog::OnInitDialog();
return TRUE;// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
運行程序,編輯框(IDC_EDITDATASHOW)中的內容也為零。
如果在定義對話框(IDD_TRYCLASSDLG)類CTryClassDlg對象cTryClassDlg的時候給變量m_EditDataShow賦值:
cTryClassDlg cTryClassDlg;
cTryClassDlg.m_EditDataShow=9999;
cTryClassDlg.DoModal();
那這個時候對m_EditDataShow變量的初始化位置的不同,就會直接影響進入該對話框后所見的m_EditDataShow的值和內存中的值。
1) 如果將m_EditDataShow的初始化放在WM_INITDIALOG對應的函數OnInitDialog()中,不管是在CDialog::OnInitDialog()函數的前面還是后面,在進入對話框(IDD_TRYCLASSDLG)的時候,m_EditDataShow內存中和顯示的值為0,而不是9999。
2) 如果將m_EditDataShow的初始化放在類CtryClassDlg的構造函數CTryClassDlg::CtryClassDlg()中。
CTryClassDlg::CTryClassDlg(CWnd* pParent /*=NULL*/) : CDialog(CTryClassDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTryClassDlg)
m_EditDataShow = 0;
//}}AFX_DATA_INIT
}
那進入對話框(IDD_TRYCLASSDLG)時的m_EditDataShow值才正常,為需要的值9999。
所以,在對類對象初始化的時候,最好是在類的構造函數中。如果在沒有外部數據輸入的時候也可以在OnInitDialog()函數中初始化。
4 結束語
本文談及VC++編程中兩個問題,一對話框類的重建問題;一為變量初始化問題。本文通過具體例程來說明問題的解決方法。在對話框類的重建問題上注重敘述解決問題的方法和步驟;在變量初始化的問題上注重分析不同變量初始化方法所獲得的不同程序結果。
參考文獻:
[1] 范輝,等. Visual C++6.0 程序設計簡明教程[M]. 北京:高等教育出版社,2001.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文