與對話框編程_第1頁
與對話框編程_第2頁
與對話框編程_第3頁
與對話框編程_第4頁
與對話框編程_第5頁
已閱讀5頁,還剩156頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第五章MFC

與對話框編程5.1

對話框的基本原理

對話框是Windows

應(yīng)用程序GUI

界面的一個重要組成部分,它的主要功能:·接收用戶的輸入(數(shù)據(jù)和操作、控制命令);·輸出用戶關(guān)心的狀態(tài)信息(操作的結(jié)果數(shù)據(jù)和狀態(tài))。在對話框中,可以放置各種必要的控件,所有與用戶的交互操作都是通過這些控件實現(xiàn)的。在MFC中,對話框的基本屬性和行為由CDialog

類描述,該類的基類為CWnd,因此,它繼承了窗口類的所有屬性和功能,并且增加了交互操作所需要的數(shù)據(jù)交換特性。放置在對話框中的各類控件,MFC都有相應(yīng)的類來描述,所有控件類的基類都是CWnd。CDialog

類和所有控件類的派生層次結(jié)構(gòu)如下:由此我們可以看出:對話框可以視為是提供了一個能放置多個子窗口,并提供了窗口之間通訊操作的窗口框架。這種異類同構(gòu)的結(jié)構(gòu)有利于簡化構(gòu)造和便于通訊。CObjectCCmdTargetCWndCDialogCStaticCEditCComboBoxCListBoxCProgressCtrlCSliderCtrlCSpinButtonCtrl控件對話框和放置在其中的控件的創(chuàng)建,MFC

應(yīng)用程序是從兩個方面實現(xiàn)的:·對話框模板資源:描述對話框本身和各個控件的類型、外觀

屬性和控件在對話框中的分布信息。使用資源編輯器繪制模板,并將相關(guān)的信息保存在資源文件(擴展名為“.rc”)中?!υ捒蝾悾悍庋b對話框的屬性和操作功能。保存在相應(yīng)的定義和實現(xiàn)文件中。注意,與所有CWnd

及其派生類對象一樣,對話框類對象必須與對話框模板所描述的Windows

窗口相關(guān)聯(lián)后,所有施加于對話框的操作才是合法的。對話框的設(shè)計步驟一般是先設(shè)計對話框模板,然后定義與對話框模板資源相關(guān)聯(lián)的對話框類。 對話框的使用分為模態(tài)對話框和非模態(tài)對話框兩種:·模態(tài)對話框:對話框打開時,用戶只能在對話框中進行交互操作,只有對話框關(guān)閉后,才能進行其他用戶界面的操作。·非模態(tài)對話框:打開對話框進行操作的同時,仍然可以進行其他用戶界面的交互操作。5.2創(chuàng)建模態(tài)對話框創(chuàng)建一個名為“Register”SDI應(yīng)用程序,用于人員信息的注冊登記。該應(yīng)用程序項目除視圖的基類選擇CEditView

外,其他均接受缺省選擇。5.2.1創(chuàng)建對話框模板資源為項目添加一個對話框模板(缺省命名為IDD_DIALOG1)。從控件選擇面板上選擇所需要的控件,將它放置到對話框模板中你所希望的設(shè)計位置上。對話框和對話框中的每個控件都可以通過“屬性”對話框設(shè)置它們的屬性和風格。選中對話框或某個控件,點擊鼠標右鍵便會彈出一個浮動上下文菜單:選擇菜單項Properties,便彈出選中對話框或控件的屬性操作對話框:操作選擇標簽的個數(shù)和類型隨著選中的對象(對話框或不同控件)的不同而不同,但其中最右邊的兩個按鈕和第一項標簽是相同的。1

按鈕

:按下該按鈕,使按鈕變成,使得該屬性對話框保持可見(KeepVisible),直到釋放該按鈕或強制關(guān)閉對話框。屬性對話框的內(nèi)容會隨著當前選中對象的改變而變化。2按鈕:點擊該按鈕,將顯示當前選中屬性頁面相關(guān)內(nèi)容的

幫助信息。3

通用標簽:提供對話框或所有控件的通用屬性操作。對話框的主要通用屬性操作:

·ID

指定對話框的標識值,程序可使用它裝載對話框 資源和選取對話框窗口。

·Caption

指定對話框的顯示標題。

·Font…

選擇對話框中所有文本(包括控件標題)字體。

·Menu

如果需要,可為對話框選擇顯示菜單資源。

控件的通用屬性的含義如下:

·ID

指定控件的標識值,程序使用它裝載控件資源和 選取控件窗口。

·Caption

指定諸如靜態(tài)文本、組框、按鈕、復(fù)選框、單選 按鈕等控件的顯示標題。對于能發(fā)出通知消息的 控件,其標題與菜單項標題一樣,緊跟字符&

之 后的字符在運行時具有下劃線,可通過按《Alt+

下劃線字符》替代點擊該控件。

·Visible

指定控件被創(chuàng)建后是否可見。

·Disable

指定控件被創(chuàng)建后是處于允許還是被禁止使用。

·Tabstop

對話框運行時,允許用戶使用Tab

鍵順序選中具 有該屬性的控件??丶x中順序可以任意指定。

·Group

用來指定一組控件(例如單選按鈕),用戶可以 用箭頭鍵在組內(nèi)的控件之間移動選擇;在同一組 內(nèi)的單選按鈕具有互斥性,即只能選中一個單選 按鈕。如果一個控件具有Group

屬性,則這個控 件以及按Tab

順序緊隨其后的的所有控件都屬于 同一組,直到另一個有Group

屬性的控件為止。本例中對話框的具體設(shè)計步驟如下:1

修改對話框模板資源的標識為IDD_REGISTER。2

在對話框中添加控件控件類型控件標識顯示標題其他屬性組框組框靜態(tài)文本文本框復(fù)選框靜態(tài)文本文本框組框單選按鈕單選按鈕默認默認默認IDC_NAME

IDC_MARRIED

默認IDC_AGE

默認IDC_SEX默認個人情況單位情況姓名婚否性別男女默認默認默認默認默認默認默認默認Group、Tabstop默認控件類型控件標識顯示標題其他屬性組框單選按鈕單選按鈕靜態(tài)文本文本框靜態(tài)文本組合列表框靜態(tài)文本列表框按鈕按鈕

默認

IDC_WORK

IDC_WORK1默認

IDC_UINT默認

IDC_KIND默認

IDC_INCOME

IDOK

IDCANCEL

就業(yè)情況在職下崗工作單位單位性質(zhì)工資收入確定(&Y)取消(&C)

默認

Group、Tabstop默認默認默認默認下拉列表、不排序、初始化列表項。默認不排序默認默認

3設(shè)置控件的Tab

順序4測試對話框效果5.2.2

對話框類的創(chuàng)建使用ClassWizard

創(chuàng)建與對話框模板資源IDD_REGISTER

相關(guān)聯(lián)的對話框類CRegisterDialog,其基類為CDialog。5.2.3

為對話框類加入成員變量對話框的主要功能就是要完成數(shù)據(jù)信息的輸入輸出,用戶通過控件輸入的數(shù)據(jù)信息需要存放在相應(yīng)的數(shù)據(jù)對象中,才能被程序讀取使用;程序通過控件輸出的數(shù)據(jù)信息也需要先存儲到相應(yīng)數(shù)據(jù)對象中,才能被送到對應(yīng)的控件顯示。 這些數(shù)據(jù)對象相當于控件與用戶或程序之間交換數(shù)據(jù)信息的緩沖區(qū),所以在對話框類中增加與對話框模板中控件對應(yīng)的數(shù)據(jù)對象是必要的??丶鶎?yīng)的數(shù)據(jù)對象有兩類:·一類是控件所對應(yīng)的MFC

類對象(控件類對象)可以用于對控件的功能的調(diào)用;·另一類是數(shù)值類對象,用于數(shù)據(jù)信息的交換。常用控件所對應(yīng)的數(shù)值類對象如下:控件類型數(shù)值類對象類型文本框CEditCString,int,UINT,long,DWORD,float,double,short,BOOL,COleDateTime,COleCurrency(輸入輸出的不同類型內(nèi)容)

普通復(fù)選框CButtonBOOL(非零:選擇,零:不選擇)

三態(tài)復(fù)選框

CButtonint(0:未選中、1:選中、2:不確定)滾動條

CScrollBar,滑尺CSliderCtrlint(游標位置)

組中的確單選按鈕

CButtonint

(-1:無選中,0:選中組中第一按鈕,1:組中第二個…)

列表框

CListCtrlCString

(空:無列表項選中、非空:選中的列表項)

下拉式組合列表框

CComboBoxCString

(空:無列表項選中、非空:選中的列表項)或int

(-1:未選中,0:選中列表第一項,1:選中列表第二項…)為控件定義哪一類數(shù)據(jù)對象,或是兩類數(shù)據(jù)對象都定義將根據(jù)控件在對話框類中的使用情況而定。具體的添加方法:在VisualC++6.0中,使用ClassWizard

的《MemberVariables》屬性頁完成。添加方法如下:在對話框中選中要添加數(shù)據(jù)對象的控件ID,雙擊被選項或點擊<AddVariable…>按鈕,彈出“AddMemberVariable”對話框:在該對話框中可以確定你所要添加的數(shù)據(jù)對象的種類是數(shù)值類對象還是控件類對象,并為所添加數(shù)據(jù)對象命名(推薦命名規(guī)則:m_+數(shù)據(jù)對象類型縮寫+數(shù)據(jù)對象含義,例如m_nWork)。本例在CRegisterDialog

中增加的數(shù)據(jù)對象如下:控件ID數(shù)據(jù)對象類型數(shù)據(jù)對象名IDC_AGEIDC_INCOMEIDC_INCOMEIDC_KINDIDC_MARRIEDIDC_NAMEIDC_SEXIDC_UINTIDC_WORK

UINTCStringCListBoxCStringBOOLCStringintCStringint

m_nAgem_strIncomem_ctrlIncomem_strKindm_bMarriedm_strNamem_nSexm_strUnitm_nWork

在VisualC++.NET中,是通過在對話框模板中,為每個需要添加對象成員的方法實現(xiàn)的。具體的添加方法如下圖所示:5.2.4

對話框的初始化對話框初始化是在對話框類構(gòu)造函數(shù)和對話框窗口初始化成員函數(shù)OnInitDialog

中完成的?!?gòu)造函數(shù)只完成數(shù)據(jù)成員的初始化,因為此時對話框類對象正在創(chuàng)建中,而對話框窗口還未創(chuàng)建,窗口句柄無效。如果需要初始化的數(shù)據(jù)對象是通過ClassWizard

的MemberVariables

頁添加的,則構(gòu)造函數(shù)中數(shù)據(jù)對象的初始化代碼將會由

ClassWizard

自動添加(當然可以根據(jù)需要修改這些代碼)。例如:

CRegisterDialog::CRegisterDialog(CWnd*pParent

/*=NULL*/):CDialog(CRegisterDialog::IDD,pParent){

//{{AFX_DATA_INIT(CRegisterDialog)

m_nAge=0;

m_strIncome=_T("");

m_strKind=_T("");

m_bMarried=FALSE;

m_strName=_T("");

m_nSex=-1;

m_strUnit=_T("");

m_nWork=-1;

//}}AFX_DATA_INIT}·OnInitDialog

虛函數(shù)是窗口消息WM_INITDIALOG

的響應(yīng)函數(shù)。當對話框?qū)ο笫盏酱讼r,對話框窗口已創(chuàng)建完成,對話框窗口句柄已經(jīng)有效,但對話框還沒有被顯示,對話框窗口中的控件也已被創(chuàng)建。這意味著在重新定義的OnInitDialog

中可以添加一些影響對話框(包括控件)外觀的初始化和對話框構(gòu)造函數(shù)無法完成的初始化工作。OnInitDialog

對對話框的作用與OnCreate

對CMainFrame

對象的作用類似。本例中,首先使用ClassWizard

為CRegisterDialog

添加對WM_INITDIALOG

消息映射和處理函數(shù)OnInitDialog(注意,在VisualC++.NET中是通過重載基類的虛函數(shù)OnInitDialog

的方法完成的),然后手工在OnInitDialog

中加入對用于工資收入的列表框控件的初始化代碼如下:

BOOLCRegisterDialog::OnInitDialog(){

CDialog::OnInitDialog();

//TODO:Addextrainitializationhere

m_ctrlIncome.AddString("500元以下");

m_ctrlIncome.AddString("500-1000元");

m_ctrlIncome.AddString("1000-2000元");

m_ctrlIncome.AddString("2000元以上");

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}5.2.5

信息交換、驗證在對話框操作時,用戶只要通過交互方式修改對話框窗口某個控件中的數(shù)據(jù)信息,就可以修改與該控件關(guān)聯(lián)數(shù)值對象的值;反過來只要程序修改了對話框類對象中某個與控件關(guān)聯(lián)數(shù)值對象的值,也就可以修改對話框窗口中與該數(shù)值對象關(guān)聯(lián)控件中顯示的信息。對話框的這種數(shù)據(jù)交換(DDX)和數(shù)據(jù)有效驗證(DDV)能力是由MFC類CDataExchange

來實現(xiàn)的。實現(xiàn)這種信息交換操作是由虛函數(shù)CDialog::DoDataExchange完成的。派生類中該函數(shù)的重定義版本將在調(diào)用該函數(shù)的基類版本基礎(chǔ)上完成派生類對象所需要的特定的數(shù)據(jù)交換操作。所幸的是該函數(shù)的重定義工作可以借助ClassWizard

在定義與控件相關(guān)的對話框類數(shù)據(jù)對象的同時自動完成的。例如在本例中:voidCRegisterDialog::DoDataExchange(CDataExchange*pDX){

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CRegisterDialog)

DDX_Control(pDX,IDC_INCOME,m_ctrlIncome);

DDX_Text(pDX,IDC_AGE,m_nAge);

DDV_MinMaxUInt(pDX,m_nAge,0,150);

DDX_LBString(pDX,IDC_INCOME,m_strIncome);

DDX_CBString(pDX,IDC_KIND,m_strKind);

DDV_MaxChars(pDX,m_strKind,15);

DDX_Check(pDX,IDC_MARRIED,m_bMarried);

DDX_Text(pDX,IDC_NAME,m_strName);

DDV_MaxChars(pDX,m_strName,15);

DDX_Radio(pDX,IDC_SEX,m_nSex);

DDX_Text(pDX,IDC_UNIT,m_strUnit);

DDV_MaxChars(pDX,m_strUnit,30);

DDX_Radio(pDX,IDC_WORK,m_nWork);

//}}AFX_DATA_MAP}

由于對話框的數(shù)據(jù)交換是雙向的,所以參數(shù)pDX

所指向的CDataExchange

類對象含有數(shù)據(jù)的傳遞方向。實現(xiàn)數(shù)據(jù)交換不是直接調(diào)用DoDataExchange(因為無法確定數(shù)據(jù)傳遞方向),而是調(diào)用CWnd::UpdateData。UpdateData

的原型如下:BOOLUpdateData(BOOLbSaveAndValidate=TRUE);參數(shù):bSaveAndValidate=TRUE

指定數(shù)據(jù)值從控件傳遞到數(shù)據(jù)對象;bSaveAndValidate=FALSE

指定數(shù)據(jù)值從數(shù)據(jù)對象傳遞到控件。該函數(shù)調(diào)用了DoDataExchange,顯然,參數(shù)bSaveAndValidate

確定了DoDataExchange

的數(shù)據(jù)傳遞方向。5.2.6

對話框的運行在程序中運行模態(tài)對話框的步驟:⑴在棧上構(gòu)建一個局部對話框類對象。⑵調(diào)用CDialog::DoModal()

DoModal

負責模態(tài)對話框的創(chuàng)建→啟動一個消息循環(huán)→撤消對話框(接收到<OK>按鈕或<Cancel>按鈕控件發(fā)出的消息)。顯然,在DoModal

函數(shù)返回之前,不可能進行其他界面上的操作的。該函數(shù)是一個虛函數(shù),意味著可以根據(jù)需要在CDialog

的派生類中定義特定功能的DoModal

,但大多數(shù)情況下無須重新定義。①對話框創(chuàng)建時,程序框架會自動調(diào)用OnInitDialog

初始化對話框,并調(diào)用UpdateData(FALSE)

初始化控件的顯示。②對話框撤消時,分為兩種情況:

·按<OK>

按鈕,消息處理成員函數(shù)OnOk

被調(diào)用。在該函數(shù) 的執(zhí)行中,首先調(diào)用UpdateData(TRUE

)將控件中的數(shù)據(jù)傳 遞到相應(yīng)數(shù)據(jù)對象中保存起來,然后調(diào)用EndDialog

關(guān)閉對 話框,并返回標志值IDOK。

·按<Cancel>按鈕,消息處理成員函數(shù)OnCancel

被調(diào)用,在 該函數(shù)的執(zhí)行中,只調(diào)用EndDialog

關(guān)閉對話框,并返回標 志值IDCANCEL。

根據(jù)DoModal

返回的標志值,程序就可以知道對話框是如何

結(jié)束的(按<OK>或<Cancel>按鈕),從而確定后續(xù)操作。

在本例中,為了模態(tài)使用對話框,添加了一條菜單命令來觸發(fā)對話框類對象的創(chuàng)建,對話框的模態(tài)創(chuàng)建、顯示、操作和根據(jù)對話框結(jié)束狀態(tài)的后續(xù)操作。1

在菜單資源中的Edit

彈出式菜單中添加菜單項“登錄數(shù)據(jù)”,其標識為ID_EDIT_REGISTER。2

使用ClassWizard

為菜單項“登錄數(shù)據(jù)”在視圖類CRegisterView

中定義命令消息映射項和處理函數(shù)OnEditRegister。3

定義函數(shù)OnEditRegister

實現(xiàn)代碼:voidCRegisterView::OnEditRegister(){//TODO:Addyourcommandhandlercodehere

CRegisterDialog

dlg;

if(dlg.DoModal()==IDOK){

CString

str;

GetWindowText(str); //獲取視圖窗口原有文本內(nèi)容

str+="\r\n";

str+="姓名:";str+=dlg.m_strName;str+="\r\n";

str+="性別:";str+=dlg.m_nSex?"女":"男";str+="\r\n";

str+="年齡:";

CStringstr1;str1.Format("%d",dlg.m_nAge);

str+=str1;str+="\r\n";

str+="婚否:";str+=dlg.m_bMarried?"已婚":"未婚";str+="\r\n";

str+="就業(yè)情況:";str+=dlg.m_nWork?"下崗":"在職";str+="\r\n";

str+="工作單位:";str+=dlg.m_strUnit;str+="\r\n";

str+="單位性質(zhì):";str+=dlg.m_strKind;str+="\r\n";

str+="工資收入:";str+=dlg.m_strIncome;str+="\r\n";

SetWindowText(str); //在視圖窗口中顯示新文本

}}4在CRegisterView

的實現(xiàn)文件中加入:

#include“RegisterDialog.h”5

編譯運行5.2.7程序的改進在程序的運行中發(fā)現(xiàn)存在這樣的缺點:當在“就業(yè)情況”組框中選擇了單選按鈕“下崗”,而“單位情況”組框中的所有控件仍然有效,顯然這是不合理的,會引起登錄數(shù)據(jù)的錯誤。為了克服這一缺點,應(yīng)該當在“就業(yè)情況”組框中選擇了單選按鈕時,程序能夠響應(yīng)對應(yīng)的控件消息,在消息處理函數(shù)中根據(jù)所選按鈕的不同,使“單位情況”組框中的相關(guān)控件允許或禁止。雖然組框中的單選按鈕是兩個,而它們的消息處理函數(shù)只需要一個,因此應(yīng)該使用ON_CONTROL_RANGE

消息映射宏進行消息映射。不幸的是ClassWizard

不支持ON_CONTROL_RANGE,所以我們必須按下列步驟手工創(chuàng)建單選按鈕的消息映射和消息處理函數(shù)。1在CRegisterDialog

的定義文件中定義消息處理函數(shù)原型:

classCRegisterDialog:publicCDialog{ … //Implementationprotected:

//Generatedmessagemapfunctions //{{AFX_MSG(CRegisterDialog) virtualBOOLOnInitDialog();

//}}AFX_MSG

afx_msgvoidOnWorkClicked(UINT

nCmdID); DECLARE_MESSAGE_MAP()};2在CRegisterDialog

實現(xiàn)文件的消息映射表中加入映射條目:

BEGIN_MESSAGE_MAP(CRegisterDialog,CDialog)

//{{AFX_MSG_MAP(CRegisterDialog)

//}}AFX_MSG_MAP

ON_CONTROL_RANGE(BN_CLICKED,IDC_WORK,

IDC_WORK1,OnWorkClicked)

END_MESSAGE_MAP()3在CRegisterDialog

實現(xiàn)文件中添加消息響應(yīng)函數(shù)實現(xiàn)代碼:

voidCRegisterDialog::OnWorkClicked(UINT

nCmdID){

if(IsDlgButtonChecked(IDC_WORK))//選中“在職”單選按鈕否?

{

//使“單位情況”組框中的相關(guān)控件有效

GetDlgItem(IDC_UNIT)->EnableWindow(TRUE);

GetDlgItem(IDC_KIND)->EnableWindow(TRUE);

m_ctrlIncome.EnableWindow(TRUE); }

else {//清除文本框內(nèi)容,并使之禁止

GetDlgItem(IDC_UNIT)->SetWindowText("");

GetDlgItem(IDC_UNIT)->EnableWindow(FALSE);

//使組合框處于未選擇狀態(tài),并使之禁止

CComboBox*pComboBox= (CComboBox*)GetDlgItem(IDC_KIND);

pComboBox->SetCurSel(-1);

pComboBox->EnableWindow(FALSE);

//使列表框為未選和禁止狀態(tài)

m_ctrlIncome.SetCurSel(-1);

m_ctrlIncome.EnableWindow(FALSE); }}在對話框中獲取控件對象并對其控制操作有兩種方法:⑴直接使用與控件關(guān)聯(lián)的控件對象,本例中對“工資收入”列表框控件的操作是通過與CListBox

對象m_ctrlIncome

進行的。⑵利用CWnd

類的一組操作對話框控件的成員函數(shù),本例中對于“工作單位”文本框和“單位性質(zhì)”組合框控件的操作就是調(diào)用CWnd::GetDlgItem(int

nID)返回指向標識值為nID

的控件對象的指針,調(diào)用代碼如下:

CEdit*pUnit=(CEdit*)GetDlgItem(IDC_UNIT);

CComboBox*pKind=(CComboBox*)GetDlgItem(IDC_KIND);

從而借助該指針對相應(yīng)的控件進行操作。4

編譯運行(應(yīng)用程序項目“Register1”)5.3非模態(tài)對話框5.3.1非模態(tài)對話框的特點

非模態(tài)對話框的設(shè)計與模態(tài)對話框基本類似,也是由對話框模板資源設(shè)計和對話框類設(shè)計兩部分組成。但在對話框的創(chuàng)建和刪除過程中,兩類對話框存在下列差異:1對話框模板的Visible

屬性不同·非模態(tài)對話框模板應(yīng)該具有Visible

屬性,否則對話框創(chuàng)建時將不能自動可見。當然,如果對話框模板沒有設(shè)置Visible

屬性,可以在對話框創(chuàng)建后調(diào)用CWnd::ShowWindow(SW_SHOW)

顯示對話框?!つB(tài)對話框則不必設(shè)置Visible

屬性,因為DoModal

函數(shù)隱含解決了對話框的可見性。2

創(chuàng)建空間不同·非模態(tài)對話框類對象是使用new

操作符在堆中動態(tài)創(chuàng)建的,并在該對話框?qū)ο蟮乃鶎兕愔性黾釉搶υ捒蝾愔羔槪糜谥赶騽討B(tài)創(chuàng)建的對話框類對象。·模態(tài)對話框一般是以局部對象的形式構(gòu)建在堆棧上。3

窗口創(chuàng)建函數(shù)不同·非模態(tài)對話框的創(chuàng)建是調(diào)用CDialog::Create

函數(shù)創(chuàng)建的,該函數(shù)不啟動新的消息循環(huán),因此,所創(chuàng)建的對話框與應(yīng)用程序使用同一個消息循環(huán)?!つB(tài)對話框調(diào)用CDialog::DoModal

完成對話框窗口的創(chuàng)建、啟動消息循環(huán)和撤消。4

窗口刪除函數(shù)不同·非模態(tài)對話框類必須編寫自己的OnOK

和OnCancel

函數(shù),以

便在函數(shù)中調(diào)用CWnd::DestroyWindow

關(guān)閉對話框。·模態(tài)對話框通過默認的CDialog::OnOK

和CDialog::OnCancel

調(diào)用CDialog::EndDialog

關(guān)閉對話框。注意,DoModal、OnOk

和OnCancel

都是虛函數(shù),這意味著如果需要,可以在派生類

中重新定義這些函數(shù)的特定版本,完成特定的附加工作。5

清理對話框?qū)ο蟮姆绞讲煌し悄B(tài)對話框?qū)ο髴?yīng)在不再使用時,使用delete

操作符刪除在堆中動態(tài)創(chuàng)建的對話框?qū)ο?。由于一個窗口被刪除后,框架會自動調(diào)用虛函數(shù)CWnd::PostNcDestroy,因此可以在該函數(shù)的重定義版本中使用delete

刪除窗口的關(guān)聯(lián)對話框?qū)ο??!つB(tài)對話框類對象是局部的,因此不需要顯式刪除。6

非模態(tài)對話框不能“重入”·非模態(tài)對話框必須通過對指向?qū)υ捒驅(qū)ο蟮闹羔樀臋z查,來

判別對話框?qū)ο笫欠褚呀?jīng)創(chuàng)建,如果未創(chuàng)建,則創(chuàng)建對話框?qū)ο螅环駝t只需激活已經(jīng)創(chuàng)建的對話框,而不要重新創(chuàng)建。·模態(tài)對話框是局部對象,每次調(diào)用都重新在棧上構(gòu)建。根據(jù)上述兩種對話框的不同,修改“Register1”應(yīng)用程序,將數(shù)據(jù)登錄對話框改為無模式對話框,項目名為“Register2”。修改步驟如下:⑴修改對話框模板的Visible

屬性有效,并將<OK>

和<Cancel>

按鈕的顯示標題改為<提交>和<退出>。⑵在CRegisterView

類定義中加入數(shù)據(jù)登錄對話框類指針:

…public:

CRegisterDialog*m_pRegisterDlg;

注意將CRegisterDialog

類的頭文件包含在CRegisterView

類的定義文件中,或在定義對話框指針之前加入超前聲明:

classCRegisterDialog;⑶在CRegisterDialog

類中增加CWnd

類型的指針數(shù)據(jù)成員,用于保存其父窗口對象的指針(以便與父窗口進行聯(lián)系),并在構(gòu)造函數(shù)中對該指針進行設(shè)置。

…protected:

CWnd*m_pParent;…

CRegisterDialog::CRegisterDialog(CWnd*pParent/*=NULL*/):CDialog(CRegisterDialog::IDD,pParent){…

//}}AFX_DATA_INIT

m_pParent=pParent;}⑷修改CRegisterView

類構(gòu)造函數(shù)和消息處理函數(shù):

CRegisterView::CRegisterView(){//TODO:addconstructioncodehere

m_pRegisterDlg=NULL;}voidCRegisterView::OnEditRegister(){//TODO:Addyourcommandhandlercodehere

if(m_pRegisterDlg) //判斷對話框已創(chuàng)建否?

m_pRegisterDlg->SetActiveWindow();//激活已創(chuàng)建的對話框

else{

m_pRegisterDlg

=newCRegisterDialog(this);//創(chuàng)建對話框?qū)ο?/p>

m_pRegisterDlg->Create(IDD_REGISTER,this);//創(chuàng)建窗口

}}⑸使用ClassWizard

為CRegisterDialog

類添加OnCancel、OnOK

消息響應(yīng)函數(shù)和重載虛函數(shù)PostNcDestroy,并為這兩個函數(shù)編寫定義代碼:

voidCRegisterDialog::OnCancel(){

//TODO:Addextracleanuphere

m_pParent->SendMessage(WM_DIALOG_DESTROY,0,0);

//向父窗口發(fā)出關(guān)閉對話框消息

DestroyWindow(); //關(guān)閉對話框窗口

}

voidCRegisterDialog::OnOK(){

//TODO:Addextravalidationhere

CString

str;

UpdateData();

m_pParent->GetWindowText(str);//獲取父窗口中的顯示文本

//在原來文本的基礎(chǔ)上添加新文本

str+="\r\n";

str+="姓名:";str+=m_strName;str+="\r\n";

str+="性別:";str+=m_nSex?"女":"男";str+="\r\n";

str+="年齡:";

CStringstr1;

str1.Format("%d",m_nAge);

str+=str1;str+="\r\n";

str+="婚否:";str+=m_bMarried

?"已婚":"未婚";str+="\r\n";

str+="就業(yè)情況:";str+=m_nWork

?"下崗":"在職";str+="\r\n";

str+="工作單位:";str+=m_strUnit;str+="\r\n";

str+="單位性質(zhì):";str+=m_strKind;str+="\r\n";

str+="工資收入:";str+=m_strIncome;str+="\r\n";

m_pParent->SetWindowText(str);//在父窗口中顯示添加后的文本

}voidCRegisterDialog::PostNcDestroy(){//TODO:Addyourspecializedcodehereand/orcallthebaseclass

deletethis; //刪除對話框類對象

CDialog::PostNcDestroy();}⑹

對話框關(guān)閉時要求其父窗口類對象能及時將指向?qū)υ捒虻闹羔樤O(shè)置為NULL。實現(xiàn)方法和步驟如下:

·在CRegisterDialog

的定義文件中增加用戶自定義消息:

constWM_DIALOG_DESTROY=WM_USER+100;·在CRegisterView

定義中增加消息處理函數(shù)聲明:

afx_msgLRESULTOnDialogDestroy(WPARAM,LPARAM);·在CRegisterView

實現(xiàn)文件中添加消息響應(yīng)函數(shù)定義代碼:

LRESULTCRegisterView::OnDialogDestroy(WPARAMwParam, LPARAMlParam)

{

m_pRegisterDlg=NULL; return1;

}⑺編譯運行5.3.2關(guān)于窗口對象的自動清除1MFC窗口類對象的組成一個MFC

窗口由兩部分組成:

·描述窗口屬性和功能的C++類——窗口類(CWnd

或CWnd

的派生類)。

·

Windows窗口,該窗口的句柄作為一個數(shù)據(jù)成員m_hWnd

被封裝在窗口類中。2MFC

窗口類對象的創(chuàng)建

·首先創(chuàng)建窗口的窗口類對象;

·然后調(diào)用窗口類的創(chuàng)建函數(shù)(例如CWnd::Create)創(chuàng)建由 參數(shù)確定的Windows窗口,并使之與窗口類對象相關(guān)聯(lián); 或調(diào)用Windows窗口關(guān)聯(lián)函數(shù)(例如CWnd::Attach)使窗口 類對象與一個已經(jīng)存在的Windows

窗口相關(guān)聯(lián)。3MFC

窗口類的刪除⑴先調(diào)用CWnd::DestroyWindow

撤消Windows

窗口,并使窗口類

對象的Windows

窗口句柄屬性m_hWnd=NULL(表示窗口已經(jīng)無效)。一般情況下,該函數(shù)不需要直接調(diào)用,而是由應(yīng)用程序框架自動調(diào)用,例如:關(guān)閉窗口的WM_CLOSE

消息、對話框的<OK>

或<Cancel>按鈕發(fā)出的消息都會導(dǎo)致該函數(shù)被調(diào)用。如果DestroyWindow

所撤消的窗口擁有子窗口,則先刪除所有的子窗口,然后刪除父窗口。⑵然后刪除窗口的窗口類對象。刪除窗口類對象分兩種情況:

·構(gòu)建在堆棧上的窗口窗口類對象:該窗口類對象是作為某個類的數(shù)據(jù)成員或函數(shù)中的局部變量。它們的生存期總是有限的,隨著擁有窗口類對象的撤消或函數(shù)的返回,被自動被刪除,所以不必關(guān)心這類窗口類對象的刪除。

·創(chuàng)建在堆上的窗口類對象:該窗口類對象是使用運算符new創(chuàng)建的,其生存期是任意的,因此,在關(guān)閉Windows

窗口后必須使用運算符delete從堆中刪除窗口類對象,否 則不會被自動清除。4自動清除功能自動清除功能是指在Windows窗口被刪除時,自動刪除窗口

類對象。這是因為當CWnd::DestroyWindow

被調(diào)用撤消一個

Windows窗口時,與該窗口關(guān)聯(lián)的窗口類對象的成員函數(shù)

PostNcDestroy

被調(diào)用。該函數(shù)是一個虛函數(shù),MFC所提供的有些CWnd

的派生類重定義了該函數(shù),在新版本函數(shù)中通過代碼deletethis

來刪除與被撤消窗口關(guān)聯(lián)的窗口類對象本身,因此不需要顯式使用delete

刪除窗口類對象,即自動清除功能。具有自動清除功能的MFC

窗口類有:

·主框架窗口類(基類為CFrameWnd

·視圖類(基類為CView)這些窗口類的對象在應(yīng)用程序中一般都是動態(tài)在堆中創(chuàng)建

的。而對于其他MFC

窗口類的使用,由于大多數(shù)情況下是在

堆棧中創(chuàng)建的。所以MFC

沒有為這些類提供自動清除功能。這些窗口類包括:

·所有標準的Windows

控件類

·從CWnd

直接派生的自定義窗口類(如用戶定制的控件)

·切分窗口類CSplitterWnd·默認的控制欄類(如工具欄和狀態(tài)欄)

·對話框類(從CDialog

派生)由此可見,要不要為自己的派生窗口類添加自動清除功能,取決于所派生的窗口類的創(chuàng)建方法,例如,我們前面的非模式對話框的實例中,由于對話框是在堆中創(chuàng)建的,要求其生存期任意,所以需要為它添加了自動清除功能。否則我們必須在對話框窗口被刪除后,在對話框類對象的擁有者(父窗口類對象)中的適當位置(如析構(gòu)函數(shù)中),調(diào)用delete

顯式刪除對話框類對象。5.4

創(chuàng)建屬性表對話框

屬性表是一種包含了多個對話框的對話框框架,這些包含在屬性表中的對話框通常被稱為屬性頁(Page)。每次只有一個屬性頁是可見的,在屬性表的頂端有一行標簽(tab)用于指示屬性表中不同的屬性頁,用戶通過單擊這些標簽可以切換到不同的屬性頁。使用屬性表可以按操作功能將控件分類放在不同的屬性頁中,便于組織和構(gòu)造需要大量控件的復(fù)雜對話框,也使得對話框的使用界面更加友好。5.4.1屬性表對話框的創(chuàng)建

屬性表是由多個屬性頁和一個能放置這些屬性頁,并且將這些屬性頁關(guān)聯(lián)起來的對話框框架組成的,就像是一個夾有多頁文件的文件夾。為了支持屬性表,MFC

提供了兩個類:·CPropertySheet

: 用于創(chuàng)建屬性表框架和提供相應(yīng)的屬性和

操作。它的直接基類是CWnd,使該類在窗口的屬性和功能的基礎(chǔ)上增加了對屬性頁的創(chuàng)建、激活、切換、數(shù)據(jù)交換、撤消等功能?!PropertyPage

:用于創(chuàng)建屬性表的屬性頁和提供相應(yīng)的屬性

和操作。它的直接基類是CDialog,使該類在對話框的屬性和功能的基礎(chǔ)上增加了對屬性表框架各項管理的響應(yīng)操作。與普通對話框相比,屬性表的設(shè)計和實現(xiàn)既有許多相似之處,又有一些不同。創(chuàng)建一個屬性表一般包括以下幾個步驟:1

創(chuàng)建屬性頁(對話框)資源創(chuàng)建所有屬性頁的資源,每個屬性頁的資源都是一個對話框模板。與創(chuàng)建普通對話框模板相比應(yīng)注意以下幾點:

·一般需要刪除缺省的<OK>

和<Cancel>

按鈕;

·每頁的模板尺寸最好相同,如果不同,則在屬性表創(chuàng)建時,系統(tǒng)會按最大的模板尺寸統(tǒng)一創(chuàng)建所有頁的尺寸;

·指定標題(Caption)的內(nèi)容將成為屬性表中相應(yīng)屬性頁的指示標簽內(nèi)容;

·屬性頁模板屬性設(shè)定為TitleBar、Child、ThinBoder

和Disable

。2

生成屬性頁類使用ClassWizard

為每個屬性頁模板定義相應(yīng)的屬性頁類,基類必須選擇CPropertyPage。3

在屬性頁類中為屬性頁中的控件添加關(guān)聯(lián)的數(shù)據(jù)對象與普通對話框一樣,使用ClassWizard

的《MemberVariables》

屬性頁為每個屬性頁模板中的控件在相應(yīng)的屬性頁類中添加所需要的數(shù)據(jù)對象。4

創(chuàng)建屬性表創(chuàng)建屬性表的方法兩種:⑴直接使用CPropertySheet

類創(chuàng)建在需要使用屬性表的碼段中加入相應(yīng)的創(chuàng)建代碼。例如:

voidCMyView::DoModalPropertySheet(){

CPropertySheet

propsheet; //創(chuàng)建屬性表框架

CMyFirstPage

pageFirst; //創(chuàng)建第一屬性頁

CMySecondPage

pageSecond; //創(chuàng)建第二屬性頁

pageFirst.m_nMember1=m_nMember1;//初始化第一屬性頁

pageFirst.m_nMember2=m_nMember2;//初始化第一屬性頁

pageSecond.m_nMember3=m_nMember3;//初始化第二屬性頁

pageSecond.m_nmember4=m_nMember4;//初始化第二屬性頁

propsheet.AddPage(&pageFirst); //在屬性表中添加第一屬性頁

propsheet.AddPage(&pageSecond);

//在屬性表中添加第二屬性頁

if(propsheet.DoModal()==IDOK) //模態(tài)運行屬性頁對話框

{ m_nMember1=pageFirst.m_nMember1; m_nMember2=pageFirst.m_nMember2; m_nMember3=pageSecond.m_nMember3; m_nMember4=pageSecond.m_nMember4; } …}⑵使用CPropertySheet

類的派生類創(chuàng)建一般步驟如下:

·使用ClassWizard

定義一個CPropertySheet

類的派生類;

·將所有屬性頁類對象以數(shù)據(jù)成員的形式加入到此派生類的定義中;

·在此派生類構(gòu)造函數(shù)中調(diào)用CPropertySheet::AddPage

函數(shù) 將各個屬性頁添加到屬性表中,使得在屬性表對象的創(chuàng)建

操作自動包含了屬性頁的添加操作。

·在需要使用屬性表的地方,使用此派生的屬性表類創(chuàng)建特定的屬性表。5.4.2屬性表的運行機制1屬性表初始化包括屬性表框架的初始化和屬性頁的初始化。如果需要進行自定義初始化操作,屬性表框架初始化應(yīng)在重定義的虛函數(shù)CPropertySheet::OnCreate

中完成;而屬性頁初始化應(yīng)在重定義的虛函數(shù)CPropertyPage::OnInitDialog

中完成。2屬性表的使用者一般調(diào)用CPropertySheet::DoModal

,按模態(tài)運行方式創(chuàng)建屬性表,并可通過判斷DoModal

的返回值(IDOK

或IDCANCEL),確定關(guān)閉屬性表的操作方式是“確認”還是“放棄”,從而確定后續(xù)操作。3模態(tài)運行的屬性表會自動在屬性表的底部提供三個按鈕,依次為<OK>或<確認>、<Cancel>或<取消>和<Apply>或

<應(yīng)用>按鈕(非模態(tài)運行的屬性表不提供這些按鈕)。其中:

·<OK>或<確認>按鈕的作用是確認當前屬性頁的操作,并

關(guān)閉整個屬性表。

·<Cancel>或<取消>按鈕的作用是放棄當前屬性頁的操 作,關(guān)閉整個屬性表。

·通過標簽的屬性頁切換操作將確認被切換屬性頁的操作。

·<Apply>或<應(yīng)用>按鈕的作用是確認當前屬性頁操作,并 使屬性表的所有操作生效,但不關(guān)閉該屬性表。對這三個按鈕作出處理的響應(yīng)函數(shù)可由CPropertyPage

類提供的消息響應(yīng)函數(shù)OnOK、OnCancel

和OnApply

(OnApply

會自動調(diào)用OnOK)完成。因此,我們可以在屬性頁派生類中重定義這三個消息響應(yīng)函數(shù)完成所需要的特定操作。應(yīng)當指出:對屬性頁的這三個消息響應(yīng)函數(shù)的調(diào)用并非直接響應(yīng)屬性表的三個按鈕的通知消息BN_CLICKED

的結(jié)果,而是通過CPropertySheet

類或派生類對這三個按鈕的消息響應(yīng)函數(shù),間接調(diào)用上述CPropertyPage

的三個消息響應(yīng)函數(shù)完成的。例如,定義響應(yīng)<Apply>按鈕的通知消息,完成特定的處理可以有兩種方法:

⑴使用ClassWizard

為屬性表中任意一個屬性頁類重定義虛函數(shù)OnApply,在該函數(shù)中定義要實現(xiàn)的特定功能代碼。一般情況下所定義的功能將對整個屬性表起作用,所以只須在一個屬性頁中重定義OnApply

即可,不必為每個屬性頁都重定義OnApply。⑵在CPropertySheet

的派生類中添加<Apply>按鈕的通知消 息BN_CLICKED的消息映射和響應(yīng)函數(shù),在該函數(shù)中定義 想要實現(xiàn)的操作。注意,系統(tǒng)為<Apply>按鈕定義的標識 為ID_APLLY_NOW,但在VC6.0

中ClassWizard

無法識別該 標識,因此上述添加操作只能手工完成。4CPropertyPage

類中幾個與運行機制相關(guān)的重要成員函數(shù):

voidSetModified(BOOLbChanged=TRUE);

該函數(shù)用于設(shè)置屬性頁的修改標志。參數(shù)bChange

為TRUE

表明屬性頁的屬性已修改,否則表示未修改。調(diào)用該函數(shù)的主要功能是“允許”或“禁止”

<Apply>按鈕:

·只要在一個屬性頁中調(diào)用了SetModified(),就會使<Apply>

按鈕的狀態(tài)變?yōu)椤霸试S”;

·必須在所有的屬性頁中調(diào)用SetModified(FALSE),才能使

<Apply>

按鈕的狀態(tài)變?yōu)椤敖埂薄?/p>

virtualBOOLOnSetActive();

當屬性頁被激活或被創(chuàng)建時,該函數(shù)將被程序框架調(diào)用。該函數(shù)的缺省操作是:

BEGIN

if(屬性頁創(chuàng)建否?) then激活已創(chuàng)建的屬性頁

else創(chuàng)建屬性頁

endif

調(diào)用

UpdateData(FALSE)刷新屬性頁內(nèi)的控件。

END

可以重定義該虛函數(shù)完成一些所需要的工作,但執(zhí)行這些特定操作之前必須首先調(diào)用CPropertyPage::OnSetActive

。

virtualBOOLOnKillActive();

當切換屬性頁時,被切換的屬性頁會調(diào)用該函數(shù)。該函數(shù)的

缺省操作是調(diào)用UpdateData(TRUE)保存數(shù)據(jù)??梢灾囟x該虛函數(shù)完成一些特定數(shù)據(jù)的有效檢查和操作。該函數(shù)的成功返回將導(dǎo)致程序框架調(diào)用OnOK

函數(shù)。注意:

·在屬性表的一次調(diào)用中,表中的屬性頁并不一定都被創(chuàng)建過。那些從未打開過的屬性頁就不會被創(chuàng)建。

·只有確定屬性頁已經(jīng)存在,才能調(diào)用與屬性頁和控件相關(guān)的函數(shù)。如果收到了控件通知消息或OnSetActive

函數(shù)被調(diào)用,則表明屬性頁已經(jīng)創(chuàng)建。

·屬性頁之間的數(shù)據(jù)交換只能在OnSetActive

和OnKillActive

函數(shù)中進行。5.4.3屬性表的具體實例創(chuàng)建一個屬性表應(yīng)用程序項目“Register3”

,在該項目中將“Register”

應(yīng)用程序?qū)υ捒蛑械膬山M控件“個人情況”和“單位情況”分解為屬性表的兩個屬性頁。創(chuàng)建屬性表步驟如下:1

創(chuàng)建第一個屬性頁⑴創(chuàng)建屬性頁資源

·生成新對話框模板IDD_PERSONAL;

·去掉缺省的<OK>和<Cancel>

按鈕;

·確定模板標題為“個人信息”作為該屬性頁的“標簽”;

·設(shè)置模板屬性:TitleBar、Child、ThinBoder

和Disable;

·添加所需要的控件:本例可以復(fù)制前例中對話框模板中的 相應(yīng)的控件??丶愋涂丶俗R顯示標題其他屬性靜態(tài)文本缺省姓名缺省文本框IDC_NAME缺省復(fù)選框IDC_MARRIED婚否缺省靜態(tài)文本缺省年齡缺省文本框IDC_AGE缺省組框缺省性別缺省單選按鈕IDC_SEX男Group、Tabstop單選按鈕IDC_SEX1女缺省組框缺省就業(yè)情況缺省單選按鈕IDC_WORK在職Group、Tabstop單選按鈕IDC_WORK1下崗缺省⑵定義屬性頁類CPersonalPage·使用ClassWizard

為IDD_PERSONAL

定義CPropertyPage

派生類CPersonalPage。

·使用ClassWizard

,為各控件添加對應(yīng)的數(shù)據(jù)對象:控件ID數(shù)據(jù)對象類型數(shù)據(jù)對象名IDC_AGEIDC_MARRIEDIDC_NAMEIDC_SEXIDC_WORK

UINTBOOLCStringintint

m_nAgem_bMarriedm_strNamem_nSexm_nWork

·手工添加消息映射和處理函數(shù):①在類定義文件中加入消息響應(yīng)函數(shù)聲明:

afx_msgvoidOnChangeProperties();

//處理相應(yīng)控件的BN_CLICKED消息

afx_msgvoidOnChangeProperties1();

//處理相應(yīng)控件的EN_CHANGE消息②在類實現(xiàn)文件的消息映射表中加入:

ON_CONTROL_RANGE(BN_CLICKED,IDC_MARRIED, IDC_WORK1,OnChangeProperties

)

ON_CONTROL_RANGE(EN_CHANGE,IDC_NAME, IDC_AGE,OnChangeProperties1)③在類實現(xiàn)文件中加入消息響應(yīng)函數(shù)的定義代碼:

voidCPersonalPage::OnChangeProperties()

{

SetModified(TRUE); //使能Apply按鈕

UpdateData(TRUE); //確認數(shù)據(jù)設(shè)置

}

voidCPersonalPage::OnChangeProperties1()

{

SetModified(TRUE); //使能Apply按鈕

UpdateData(TRUE); //確認數(shù)據(jù)設(shè)置

}2

創(chuàng)建第二個屬性頁⑴創(chuàng)建屬性頁資源

·生成新對話框模板IDD_UNIT;

·去掉缺省的<OK>

和<Cancel>

按鈕;

·確定模板標題為“單位信息”作為該屬性頁的“標簽”;

·設(shè)置模板屬性:TitleBar、Child、ThinBoder

和Disable;

·添加所需要的控件:本例可以復(fù)制前例中對話框模板中的 相應(yīng)控件??丶愋涂丶俗R顯示標題其他屬性靜態(tài)文本缺省工作單位缺省文本框IDC_UINT缺省靜態(tài)文本缺省單位類型缺省組合列表框IDC_KIND下拉列表、不排序、初始化列表項。靜態(tài)文本缺省工資收入缺省列表框IDC_INCOME不排序⑵定義屬性頁類CUnitPage·使用ClassWizard

為IDD_UNIT創(chuàng)建CPropertyPage

的派生類

CUnitPage。

·使用ClassWizard

在類定義中,為各控件添加對應(yīng)的數(shù)據(jù)對象:控件ID數(shù)據(jù)對象類型數(shù)據(jù)對象名IDC_INCOMEIDC_INCOMEIDC_KINDIDC_UINTCStringCListBoxCStringCStringm_strIncomem_ctrlIncomem_strKindm_strUnit

·使用ClassWizard

添加消息映射和處理函數(shù):①在類定義文件中加入消息響應(yīng)函數(shù)聲明:

afx_msgvoidOnChangeUnit();

afx_msgvoidOnSelchangeIncome();

afx_msgvoidOnEditchangeKind();

afx_msgvoidOnSelchangeKind(); ②在類實現(xiàn)文件的消息映射表中加入:

ON_EN_CHANGE(IDC_UNIT,OnChangeUnit)

ON_LBN_SELCHANGE(IDC_INCOME,OnSelchangeIncome)

ON_CBN_EDITCHANGE(IDC_KIND,OnEditchangeKind)

ON_CBN_SELCHANGE(IDC_KIND,OnSelchangeKind) ③在類實現(xiàn)文件中加入處理函數(shù)的定義代碼:

voidCUnitPage::OnChangeUnit() {

SetModified(TRUE);

UpdateData(TRUE); } voidCUnitPage::OnSelchangeIncome() {

SetModified(TRUE);

UpdateData(TRUE); }

voidCUnitPage::OnEditchangeKind() {

SetModified(TRUE);

Upd

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論