與對(duì)話框編程教學(xué).ppt_第1頁(yè)
與對(duì)話框編程教學(xué).ppt_第2頁(yè)
與對(duì)話框編程教學(xué).ppt_第3頁(yè)
與對(duì)話框編程教學(xué).ppt_第4頁(yè)
與對(duì)話框編程教學(xué).ppt_第5頁(yè)
已閱讀5頁(yè),還剩156頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五章 MFC 與對(duì)話框編程,5.1 對(duì)話框的基本原理 對(duì)話框是 Windows 應(yīng)用程序 GUI 界面的一個(gè)重要組成部分, 它的主要功能: 接收用戶的輸入(數(shù)據(jù)和操作、控制命令); 輸出用戶關(guān)心的狀態(tài)信息(操作的結(jié)果數(shù)據(jù)和狀態(tài))。 在對(duì)話框中,可以放置各種必要的控件,所有與用戶的交互 操作都是通過(guò)這些控件實(shí)現(xiàn)的。 在 MFC 中,對(duì)話框的基本屬性和行為由 CDialog 類描述,該 類的基類為 CWnd,因此,它繼承了窗口類的所有屬性和功能, 并且增加了交互操作所需要的數(shù)據(jù)交換特性。放置在對(duì)話框中 的各類控件,MFC 都有相應(yīng)的類來(lái)描述,所有控件類的基類都 是 CWnd。 CDialog 類

2、和所有控件類的派生層次結(jié)構(gòu)如下,由此我們可以看出:對(duì)話框可以視為是提供了一個(gè)能放置多 個(gè)子窗口,并提供了窗口之間通訊操作的窗口框架。這種異類 同構(gòu)的結(jié)構(gòu)有利于簡(jiǎn)化構(gòu)造和便于通訊,CObject,對(duì)話框和放置在其中的控件的創(chuàng)建,MFC 應(yīng)用程序是從兩個(gè) 方面實(shí)現(xiàn)的: 對(duì)話框模板資源:描述對(duì)話框本身和各個(gè)控件的類型、外觀 屬性和控件在對(duì)話框中的分布信息。使用資源編輯器繪制模 板,并將相關(guān)的信息保存在資源文件(擴(kuò)展名為“.rc”)中。 對(duì)話框類:封裝對(duì)話框的屬性和操作功能。保存在相應(yīng)的定 義和實(shí)現(xiàn)文件中。 注意,與所有 CWnd 及其派生類對(duì)象一樣,對(duì)話框類對(duì)象必須 與對(duì)話框模板所描述的 Windo

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

4、個(gè)對(duì)話框模板(缺省命名為 IDD_DIALOG1)。 從控件選擇面板上選擇所需要的控件,將它放置到對(duì)話框模板 中你所希望的設(shè)計(jì)位置上。 對(duì)話框和對(duì)話框中的每個(gè)控件都可以通過(guò)“屬性”對(duì)話框設(shè)置 它們的屬性和風(fēng)格。選中對(duì)話框或某個(gè)控件,點(diǎn)擊鼠標(biāo)右鍵便 會(huì)彈出一個(gè)浮動(dòng)上下文菜單,選擇菜單項(xiàng) Properties,便彈出選中對(duì)話框或控件的屬性操作對(duì) 話框,操作選擇標(biāo)簽的個(gè)數(shù)和類型隨著選中的對(duì)象(對(duì)話框或不同控 件)的不同而不同,但其中最右邊的兩個(gè)按鈕和第一項(xiàng)標(biāo)簽是 相同的。 1 按鈕 :按下該按鈕,使按鈕變成 ,使得該屬性對(duì)話框 保持可見(jiàn)(Keep Visible),直到釋放該按鈕或強(qiáng)制關(guān)閉對(duì)話框。

5、屬性對(duì)話框的內(nèi)容會(huì)隨著當(dāng)前選中對(duì)象的改變而變化。 2 按鈕 :點(diǎn)擊該按鈕,將顯示當(dāng)前選中屬性頁(yè)面相關(guān)內(nèi)容的 幫助信息,3 通用標(biāo)簽 :提供對(duì)話框或所有控件的通用屬性操作。 對(duì)話框的主要通用屬性操作: ID指定對(duì)話框的標(biāo)識(shí)值,程序可使用它裝載對(duì)話框 資源和選取對(duì)話框窗口。 Caption指定對(duì)話框的顯示標(biāo)題。 Font選擇對(duì)話框中所有文本(包括控件標(biāo)題)字體。 Menu如果需要,可為對(duì)話框選擇顯示菜單資源。 控件的通用屬性的含義如下: ID指定控件的標(biāo)識(shí)值,程序使用它裝載控件資源和 選取控件窗口,Caption指定諸如靜態(tài)文本、組框、按鈕、復(fù)選框、單選 按鈕等控件的顯示標(biāo)題。對(duì)于能發(fā)出通知消息的

6、 控件,其標(biāo)題與菜單項(xiàng)標(biāo)題一樣,緊跟字符 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ù)。 當(dāng)對(duì)話框?qū)ο笫盏酱讼r(shí),對(duì)話框窗口已創(chuàng)建完成,對(duì)話 框窗口句柄已經(jīng)有效,但對(duì)話框還沒(méi)有被顯示,對(duì)話框窗口 中的控件也已被創(chuàng)建。這意味著在重新定義的 OnInitDialog 中 可以添加一些影響對(duì)話

7、框(包括控件)外觀的初始化和對(duì)話 框構(gòu)造函數(shù)無(wú)法完成的初始化工作。OnInitDialog 對(duì)對(duì)話框的 作用與 OnCreate 對(duì) CMainFrame 對(duì)象的作用類似。本例中,首 先使用 ClassWizard 為 CRegisterDialog 添加對(duì) WM_INITDIALOG 消息映射和處理函數(shù) OnInitDialog(注意,在 Visual C+ .NET 中 是通過(guò)重載基類的虛函數(shù) OnInitDialog 的方法完成的),然后 手工在 OnInitDialog 中加入對(duì)用于工資收入的列表框控件的初 始化代碼如下,BOOL CRegisterDialog:OnInitDialo

8、g() CDialog:OnInitDialog(); / TODO: Add extra initialization here m_ctrlIncome.AddString(500元以下); m_ctrlIncome.AddString(500-1000元); m_ctrlIncome.AddString(1000-2000元); m_ctrlIncome.AddString(2000元以上); return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages s

9、hould return FALSE,5.2.5 信息交換、驗(yàn)證 在對(duì)話框操作時(shí),用戶只要通過(guò)交互方式修改對(duì)話框窗口某 個(gè)控件中的數(shù)據(jù)信息,就可以修改與該控件關(guān)聯(lián)數(shù)值對(duì)象的 值;反過(guò)來(lái)只要程序修改了對(duì)話框類對(duì)象中某個(gè)與控件關(guān)聯(lián)數(shù) 值對(duì)象的值,也就可以修改對(duì)話框窗口中與該數(shù)值對(duì)象關(guān)聯(lián)控 件中顯示的信息。對(duì)話框的這種數(shù)據(jù)交換(DDX)和數(shù)據(jù)有效 驗(yàn)證(DDV)能力是由 MFC 類 CDataExchange 來(lái)實(shí)現(xiàn)的。 實(shí)現(xiàn)這種信息交換操作是由虛函數(shù) CDialog:DoDataExchange 完成的。派生類中該函數(shù)的重定義版本將在調(diào)用該函數(shù)的基類 版本基礎(chǔ)上完成派生類對(duì)象所需要的特定的數(shù)據(jù)交換

10、操作。所 幸的是該函數(shù)的重定義工作可以借助 ClassWizard 在定義與控件 相關(guān)的對(duì)話框類數(shù)據(jù)對(duì)象的同時(shí)自動(dòng)完成的。例如在本例中,void CRegisterDialog: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

11、_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_Max

12、Chars(pDX, m_strUnit, 30); DDX_Radio(pDX, IDC_WORK, m_nWork); /AFX_DATA_MAP,由于對(duì)話框的數(shù)據(jù)交換是雙向的,所以參數(shù) pDX 所指向的 CDataExchange 類對(duì)象含有數(shù)據(jù)的傳遞方向。實(shí)現(xiàn)數(shù)據(jù)交換不是 直接調(diào)用 DoDataExchange(因?yàn)闊o(wú)法確定數(shù)據(jù)傳遞方向),而 是調(diào)用 CWnd:UpdateData。UpdateData 的原型如下: BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 參數(shù): bSaveAndValidate = TRUE 指定數(shù)據(jù)值從控件

13、傳遞到數(shù)據(jù)對(duì)象; bSaveAndValidate = FALSE 指定數(shù)據(jù)值從數(shù)據(jù)對(duì)象傳遞到控件。 該函數(shù)調(diào)用了 DoDataExchange,顯然,參數(shù) bSaveAndValidate 確 定了 DoDataExchange 的數(shù)據(jù)傳遞方向,5.2.6 對(duì)話框的運(yùn)行 在程序中運(yùn)行模態(tài)對(duì)話框的步驟: 在棧上構(gòu)建一個(gè)局部對(duì)話框類對(duì)象。 調(diào)用CDialog:DoModal() DoModal 負(fù)責(zé)模態(tài)對(duì)話框的創(chuàng)建啟動(dòng)一個(gè)消息循環(huán)撤消 對(duì)話框(接收到 按鈕或 按鈕控件發(fā)出的消 息)。顯然,在 DoModal 函數(shù)返回之前,不可能進(jìn)行其他界 面上的操作的。該函數(shù)是一個(gè)虛函數(shù),意味著可以根據(jù)需要 在

14、 CDialog 的派生類中定義特定功能的 DoModal ,但大多數(shù) 情況下無(wú)須重新定義。 對(duì)話框創(chuàng)建時(shí),程序框架會(huì)自動(dòng)調(diào)用 OnInitDialog 初始化 對(duì)話框,并調(diào)用 UpdateData(FALSE) 初始化控件的顯示,對(duì)話框撤消時(shí),分為兩種情況: 按 按鈕,消息處理成員函數(shù) OnOk 被調(diào)用。在該函數(shù) 的執(zhí)行中,首先調(diào)用 UpdateData( TRUE ) 將控件中的數(shù)據(jù)傳 遞到相應(yīng)數(shù)據(jù)對(duì)象中保存起來(lái),然后調(diào)用 EndDialog 關(guān)閉對(duì) 話框,并返回標(biāo)志值 IDOK。 按 按鈕,消息處理成員函數(shù) OnCancel 被調(diào)用,在 該函數(shù)的執(zhí)行中,只調(diào)用 EndDialog 關(guān)閉對(duì)

15、話框,并返回標(biāo) 志值 IDCANCEL。 根據(jù) DoModal 返回的標(biāo)志值,程序就可以知道對(duì)話框是如何 結(jié)束的(按 或 按鈕),從而確定后續(xù)操作,在本例中,為了模態(tài)使用對(duì)話框,添加了一條菜單命令來(lái)觸 發(fā)對(duì)話框類對(duì)象的創(chuàng)建,對(duì)話框的模態(tài)創(chuàng)建、顯示、操作和根 據(jù)對(duì)話框結(jié)束狀態(tài)的后續(xù)操作。 1 在菜單資源中的 Edit 彈出式菜單中添加菜單項(xiàng)“登錄數(shù)據(jù)”, 其標(biāo)識(shí)為 ID_EDIT_REGISTER。 2 使用 ClassWizard 為菜單項(xiàng) “登錄數(shù)據(jù)” 在視圖類 CRegisterView 中定義命令消息映射項(xiàng)和處理函數(shù) OnEditRegister。 3 定義函數(shù) OnEditRegist

16、er 實(shí)現(xiàn)代碼,void CRegisterView:OnEditRegister() / TODO: Add your command handler code here CRegisterDialog dlg; if(dlg.DoModal() = IDOK) CString str; GetWindowText(str);/ 獲取視圖窗口原有文本內(nèi)容 str += rn; str += 姓名:; str += dlg.m_strName; str += rn; str += 性別:; str += dlg.m_nSex?女:男; str += rn; str += 年齡:; CStrin

17、g str1; str1.Format(%d, dlg.m_nAge,str += str1; str += rn; str +=婚否:; str +=dlg.m_bMarried?已婚:未婚; str += rn; str += 就業(yè)情況:; str+=dlg.m_nWork?下崗:在職; str+=rn; str += 工作單位:; str += dlg.m_strUnit; str += rn; str += 單位性質(zhì):; str += dlg.m_strKind; str += rn; str += 工資收入:; str += dlg.m_strIncome; str += rn; S

18、etWindowText(str);/ 在視圖窗口中顯示新文本 4 在 CRegisterView 的實(shí)現(xiàn)文件中加入: #include “RegisterDialog.h” 5 編譯運(yùn)行,5.2.7 程序的改進(jìn) 在程序的運(yùn)行中發(fā)現(xiàn)存在這樣的缺點(diǎn):當(dāng)在“就業(yè)情況”組框 中選擇了單選按鈕“下崗”,而“單位情況”組框中的所有控件仍 然有效,顯然這是不合理的,會(huì)引起登錄數(shù)據(jù)的錯(cuò)誤。為了克 服這一缺點(diǎn),應(yīng)該當(dāng)在“就業(yè)情況”組框中選擇了單選按鈕時(shí), 程序能夠響應(yīng)對(duì)應(yīng)的控件消息,在消息處理函數(shù)中根據(jù)所選按 鈕的不同,使“單位情況”組框中的相關(guān)控件允許或禁止。雖然 組框中的單選按鈕是兩個(gè),而它們的消息處理函

19、數(shù)只需要一 個(gè),因此應(yīng)該使用 ON_CONTROL_RANGE 消息映射宏進(jìn)行消息 映射。不幸的是 ClassWizard 不支持 ON_CONTROL_RANGE,所 以我們必須按下列步驟手工創(chuàng)建單選按鈕的消息映射和消息處 理函數(shù),1 在 CRegisterDialog 的定義文件中定義消息處理函數(shù)原型: class CRegisterDialog : public CDialog / Implementation protected: / Generated message map functions /AFX_MSG(CRegisterDialog) virtual BOOL OnIni

20、tDialog(); /AFX_MSG afx_msg void OnWorkClicked(UINT nCmdID); DECLARE_MESSAGE_MAP(),2 在 CRegisterDialog 實(shí)現(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 在 CRegi

21、sterDialog 實(shí)現(xiàn)文件中添加消息響應(yīng)函數(shù)實(shí)現(xiàn)代碼: void CRegisterDialog: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

22、)-SetWindowText(); GetDlgItem(IDC_UNIT)-EnableWindow(FALSE); / 使組合框處于未選擇狀態(tài),并使之禁止 CComboBox *pComboBox = (CComboBox*)GetDlgItem(IDC_KIND); pComboBox-SetCurSel(-1); pComboBox-EnableWindow(FALSE); / 使列表框?yàn)槲催x和禁止?fàn)顟B(tài) m_ctrlIncome.SetCurSel(-1); m_ctrlIncome.EnableWindow(FALSE);,在對(duì)話框中獲取控件對(duì)象并對(duì)其控制操作有兩種方法: 直接使用

23、與控件關(guān)聯(lián)的控件對(duì)象,本例中對(duì)“工資收入”列表 框控件的操作是通過(guò)與 CListBox 對(duì)象 m_ctrlIncome 進(jìn)行的。 利用 CWnd 類的一組操作對(duì)話框控件的成員函數(shù),本例中對(duì) 于“工作單位”文本框和“單位性質(zhì)”組合框控件的操作就是調(diào) 用 CWnd:GetDlgItem(int nID) 返回指向標(biāo)識(shí)值為 nID 的控件對(duì) 象的指針,調(diào)用代碼如下: CEdit *pUnit = (CEdit*)GetDlgItem(IDC_UNIT); CComboBox *pKind = (CComboBox*)GetDlgItem(IDC_KIND); 從而借助該指針對(duì)相應(yīng)的控件進(jìn)行操作。 4

24、 編譯運(yùn)行(應(yīng)用程序項(xiàng)目“Register1”,5.3 非模態(tài)對(duì)話框 5.3.1 非模態(tài)對(duì)話框的特點(diǎn) 非模態(tài)對(duì)話框的設(shè)計(jì)與模態(tài)對(duì)話框基本類似,也是由對(duì)話框 模板資源設(shè)計(jì)和對(duì)話框類設(shè)計(jì)兩部分組成。但在對(duì)話框的創(chuàng)建 和刪除過(guò)程中,兩類對(duì)話框存在下列差異: 1 對(duì)話框模板的 Visible 屬性不同 非模態(tài)對(duì)話框模板應(yīng)該具有 Visible 屬性,否則對(duì)話框創(chuàng)建時(shí) 將不能自動(dòng)可見(jiàn)。當(dāng)然,如果對(duì)話框模板沒(méi)有設(shè)置 Visible 屬 性,可以在對(duì)話框創(chuàng)建后調(diào)用 CWnd:ShowWindow( SW_SHOW ) 顯示對(duì)話框。 模態(tài)對(duì)話框則不必設(shè)置 Visible 屬性,因?yàn)?DoModal 函數(shù)隱含

25、解決了對(duì)話框的可見(jiàn)性,2 創(chuàng)建空間不同 非模態(tài)對(duì)話框類對(duì)象是使用 new 操作符在堆中動(dòng)態(tài)創(chuàng)建的, 并在該對(duì)話框?qū)ο蟮乃鶎兕愔性黾釉搶?duì)話框類指針,用于指 向動(dòng)態(tài)創(chuàng)建的對(duì)話框類對(duì)象。 模態(tài)對(duì)話框一般是以局部對(duì)象的形式構(gòu)建在堆棧上。 3 窗口創(chuàng)建函數(shù)不同 非模態(tài)對(duì)話框的創(chuàng)建是調(diào)用 CDialog:Create 函數(shù)創(chuàng)建的,該函 數(shù)不啟動(dòng)新的消息循環(huán),因此,所創(chuàng)建的對(duì)話框與應(yīng)用程序 使用同一個(gè)消息循環(huán)。 模態(tài)對(duì)話框調(diào)用 CDialog:DoModal 完成對(duì)話框窗口的創(chuàng)建、啟 動(dòng)消息循環(huán)和撤消,4 窗口刪除函數(shù)不同 非模態(tài)對(duì)話框類必須編寫自己的 OnOK 和 OnCancel 函數(shù),以 便在函數(shù)中調(diào)

26、用 CWnd:DestroyWindow 關(guān)閉對(duì)話框。 模態(tài)對(duì)話框通過(guò)默認(rèn)的 CDialog:OnOK 和 CDialog:OnCancel 調(diào)用 CDialog:EndDialog 關(guān)閉對(duì)話框。注意,DoModal、OnOk 和 OnCancel 都是虛函數(shù),這意味著如果需要,可以在派生類 中重新定義這些函數(shù)的特定版本,完成特定的附加工作。 5 清理對(duì)話框?qū)ο蟮姆绞讲煌?非模態(tài)對(duì)話框?qū)ο髴?yīng)在不再使用時(shí),使用 delete 操作符刪除 在堆中動(dòng)態(tài)創(chuàng)建的對(duì)話框?qū)ο?。由于一個(gè)窗口被刪除后,框 架會(huì)自動(dòng)調(diào)用虛函數(shù) CWnd:PostNcDestroy,因此可以在該函 數(shù)的重定義版本中使用 delet

27、e 刪除窗口的關(guān)聯(lián)對(duì)話框?qū)ο蟆?模態(tài)對(duì)話框類對(duì)象是局部的,因此不需要顯式刪除,6 非模態(tài)對(duì)話框不能“重入” 非模態(tài)對(duì)話框必須通過(guò)對(duì)指向?qū)υ捒驅(qū)ο蟮闹羔樀臋z查,來(lái) 判別對(duì)話框?qū)ο笫欠褚呀?jīng)創(chuàng)建,如果未創(chuàng)建,則創(chuàng)建對(duì)話框 對(duì)象;否則只需激活已經(jīng)創(chuàng)建的對(duì)話框,而不要重新創(chuàng)建。 模態(tài)對(duì)話框是局部對(duì)象,每次調(diào)用都重新在棧上構(gòu)建。 根據(jù)上述兩種對(duì)話框的不同,修改“Register1”應(yīng)用程序,將數(shù)據(jù) 登錄對(duì)話框改為無(wú)模式對(duì)話框,項(xiàng)目名為“Register2”。修改步 驟如下,修改對(duì)話框模板的 Visible 屬性有效,并將 和 按鈕的顯示標(biāo)題改為 和,在 CRegisterView 類定義中加入數(shù)據(jù)登錄對(duì)話

28、框類指針: public: CRegisterDialog *m_pRegisterDlg; 注意將 CRegisterDialog 類的頭文件包含在 CRegisterView 類的 定義文件中,或在定義對(duì)話框指針之前加入超前聲明: class CRegisterDialog,在 CRegisterDialog 類中增加 CWnd 類型的指針數(shù)據(jù)成員,用 于保存其父窗口對(duì)象的指針(以便與父窗口進(jìn)行聯(lián)系), 并在構(gòu)造函數(shù)中對(duì)該指針進(jìn)行設(shè)置。 protected: CWnd* m_pParent; CRegisterDialog:CRegisterDialog(CWnd* pParent /*=

29、NULL*/) : CDialog(CRegisterDialog:IDD, pParent) /AFX_DATA_INIT m_pParent = pParent;,修改 CRegisterView 類構(gòu)造函數(shù)和消息處理函數(shù): CRegisterView:CRegisterView() / TODO: add construction code here m_pRegisterDlg = NULL; void CRegisterView:OnEditRegister() / TODO: Add your command handler code here if(m_pRegisterDlg)

30、/ 判斷對(duì)話框已創(chuàng)建否? m_pRegisterDlg-SetActiveWindow(); / 激活已創(chuàng)建的對(duì)話框 else m_pRegisterDlg = new CRegisterDialog(this); / 創(chuàng)建對(duì)話框?qū)ο?m_pRegisterDlg-Create(IDD_REGISTER, this); / 創(chuàng)建窗口,使用 ClassWizard 為 CRegisterDialog 類添加 OnCancel、OnOK 消息響應(yīng)函數(shù)和重載虛函數(shù) PostNcDestroy,并為這兩個(gè)函數(shù) 編寫定義代碼: void CRegisterDialog:OnCancel() / TODO

31、: Add extra cleanup here m_pParent-SendMessage(WM_DIALOG_DESTROY, 0, 0); /向父窗口發(fā)出關(guān)閉對(duì)話框消息 DestroyWindow();/ 關(guān)閉對(duì)話框窗口,void CRegisterDialog:OnOK() / TODO: Add extra validation here CString str; UpdateData(); m_pParent-GetWindowText(str); / 獲取父窗口中的顯示文本 / 在原來(lái)文本的基礎(chǔ)上添加新文本 str += rn; str += 姓名:; str += m_strN

32、ame; str += rn; str += 性別:; str += m_nSex?女:男; str += rn; str += 年齡:; CString str1,str1.Format(%d, m_nAge); str += str1; str += rn; str += 婚否:; str += m_bMarried ? 已婚:未婚; str += rn; str += 就業(yè)情況:; str += m_nWork ? 下崗:在職; str += rn; str += 工作單位:; str += m_strUnit; str += rn; str += 單位性質(zhì):; str += m_str

33、Kind; str += rn; str += 工資收入:; str += m_strIncome; str += rn; m_pParent-SetWindowText(str); / 在父窗口中顯示添加后的文本 void CRegisterDialog:PostNcDestroy() / TODO: Add your specialized code here and/or call the base class delete this;/ 刪除對(duì)話框類對(duì)象 CDialog:PostNcDestroy();,對(duì)話框關(guān)閉時(shí)要求其父窗口類對(duì)象能及時(shí)將指向?qū)υ捒虻闹?針設(shè)置為 NULL。實(shí)現(xiàn)方法

34、和步驟如下: 在 CRegisterDialog 的定義文件中增加用戶自定義消息: const WM_DIALOG_DESTROY = WM_USER + 100; 在 CRegisterView 定義中增加消息處理函數(shù)聲明: afx_msg LRESULT OnDialogDestroy(WPARAM, LPARAM); 在 CRegisterView 實(shí)現(xiàn)文件中添加消息響應(yīng)函數(shù)定義代碼: LRESULT CRegisterView:OnDialogDestroy( WPARAM wParam, LPARAM lParam ) m_pRegisterDlg = NULL; return 1;

35、 編譯運(yùn)行,5.3.2 關(guān)于窗口對(duì)象的自動(dòng)清除 1 MFC 窗口類對(duì)象的組成 一個(gè) MFC 窗口由兩部分組成: 描述窗口屬性和功能的 C+類 窗口類(CWnd 或CWnd 的派生類)。 Windows 窗口,該窗口的句柄作為一個(gè)數(shù)據(jù)成員 m_hWnd 被封裝在窗口類中。 2 MFC 窗口類對(duì)象的創(chuàng)建 首先創(chuàng)建窗口的窗口類對(duì)象; 然后調(diào)用窗口類的創(chuàng)建函數(shù)(例如 CWnd:Create)創(chuàng)建由 參數(shù)確定的 Windows 窗口,并使之與窗口類對(duì)象相關(guān)聯(lián); 或調(diào)用Windows 窗口關(guān)聯(lián)函數(shù)(例如 CWnd:Attach)使窗口 類對(duì)象與一個(gè)已經(jīng)存在的 Windows 窗口相關(guān)聯(lián),3 MFC 窗口類

36、的刪除 先調(diào)用 CWnd:DestroyWindow 撤消 Windows 窗口,并使窗口類 對(duì)象的 Windows 窗口句柄屬性 m_hWnd = NULL(表示窗口已 經(jīng)無(wú)效)。一般情況下,該函數(shù)不需要直接調(diào)用,而是由應(yīng) 用程序框架自動(dòng)調(diào)用,例如:關(guān)閉窗口的 WM_CLOSE 消息、 對(duì)話框的 或 按鈕發(fā)出的消息都會(huì)導(dǎo)致該函數(shù) 被調(diào)用。如果 DestroyWindow 所撤消的窗口擁有子窗口,則 先刪除所有的子窗口,然后刪除父窗口,然后刪除窗口的窗口類對(duì)象。刪除窗口類對(duì)象分兩種情況: 構(gòu)建在堆棧上的窗口窗口類對(duì)象:該窗口類對(duì)象是作為某 個(gè)類的數(shù)據(jù)成員或函數(shù)中的局部變量。它們的生存期總是 有

37、限的,隨著擁有窗口類對(duì)象的撤消或函數(shù)的返回,被自 動(dòng)被刪除,所以不必關(guān)心這類窗口類對(duì)象的刪除。 創(chuàng)建在堆上的窗口類對(duì)象:該窗口類對(duì)象是使用運(yùn)算符 new 創(chuàng)建的,其生存期是任意的,因此,在關(guān)閉 Windows 窗口后必須使用運(yùn)算符 delete 從堆中刪除窗口類對(duì)象,否 則不會(huì)被自動(dòng)清除,4 自動(dòng)清除功能 自動(dòng)清除功能是指在 Windows 窗口被刪除時(shí),自動(dòng)刪除窗口 類對(duì)象。這是因?yàn)楫?dāng) CWnd:DestroyWindow 被調(diào)用撤消一個(gè) Windows 窗口時(shí),與該窗口關(guān)聯(lián)的窗口類對(duì)象的成員函數(shù) PostNcDestroy 被調(diào)用。該函數(shù)是一個(gè)虛函數(shù),MFC 所提供的 有些 CWnd 的派

38、生類重定義了該函數(shù),在新版本函數(shù)中通過(guò) 代碼 delete this 來(lái)刪除與被撤消窗口關(guān)聯(lián)的窗口類對(duì)象本身, 因此不需要顯式使用 delete 刪除窗口類對(duì)象,即自動(dòng)清除功 能。具有自動(dòng)清除功能的 MFC 窗口類有: 主框架窗口類(基類為 CFrameWnd ) 視圖類(基類為 CView,這些窗口類的對(duì)象在應(yīng)用程序中一般都是動(dòng)態(tài)在堆中創(chuàng)建 的。而對(duì)于其他 MFC 窗口類的使用,由于大多數(shù)情況下是在 堆棧中創(chuàng)建的。所以 MFC 沒(méi)有為這些類提供自動(dòng)清除功能。 這些窗口類包括: 所有標(biāo)準(zhǔn)的 Windows 控件類 從 CWnd 直接派生的自定義窗口類(如用戶定制的控件) 切分窗口類 CSpli

39、tterWnd 默認(rèn)的控制欄類(如工具欄和狀態(tài)欄) 對(duì)話框類(從 CDialog 派生,由此可見(jiàn),要不要為自己的派生窗口類添加自動(dòng)清除功能, 取決于所派生的窗口類的創(chuàng)建方法,例如,我們前面的非模 式對(duì)話框的實(shí)例中,由于對(duì)話框是在堆中創(chuàng)建的,要求其生 存期任意,所以需要為它添加了自動(dòng)清除功能。否則我們必 須在對(duì)話框窗口被刪除后,在對(duì)話框類對(duì)象的擁有者 (父窗 口類對(duì)象) 中的適當(dāng)位置(如析構(gòu)函數(shù)中),調(diào)用 delete 顯式刪 除對(duì)話框類對(duì)象,5.4 創(chuàng)建屬性表對(duì)話框 屬性表是一種包含了多個(gè)對(duì)話框的對(duì)話框框架,這些包含在 屬性表中的對(duì)話框通常被稱為屬性頁(yè)(Page)。每次只有一個(gè) 屬性頁(yè)是可見(jiàn)的

40、,在屬性表的頂端有一行標(biāo)簽(tab)用于指示 屬性表中不同的屬性頁(yè),用戶通過(guò)單擊這些標(biāo)簽可以切換到不 同的屬性頁(yè)。 使用屬性表可以按操作功能將控件分類放在不同的屬性頁(yè) 中,便于組織和構(gòu)造需要大量控件的復(fù)雜對(duì)話框,也使得對(duì)話 框的使用界面更加友好,5.4.1 屬性表對(duì)話框的創(chuàng)建 屬性表是由多個(gè)屬性頁(yè)和一個(gè)能放置這些屬性頁(yè),并且將 這些屬性頁(yè)關(guān)聯(lián)起來(lái)的對(duì)話框框架組成的,就像是一個(gè)夾有多 頁(yè)文件的文件夾。為了支持屬性表,MFC 提供了兩個(gè)類: CPropertySheet :用于創(chuàng)建屬性表框架和提供相應(yīng)的屬性和 操作。它的直接基類是 CWnd,使該類在窗口的屬性和功能的 基礎(chǔ)上增加了對(duì)屬性頁(yè)的創(chuàng)建、

41、激活、切換、數(shù)據(jù)交換、撤 消等功能。 CPropertyPage :用于創(chuàng)建屬性表的屬性頁(yè)和提供相應(yīng)的屬性 和操作。它的直接基類是 CDialog,使該類在對(duì)話框的屬性和 功能的基礎(chǔ)上增加了對(duì)屬性表框架各項(xiàng)管理的響應(yīng)操作,與普通對(duì)話框相比,屬性表的設(shè)計(jì)和實(shí)現(xiàn)既有許多相似之 處,又有一些不同。創(chuàng)建一個(gè)屬性表一般包括以下幾個(gè)步驟: 1 創(chuàng)建屬性頁(yè)(對(duì)話框)資源 創(chuàng)建所有屬性頁(yè)的資源,每個(gè)屬性頁(yè)的資源都是一個(gè)對(duì)話框 模板。與創(chuàng)建普通對(duì)話框模板相比應(yīng)注意以下幾點(diǎn): 一般需要?jiǎng)h除缺省的 和 按鈕; 每頁(yè)的模板尺寸最好相同,如果不同,則在屬性表創(chuàng)建時(shí),系統(tǒng)會(huì)按最大的模板尺寸統(tǒng)一創(chuàng)建所有頁(yè)的尺寸; 指定標(biāo)題

42、(Caption)的內(nèi)容將成為屬性表中相應(yīng)屬性頁(yè)的指示標(biāo)簽內(nèi)容; 屬性頁(yè)模板屬性設(shè)定為 TitleBar、Child、ThinBoder 和 Disable,2 生成屬性頁(yè)類 使用 ClassWizard 為每個(gè)屬性頁(yè)模板定義相應(yīng)的屬性頁(yè)類,基 類必須選擇 CPropertyPage。 3 在屬性頁(yè)類中為屬性頁(yè)中的控件添加關(guān)聯(lián)的數(shù)據(jù)對(duì)象 與普通對(duì)話框一樣,使用 ClassWizard 的Member Variables 屬性頁(yè)為每個(gè)屬性頁(yè)模板中的控件在相應(yīng)的屬性頁(yè)類中添加 所需要的數(shù)據(jù)對(duì)象,4 創(chuàng)建屬性表 創(chuàng)建屬性表的方法兩種: 直接使用 CPropertySheet 類創(chuàng)建 在需要使用屬性表

43、的碼段中加入相應(yīng)的創(chuàng)建代碼。例如: void CMyView:DoModalPropertySheet() CPropertySheet propsheet; / 創(chuàng)建屬性表框架 CMyFirstPage pageFirst; / 創(chuàng)建第一屬性頁(yè) CMySecondPage pageSecond; / 創(chuàng)建第二屬性頁(yè) pageFirst.m_nMember1 = m_nMember1; / 初始化第一屬性頁(yè) pageFirst.m_nMember2 = m_nMember2; / 初始化第一屬性頁(yè) pageSecond.m_nMember3 = m_nMember3; / 初始化第二屬性頁(yè) p

44、ageSecond.m_nmember4 = m_nMember4; / 初始化第二屬性頁(yè),propsheet.AddPage(,使用 CPropertySheet 類的派生類創(chuàng)建 一般步驟如下: 使用 ClassWizard 定義一個(gè) CPropertySheet 類的派生類; 將所有屬性頁(yè)類對(duì)象以數(shù)據(jù)成員的形式加入到此派生類的 定義中; 在此派生類構(gòu)造函數(shù)中調(diào)用 CPropertySheet:AddPage 函數(shù) 將各個(gè)屬性頁(yè)添加到屬性表中,使得在屬性表對(duì)象的創(chuàng)建 操作自動(dòng)包含了屬性頁(yè)的添加操作。 在需要使用屬性表的地方,使用此派生的屬性表類創(chuàng)建特 定的屬性表,5.4.2 屬性表的運(yùn)行機(jī)制

45、 1 屬性表初始化包括屬性表框架的初始化和屬性頁(yè)的初始化。 如果需要進(jìn)行自定義初始化操作,屬性表框架初始化應(yīng)在重 定義的虛函數(shù) CPropertySheet:OnCreate 中完成;而屬性頁(yè)初始 化應(yīng)在重定義的虛函數(shù) CPropertyPage:OnInitDialog 中完成。 2 屬性表的使用者一般調(diào)用 CPropertySheet:DoModal ,按模態(tài)運(yùn) 行方式創(chuàng)建屬性表,并可通過(guò)判斷 DoModal 的返回值(IDOK 或 IDCANCEL),確定關(guān)閉屬性表的操作方式是 “確認(rèn)” 還是 “放棄”,從而確定后續(xù)操作,3 模態(tài)運(yùn)行的屬性表會(huì)自動(dòng)在屬性表的底部提供三個(gè)按鈕,依 次為 或

46、 、 或 和 或 按鈕(非模態(tài)運(yùn)行的屬性表不提供這些按鈕)。其中: 或 按鈕的作用是確認(rèn)當(dāng)前屬性頁(yè)的操作,并 關(guān)閉整個(gè)屬性表。 或 按鈕的作用是放棄當(dāng)前屬性頁(yè)的操 作,關(guān)閉整個(gè)屬性表。 通過(guò)標(biāo)簽的屬性頁(yè)切換操作將確認(rèn)被切換屬性頁(yè)的操作。 或 按鈕的作用是確認(rèn)當(dāng)前屬性頁(yè)操作,并 使屬性表的所有操作生效,但不關(guān)閉該屬性表,對(duì)這三個(gè)按鈕作出處理的響應(yīng)函數(shù)可由 CPropertyPage 類提供 的消息響應(yīng)函數(shù) OnOK、OnCancel 和 OnApply (OnApply 會(huì)自 動(dòng)調(diào)用 OnOK)完成。因此,我們可以在屬性頁(yè)派生類中重定 義這三個(gè)消息響應(yīng)函數(shù)完成所需要的特定操作。 應(yīng)當(dāng)指出:對(duì)屬性

47、頁(yè)的這三個(gè)消息響應(yīng)函數(shù)的調(diào)用并非直接 響應(yīng)屬性表的三個(gè)按鈕的通知消息 BN_CLICKED 的結(jié)果,而 是通過(guò) CPropertySheet 類或派生類對(duì)這三個(gè)按鈕的消息響應(yīng)函 數(shù),間接調(diào)用上述 CPropertyPage 的三個(gè)消息響應(yīng)函數(shù)完成的。 例如,定義響應(yīng) 按鈕的通知消息,完成特定的處理 可以有兩種方法,使用 ClassWizard 為屬性表中任意一個(gè)屬性頁(yè)類重定義虛 函數(shù) OnApply,在該函數(shù)中定義要實(shí)現(xiàn)的特定功能代碼。 一般情況下所定義的功能將對(duì)整個(gè)屬性表起作用,所以 只須在一個(gè)屬性頁(yè)中重定義 OnApply 即可,不必為每個(gè)屬 性頁(yè)都重定義 OnApply。 在 CProp

48、ertySheet 的派生類中添加 按鈕的通知消 息 BN_CLICKED 的消息映射和響應(yīng)函數(shù),在該函數(shù)中定義 想要實(shí)現(xiàn)的操作。注意,系統(tǒng)為 按鈕定義的標(biāo)識(shí) 為 ID_APLLY_NOW,但在VC 6.0 中 ClassWizard 無(wú)法識(shí)別該 標(biāo)識(shí) ,因此上述添加操作只能手工完成,4 CPropertyPage 類中幾個(gè)與運(yùn)行機(jī)制相關(guān)的重要成員函數(shù): void SetModified( BOOL bChanged = TRUE ); 該函數(shù)用于設(shè)置屬性頁(yè)的修改標(biāo)志。參數(shù)bChange 為 TRUE 表明屬性頁(yè)的屬性已修改,否則表示未修改。調(diào)用該函數(shù)的 主要功能是“允許”或“禁止” 按鈕:

49、只要在一個(gè)屬性頁(yè)中調(diào)用了 SetModified(),就會(huì)使 按鈕的狀態(tài)變?yōu)椤霸试S”; 必須在所有的屬性頁(yè)中調(diào)用 SetModified(FALSE),才能使 按鈕的狀態(tài)變?yōu)椤敖?virtual BOOL OnSetActive( ); 當(dāng)屬性頁(yè)被激活或被創(chuàng)建時(shí),該函數(shù)將被程序框架調(diào)用。該 函數(shù)的缺省操作是: BEGIN if(屬性頁(yè)創(chuàng)建否?) then 激活已創(chuàng)建的屬性頁(yè) else 創(chuàng)建屬性頁(yè) endif 調(diào)用 UpdateData(FALSE) 刷新屬性頁(yè)內(nèi)的控件。 END 可以重定義該虛函數(shù)完成一些所需要的工作,但執(zhí)行這些特 定操作之前必須首先調(diào)用 CPropertyPage:OnSe

50、tActive,virtual BOOL OnKillActive( ); 當(dāng)切換屬性頁(yè)時(shí),被切換的屬性頁(yè)會(huì)調(diào)用該函數(shù)。該函數(shù)的 缺省操作是調(diào)用 UpdateData(TRUE) 保存數(shù)據(jù)??梢灾囟x該 虛函數(shù)完成一些特定數(shù)據(jù)的有效檢查和操作。該函數(shù)的成功 返回將導(dǎo)致程序框架調(diào)用 OnOK 函數(shù)。 注意: 在屬性表的一次調(diào)用中,表中的屬性頁(yè)并不一定都被創(chuàng)建 過(guò)。那些從未打開過(guò)的屬性頁(yè)就不會(huì)被創(chuàng)建。 只有確定屬性頁(yè)已經(jīng)存在,才能調(diào)用與屬性頁(yè)和控件相關(guān) 的函數(shù)。如果收到了控件通知消息或 OnSetActive 函數(shù)被調(diào) 用,則表明屬性頁(yè)已經(jīng)創(chuàng)建。 屬性頁(yè)之間的數(shù)據(jù)交換只能在 OnSetActive

51、 和 OnKillActive 函 數(shù)中進(jìn)行,5.4.3 屬性表的具體實(shí)例 創(chuàng)建一個(gè)屬性表應(yīng)用程序項(xiàng)目“Register3” ,在該項(xiàng)目中將 “Register” 應(yīng)用程序?qū)υ捒蛑械膬山M控件 “個(gè)人情況” 和 “單位情 況” 分解為屬性表的兩個(gè)屬性頁(yè)。創(chuàng)建屬性表步驟如下: 1 創(chuàng)建第一個(gè)屬性頁(yè) 創(chuàng)建屬性頁(yè)資源 生成新對(duì)話框模板 IDD_PERSONAL; 去掉缺省的 和 按鈕; 確定模板標(biāo)題為 “個(gè)人信息” 作為該屬性頁(yè)的 “標(biāo)簽”; 設(shè)置模板屬性:TitleBar、Child、ThinBoder 和 Disable; 添加所需要的控件:本例可以復(fù)制前例中對(duì)話框模板中的 相應(yīng)的控件,定義屬性頁(yè)

52、類 CPersonalPage 使用 ClassWizard 為 IDD_PERSONAL 定義 CPropertyPage 派 生類 CPersonalPage。 使用 ClassWizard ,為各控件添加對(duì)應(yīng)的數(shù)據(jù)對(duì)象,手工添加消息映射和處理函數(shù): 在類定義文件中加入消息響應(yīng)函數(shù)聲明: afx_msg void OnChangeProperties(); /處理相應(yīng)控件的 BN_CLICKED 消息 afx_msg void OnChangeProperties1(); /處理相應(yīng)控件的 EN_CHANGE 消息 在類實(shí)現(xiàn)文件的消息映射表中加入: ON_CONTROL_RANGE( BN

53、_CLICKED,IDC_MARRIED, IDC_WORK1, OnChangeProperties ) ON_CONTROL_RANGE( EN_CHANGE, IDC_NAME, IDC_AGE, OnChangeProperties1,在類實(shí)現(xiàn)文件中加入消息響應(yīng)函數(shù)的定義代碼: void CPersonalPage:OnChangeProperties() SetModified(TRUE);/ 使能 Apply 按鈕 UpdateData(TRUE);/ 確認(rèn)數(shù)據(jù)設(shè)置 void CPersonalPage:OnChangeProperties1() SetModified(TRUE)

54、; / 使能 Apply 按鈕 UpdateData(TRUE); / 確認(rèn)數(shù)據(jù)設(shè)置,2 創(chuàng)建第二個(gè)屬性頁(yè) 創(chuàng)建屬性頁(yè)資源 生成新對(duì)話框模板 IDD_UNIT; 去掉缺省的 和 按鈕; 確定模板標(biāo)題為 “單位信息” 作為該屬性頁(yè)的 “標(biāo)簽”; 設(shè)置模板屬性:TitleBar、Child、ThinBoder 和 Disable; 添加所需要的控件:本例可以復(fù)制前例中對(duì)話框模板中的 相應(yīng)控件,定義屬性頁(yè)類 CUnitPage 使用 ClassWizard 為 IDD_UNIT 創(chuàng)建 CPropertyPage 的派生類 CUnitPage。 使用 ClassWizard 在類定義中,為各控件添加對(duì)

55、應(yīng)的數(shù)據(jù)對(duì) 象,使用 ClassWizard 添加消息映射和處理函數(shù): 在類定義文件中加入消息響應(yīng)函數(shù)聲明: afx_msg void OnChangeUnit(); afx_msg void OnSelchangeIncome(); afx_msg void OnEditchangeKind(); afx_msg void OnSelchangeKind(); 在類實(shí)現(xiàn)文件的消息映射表中加入: ON_EN_CHANGE(IDC_UNIT, OnChangeUnit) ON_LBN_SELCHANGE(IDC_INCOME, OnSelchangeIncome) ON_CBN_EDITCHAN

56、GE(IDC_KIND, OnEditchangeKind) ON_CBN_SELCHANGE(IDC_KIND, OnSelchangeKind,在類實(shí)現(xiàn)文件中加入處理函數(shù)的定義代碼: void CUnitPage:OnChangeUnit() SetModified(TRUE); UpdateData(TRUE); void CUnitPage:OnSelchangeIncome() SetModified(TRUE); UpdateData(TRUE);,void CUnitPage:OnEditchangeKind() SetModified(TRUE); UpdateData(TRU

57、E); void CUnitPage:OnSelchangeKind() SetModified(TRUE); UpdateData(TRUE);,使用 ClassWizard 添加窗口消息 WM_INITDIALOG 的響應(yīng)函數(shù) OnInitDialog,并加入如下代碼,為列表框進(jìn)行初始化: BOOL CUnitPage:OnInitDialog() CPropertyPage:OnInitDialog(); / TODO: Add extra initialization here m_ctrlIncome.AddString(500元以下); m_ctrlIncome.AddString

58、(500-1000元); m_ctrlIncome.AddString(1000-2000元); m_ctrlIncome.AddString(2000元以上); return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE,重定義虛函數(shù) OnSetActive 用于從 “個(gè)人情況” 屬性頁(yè)切換到 “單位情況” 屬性頁(yè)時(shí)的就業(yè)情況判斷: BOOL CUnitPage:OnSetActive() / TODO: Add you

59、r specialized code here and/or call the base class BOOL result = CPropertyPage:OnSetActive(); if(result = 0) return result; if(CRegisterSheet*)GetParent()- m_PersonalPage.m_nWork=0) / 在職 GetDlgItem(IDC_UNIT)-EnableWindow(TRUE); GetDlgItem(IDC_KIND)-EnableWindow(TRUE); m_ctrlIncome.EnableWindow(TRUE)

60、; else,/ 下崗 GetDlgItem(IDC_UNIT)-SetWindowText(); GetDlgItem(IDC_UNIT)-EnableWindow(FALSE); m_strUnit = ; CComboBox *pComboBox = (CComboBox*)GetDlgItem(IDC_KIND); pComboBox-SetCurSel(-1); pComboBox-EnableWindow(FALSE); m_strKind = ; m_ctrlIncome.SetCurSel(-1); m_ctrlIncome.EnableWindow(FALSE); m_str

溫馨提示

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

評(píng)論

0/150

提交評(píng)論