摘要:該文主要就VC++編程過(guò)程中對(duì)話框相關(guān)的兩個(gè)問(wèn)題做了比較詳細(xì)的闡述,并提供了相應(yīng)的解決方法:一是對(duì)話框類的刪除和重建問(wèn)題;二是對(duì)話框類的變量初始化問(wèn)題。
關(guān)鍵詞:VC++;對(duì)話框類;類更名;初始化
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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推出編程軟件,它是集編輯、編譯、連接、調(diào)試、運(yùn)行于一身的目前綜合性最高最強(qiáng)大有力的高端軟件開發(fā)工具。VC++開發(fā)環(huán)境繼承了C及C++語(yǔ)言的高效率、靈活的指針應(yīng)用、嚴(yán)謹(jǐn)?shù)慕Y(jié)構(gòu)及數(shù)據(jù)封裝、所編輯的軟件運(yùn)行速度快等優(yōu)點(diǎn),又提供了方便實(shí)用的交互式可視化編程環(huán)境。熟練的掌握VC++能夠比較容易的開發(fā)出界面友好、操作簡(jiǎn)單的使用軟件。目前它的應(yīng)用極為廣泛。
提供了強(qiáng)大編程功能的VC++,它同時(shí)也對(duì)編程人員有著較高的要求。它要求編程人員擁有C和C++語(yǔ)言的基礎(chǔ)、熟練掌握VC++所提供的常用的一些類的基本知識(shí)、熟悉VC++基本的編程基本思想、熟悉VC++的源代碼結(jié)構(gòu)等等。由于VC++的知識(shí)面廣,體系龐大。所以對(duì)VC++的使用者來(lái)說(shuō)經(jīng)常會(huì)遇到一些問(wèn)題。下面討論的是對(duì)話框類重建和變量初始化問(wèn)題。
2 對(duì)話框類的刪除重建
在使用VC++進(jìn)行編程的過(guò)程中,為了將一個(gè)功能獨(dú)立出來(lái)單獨(dú)處理或使用一個(gè)新的對(duì)話框,需要建立一個(gè)新的類。建立一個(gè)類非常方便,如果想將已有的類刪除,則就不容易了。
先在VC++中的編程環(huán)境中新建一個(gè)基于對(duì)話框的程序TestProgram。在Workspace的ResourceView中的Dialog文件夾上右鍵選擇插入Dialog命令,ID為IDD_TRYCLASSDLG,建立一個(gè)跟新對(duì)話框?qū)?yīng)的類CTryClassDlg。
在建立類CtryClassDlg后,由于某些原因,不想用該名稱作為該類的類名,想在已經(jīng)建立好的程序中對(duì)該類更名,VC++中就沒有提供任何的為類更名的直接途徑。這時(shí)候的唯一方法就是將已經(jīng)建立好的類刪除,然后從新建立。
在VC++的編程界面中,Workspace的ClassView中列出了程序中的所有類,而在ClassView中并沒有提供類的任何刪除命令,包括右鍵菜單(如圖1),而且Delete鍵也不起作用。
■
圖1 圖2
只能先在Workspace的FileView中找到該類所對(duì)應(yīng)的頭文件(*.h)和源文件(*.cpp),選中后按Delete鍵刪除(注意:在FileView的頭文件和源文件刪除中,右鍵快捷菜單也不提供刪除命令)。這樣在的編程界面上已經(jīng)見不到已刪除的類留下的任何信息。但問(wèn)題并沒有解決。
當(dāng)在已經(jīng)建立的對(duì)話框上想從新建立一個(gè)類的時(shí)候會(huì)發(fā)現(xiàn)VC++并沒有反映。而且在建立的工程文件夾中TryClassDlg.h,TryClassDlg.cpp兩個(gè)文件還在,如果將這兩個(gè)文件刪除(如圖3),則在對(duì)話框(IDD_TRYCLASSDLG)上建立對(duì)應(yīng)的類時(shí)會(huì)出現(xiàn)如圖4的提示——CtryClassDlg類所對(duì)應(yīng)的頭文件TryClassDlg.h,源文件TryClassDlg.cpp不存在或文件名非法。這說(shuō)明在工程的中,VC++還沒有真正的將CtryClassDlg類的關(guān)聯(lián)信息刪去。這個(gè)信息其實(shí)存在于工程文件夾的TestProgram.clw文件中。只要再將TestProgram.clw文件刪去,然后在對(duì)話框的編輯頁(yè)面上右鍵建立類向?qū)缓蟀凑仗崾菊兆?,即可進(jìn)行對(duì)話框?qū)?yīng)類的從建。同樣也就解決了類的更名問(wèn)題。
■
圖3
■
圖4
3 對(duì)話框類的變量初始化
一般來(lái)說(shuō)或者一些教程上都要求對(duì)話框變量的初始化都最好放在消息WM_INITDIALOG對(duì)應(yīng)的函數(shù)OnInitDialog()中進(jìn)行。而且在對(duì)消息WM_INITDIALOG添加函數(shù)以后選擇Edit Code時(shí)光標(biāo)自動(dòng)停留在CDialog::OnInitDialog()函數(shù)下面的一行“//TODO:Add extra initialization here”這段字符上,如圖5所示。
■
圖5
這對(duì)于對(duì)話框之間沒有什么數(shù)據(jù)的直接傳遞,或者不講求數(shù)據(jù)傳遞的實(shí)時(shí)性程序來(lái)說(shuō),可以這么做。但如果有對(duì)話框進(jìn)行的直接數(shù)據(jù)傳遞,或者要求對(duì)話框中(如編輯框)的數(shù)據(jù)的顯示值真實(shí)的反映其內(nèi)存中的值的時(shí)候,這樣做就有問(wèn)題了。
在工程TestProgram中的對(duì)話框(IDD_TRYCLASSDLG)中添加一編輯框(IDC_EDITDATASHOW)用來(lái)顯示整形變量m_EditDataShow的值(對(duì)話框(IDD_TRYCLASSDLG)所對(duì)應(yīng)的類仍然使用CtryClassDlg)。直接用類向?qū)?duì)編輯框(IDC_EDITDATASHOW)定義變量,那VC++自動(dòng)將其初始化放在對(duì)話框類的構(gòu)造函數(shù)CtryClassDlg()中進(jìn)行。不妨先將該初始化注釋掉。然后在OnInitDialog()所規(guī)定的地方對(duì)其進(jìn)行初始化。OnInitDialog()函數(shù)內(nèi)容如下:
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
}
這時(shí)對(duì)話框的中編輯框(IDC_EDITDATASHOW)中顯示的內(nèi)容并非為零。而是另外一個(gè)隨機(jī)的跟沒有初始化一樣的數(shù)值。然而,內(nèi)存中m_EditDataShow的值確實(shí)為零。
如果在m_EditDataShow=0;代碼下面加上UpdateData(1)函數(shù),則從新運(yùn)行后的程序編輯框(IDC_EDITDATASHOW)中顯示的內(nèi)容為零。另外,也可以把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
}
運(yùn)行程序,編輯框(IDC_EDITDATASHOW)中的內(nèi)容也為零。
如果在定義對(duì)話框(IDD_TRYCLASSDLG)類CTryClassDlg對(duì)象cTryClassDlg的時(shí)候給變量m_EditDataShow賦值:
cTryClassDlg cTryClassDlg;
cTryClassDlg.m_EditDataShow=9999;
cTryClassDlg.DoModal();
那這個(gè)時(shí)候?qū)_EditDataShow變量的初始化位置的不同,就會(huì)直接影響進(jìn)入該對(duì)話框后所見的m_EditDataShow的值和內(nèi)存中的值。
1) 如果將m_EditDataShow的初始化放在WM_INITDIALOG對(duì)應(yīng)的函數(shù)OnInitDialog()中,不管是在CDialog::OnInitDialog()函數(shù)的前面還是后面,在進(jìn)入對(duì)話框(IDD_TRYCLASSDLG)的時(shí)候,m_EditDataShow內(nèi)存中和顯示的值為0,而不是9999。
2) 如果將m_EditDataShow的初始化放在類CtryClassDlg的構(gòu)造函數(shù)CTryClassDlg::CtryClassDlg()中。
CTryClassDlg::CTryClassDlg(CWnd* pParent /*=NULL*/) : CDialog(CTryClassDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTryClassDlg)
m_EditDataShow = 0;
//}}AFX_DATA_INIT
}
那進(jìn)入對(duì)話框(IDD_TRYCLASSDLG)時(shí)的m_EditDataShow值才正常,為需要的值9999。
所以,在對(duì)類對(duì)象初始化的時(shí)候,最好是在類的構(gòu)造函數(shù)中。如果在沒有外部數(shù)據(jù)輸入的時(shí)候也可以在OnInitDialog()函數(shù)中初始化。
4 結(jié)束語(yǔ)
本文談及VC++編程中兩個(gè)問(wèn)題,一對(duì)話框類的重建問(wèn)題;一為變量初始化問(wèn)題。本文通過(guò)具體例程來(lái)說(shuō)明問(wèn)題的解決方法。在對(duì)話框類的重建問(wèn)題上注重?cái)⑹鼋鉀Q問(wèn)題的方法和步驟;在變量初始化的問(wèn)題上注重分析不同變量初始化方法所獲得的不同程序結(jié)果。
參考文獻(xiàn):
[1] 范輝,等. Visual C++6.0 程序設(shè)計(jì)簡(jiǎn)明教程[M]. 北京:高等教育出版社,2001.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文