詳解VC++訪問對話框控件的方式.doc_第1頁
詳解VC++訪問對話框控件的方式.doc_第2頁
詳解VC++訪問對話框控件的方式.doc_第3頁
詳解VC++訪問對話框控件的方式.doc_第4頁
詳解VC++訪問對話框控件的方式.doc_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

詳解VC+訪問對話框控件的方式獲取和設(shè)置對話框控件標(biāo)題或內(nèi)容的相關(guān)方法介紹: 0)先來看一個獲取窗口中指定控件或子窗口指針的函數(shù)CWnd:GetDlgItem:CWnd* GetDlgItem( int nID /控件或子窗口的ID) const;void GetDlgItem( int nID, /控件或子窗口的ID HWND* phWnd /指向子窗口的指針) const;“返回值”是指向控件或子窗口的指針,如果指定nID控件不存在,返回值是NULL;要注意的是:返回的指針可能是臨時的,因此不能存下來以待后面使用。我們通常會將返回的指針轉(zhuǎn)換為nID指向控件的類型。例如:/ uses GetDlgItem to return a pointer to a user interface controlCEdit* pBoxOne;pBoxOne = (CEdit*)GetDlgItem(IDC_ASCEEDIT);GotoDlgCtrl(pBoxOne);1)CWnd:GetWindowText函數(shù)實現(xiàn)獲取CWnd的標(biāo)題內(nèi)容,或者當(dāng)CWnd對象是一個控件時,函數(shù)將獲取控件中文本內(nèi)容而不是標(biāo)題內(nèi)容;函數(shù)原型如下:int GetWindowText( LPTSTR lpszStringBuf, /接收返回的內(nèi)容的緩沖區(qū) int nMaxCount /復(fù)制到緩沖區(qū)的最大字符個數(shù)) const;void GetWindowText( CString& rString /接收返回的內(nèi)容的CString對象) const;第一個函數(shù)的返回值是復(fù)制的字符個數(shù),不包括null結(jié)束符;當(dāng)CWnd沒有標(biāo)題或標(biāo)題為空時返回0。該成員函數(shù)使得WM_GETTEXT消息發(fā)送給CWnd對象。 CWnd:SetWindowText函數(shù)實現(xiàn)設(shè)置CWnd對象的標(biāo)題內(nèi)容,而當(dāng)CWnd對象是一個控件時,函數(shù)將設(shè)置控件中文本內(nèi)容,函數(shù)原型如下:void SetWindowText( LPCTSTR lpszString ); 實例代碼如下:/ set the text in IDC_EDITNAMECWnd* pWnd = GetDlgItem(IDC_EDITNAME);pWnd-SetWindowText(_T(Gerald Samper); / Get the text back. CString is convenient, because MFC/ will automatically allocate enough memory to hold the/ text-no matter how large it is.CString str;pWnd-GetWindowText(str);ASSERT(str = _T(Gerald Samper); / The LPTSTR override works, too, but it might be too short./ If we supply a buffer thats too small, well only get those/ characters that fit.TCHAR sz10;int nRet = pWnd-GetWindowText(sz, 10); / Nine characters, plus terminating nullASSERT(_tcscmp(sz, _T(Gerald Sa) = 0);ASSERT(nRet = 9); / You can query the length of the text without the length of/ the string using CWnd:GetWindowTextLength()nRet = pWnd-GetWindowTextLength();ASSERT(nRet = 13);2)CWnd:GetDlgItemText函數(shù)用來返回對話框中指定ID的控件上的文本,也就是說,GetDlgItemText函數(shù)將GetDlgItem和GetWindowText這兩個函數(shù)的功能組合起來了:int GetDlgItemText( int nID, /控件的ID LPTSTR lpStr, /指向接收控件標(biāo)題或文本的緩沖區(qū)的指針 int nMaxCount /復(fù)制到緩沖區(qū)的最大字符個數(shù)) const;int GetDlgItemText( int nID, /控件ID CString& rString /接收控件標(biāo)題或文本內(nèi)容) const; 函數(shù)返回值是實際復(fù)制到緩沖區(qū)的字符個數(shù),不包括null結(jié)束符;當(dāng)沒有復(fù)制任何東西時,返回0。 CWnd:SetDlgItemText函數(shù)用來設(shè)置對話框中指定控件的標(biāo)題或文本:void SetDlgItemText( int nID, /控件ID LPCTSTR lpszString /要設(shè)置的內(nèi)容);該函數(shù)將發(fā)送一個WM_SETTEXT消息給指定的控件。 3)CWnd:GetDlgItemInt函數(shù)用來獲取指定控件的文本,并將其轉(zhuǎn)換為一個整型數(shù)值:UINT GetDlgItemInt( int nID, /控件ID BOOL* lpTrans = NULL, /指向一個布爾型變量,該變量接收轉(zhuǎn)換成功與否標(biāo)志 BOOL bSigned = TRUE /指定被檢索的值是否有符號) const;返回值是轉(zhuǎn)換后的整型值。該函數(shù)將向控件發(fā)送一個WM_GETTEXT消息。 CWnd:SetDlgItemInt函數(shù)用指定的數(shù)值來設(shè)置指定控件的文本:void SetDlgItemInt( int nID, /控件ID UINT nValue, /指定用來產(chǎn)生控件上文本的整型數(shù)值 BOOL bSigned = TRUE /指定數(shù)值是否是有符號數(shù)字);該函數(shù)的調(diào)用將發(fā)送一個WM_SETTEXT消息給指定的控件。4)為了將對話框控件與對話框類成員變量相關(guān)聯(lián),我們可以使用ClassWizard來幫助我們完成(VC6.0和VC10.0中有ClassWizard)。首先打開ClassWizard對話框,并單擊Member Variable選項卡,在Class name下拉列表框中選擇CASCEDlg,這時在Control IDs列表中將列出這個對話框中的所有控件的ID。接著就可以為指定的控件ID關(guān)聯(lián)成員變量,這里選擇變量的類別是:Value,變量的類型是int,關(guān)聯(lián)了幾個變量后,實例代碼如下:在類的頭文件中,可以看到在兩個AFX_DATA注釋宏之間增加了三個成員變量:/AFX_DATA(CASCEDlg)enum IDD = IDD_DIALOG_ASCE ;int m_num1;int m_num2;int m_total;/AFX_DATA而在CASCEDlg類的構(gòu)造函數(shù)中,可以看到對這三個成員變量進(jìn)行了初始化:CASCEDlg:CASCEDlg(CWnd* pParent /*=NULL*/) : CDialog(CASCEDlg:IDD, pParent) /AFX_DATA_INIT(CASCEDlg) m_num1 = 0; m_num2 = 0; m_total = 0; /AFX_DATA_INIT而接著在DoDataExchange函數(shù)中完成了對話框數(shù)據(jù)的交換和校驗,在這個函數(shù)內(nèi)部調(diào)用了三個DDX_TEXT函數(shù),后者的功能就是將ID指定的控件與特定的類成員變量相關(guān)聯(lián)。因此,在DoDataExchange函數(shù)內(nèi)部實現(xiàn)了對話框控件與類成員變量的關(guān)聯(lián):void CASCEDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CASCEDlg) DDX_Text(pDX, IDC_EDIT1, m_num1); DDX_Text(pDX, IDC_EDIT2, m_num2); DDX_Text(pDX, IDC_EDIT_TOTAL, m_total); /AFX_DATA_MAP注:MFC提供了多種DDX_為前綴的函數(shù),這些函數(shù)分別用于不同控件的數(shù)據(jù)交換。 這之后,就可以使用這些成員變量了,例如實現(xiàn)m_total是前面兩個變量的和:m_total = m_num1 + m_num2;但是在代碼中僅僅寫這一句是實現(xiàn)不了編輯框的賦值的,因為對話框數(shù)據(jù)交換是由DoDataExchange函數(shù)完成的,但在程序代碼中從來不能直接調(diào)用這個函數(shù),而是通過CWnd:UpdateData來調(diào)用。通過后者來初始化對話框控件或從對話框獲取數(shù)據(jù)。即為了是數(shù)據(jù)生效,需要在代碼中調(diào)用UpdateData函數(shù):BOOL UpdateData( BOOL bSaveAndValidate = TRUE );當(dāng)參數(shù)bSaveAndValidate是TRUE時,說明該函數(shù)正在獲取對話框數(shù)據(jù);當(dāng)為FALSE時,說明該函數(shù)正在初始化對話框的控件。因此,實現(xiàn)相加并顯示在編輯框中的完整代碼是:UpdateData();m_total = m_num1 + m_num2;UpdateData(FALSE);5)同樣使用ClassWizard,但這次我們將編輯框控件關(guān)聯(lián)到一個控件變量,即代表控件本身。即在選擇變量類型時選擇Control,此時,變量類型會自動變?yōu)镃Edit。同樣添加三個成員變量,此時頭文件代碼片段我為:/AFX_DATA(CASCEDlg)enum IDD = IDD_DIALOG_ASCE ;CEdit m_edit1;CEdit m_edit2;CEdit m_edit_total;int m_num1;int m_num2;int m_total;/AFX_DATA 而在CASCEDlg類的DoDataExchange函數(shù)中增加了三個DDX_Control函數(shù),分別將一個對話框控件與一個變量相關(guān)聯(lián):void CASCEDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CASCEDlg) DDX_Control(pDX, IDC_EDIT1, m_edit1); DDX_Control(pDX, IDC_EDIT2, m_edit2); DDX_Control(pDX, IDC_EDIT_TOTAL, m_edit_total); DDX_Text(pDX, IDC_EDIT1, m_num1); DDX_Text(pDX, IDC_EDIT2, m_num2); DDX_Text(pDX, IDC_EDIT_TOTAL, m_total); /AFX_DATA_MAP而這些控件變量代表的就是控件本身,并且CEdit類派生于CWnd類,因此,可以利用這些控件變量調(diào)用GetWindowText和SetWindowText這兩個函數(shù)來獲取和設(shè)置編輯框中的文本。 6)Windows程序都是基于消息的系統(tǒng),為了獲取或設(shè)置窗口的文本,只要知道獲取或設(shè)置窗口文本的消息,就可以通過SendMessage來發(fā)送這條消息,從而獲取或設(shè)置窗口的文本。Windows系統(tǒng)中,獲取窗口文本的消息是WM_GETTEXT,發(fā)送該消息后,系統(tǒng)將把指定窗口的文本復(fù)制到調(diào)用者提供的一個緩存中。在這個消息的兩個附加參數(shù)中,wParam指定將復(fù)制的字符數(shù),lParam就是調(diào)用者提供的用來保存窗口文本的緩存地址。而設(shè)置窗口文本的消息是WM_SETTEXT,這個消息的wParam參數(shù)沒有用到,值為0;而lParam參數(shù)指定了用來設(shè)置窗口文本的字符串地址。實例代碼如下:void CASCEDlg:OnBtnAdd() int num1, num2, numTotal; char ch110, ch210, ch310; :SendMessage(GetDlgItem(IDC_EDIT1)-m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1); :SendMessage(m_edit2.m_hWnd, WM_GETTEXT, 10, (LPARAM)ch2); num1 = atoi(ch1); num2 = atoi(ch2); numTotal = num1 + num2; itoa(numTotal, ch3, 10); m_edit_total.SendMessage(WM_SETTEXT, 0, (LPARAM)ch3);7)直接給對話框中的子控件發(fā)送消息,使用函數(shù)CWnd:SendDlgItemMessage:LRESULT SendDlgItemMessage( int nID, /要接收該消息的對話框中控件的ID UINT message, /要發(fā)送的消息類型 WPARAM wParam = 0, / LPARAM lParam = 0 /);該函數(shù)的功能相當(dāng)于GetDlgItem和SendMessage函數(shù)的組合。因為SendDlgItemMessage函數(shù)本身就是在一個對

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論