




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、在對話框中加入屬性頁作者:黃晨量下載本文全部源代碼當(dāng)一個基于對話框的程序中有相當(dāng)多的控件時,你一定會想到使用屬性頁來將這些控件分類放置。本文針對這種方法來討論幾種可能實現(xiàn)的方案。方案一本方案的例子請見源代碼打包文件中的Property1部分在對話框上放置一個Tab Control的控件,再在對話框上放置所需的控件(本例放置了2個按鈕,試圖在每個標(biāo)簽中顯示一個)。然后利用Class Wizard來為Tab Control控件創(chuàng)建一個控件變量,該變量是CTabCtrl類的,再為其他控件也創(chuàng)建相應(yīng)的控件類。 在主對話框的初始函數(shù)中CProperty1Dlg:OnInitDialog()加入如下代碼:
2、/本例插入兩個標(biāo)簽,實際運用中可通過循環(huán)插入所需個數(shù)的標(biāo)簽,運行后默認(rèn)第一個標(biāo)簽被選中m_tab.InsertItem( 0, _T("Tab1") );m_tab.InsertItem( 1, _T("Tab2") );/將不是第一個標(biāo)簽的控件隱藏掉,只留下你要的控件m_button2.ShowWindow( SW_HIDE );再利用ClassWizard處理Tab Control的 TCN_SELCHANGE 的消息。在消息處理函數(shù)中,利用CWnd:ShowWindow來使相應(yīng)的控件顯示和隱藏。 void CProperty1Dlg:OnSelch
3、angeTab1(NMHDR* pNMHDR, LRESULT* pResult) /GetCurSel返回當(dāng)前被選中的標(biāo)簽的索引號(以0為基礎(chǔ)算起)int sel = m_tab.GetCurSel();switch(sel)case 0:m_button1.ShowWindow( SW_SHOW );m_button2.ShowWindow( SW_HIDE );break;case 1:m_button2.ShowWindow( SW_SHOW );m_button1.ShowWindow( SW_HIDE );break;*pResult = 0;這樣做以后就可以使界面上的控件在不同的
4、標(biāo)簽中顯示了,但是這個方案也有很多弊病。 所有的控件仍然在一個對話框內(nèi),在使用對話框編輯器進(jìn)行編輯時,操作很不方便。 為了能分類顯示控件,必須用ClassWizard為每一個控件創(chuàng)建一個控件變量,以便利用各控件變量的CWnd基類的ShowWindow函數(shù)來顯示和隱藏。有時為了使用DDX和DDV機(jī)制來進(jìn)行數(shù)據(jù)交換,還要創(chuàng)建一些存放值的變量,這樣就使得整個對話框類變得相當(dāng)龐大難以操作。 當(dāng)然你也可以使用數(shù)組來存放那些控件變量或值變量,但是這樣并不是最好,有時一些不相關(guān)的控件變量放入一個數(shù)組中,通過沒有實際意義的數(shù)組索引號來訪問控件,對程序的編寫會造成麻煩。 最好能將所有控件進(jìn)行分類,放入不通對話框
5、類中,這些對話框作為子對話框出現(xiàn)在主對話框中??梢浴,F(xiàn)在看看方案二。方案二本方案的例子請見源代碼打包文件中的Property2部分這個方案中,我將使用MFC中現(xiàn)成的CPropertySheet和CPropertyPage類來完成將控件分散到各個對話框類中。 首先加入兩個(或數(shù)個)對話框資源。修改各對話框資源的屬性,將對話框的Caption屬性改為你要在標(biāo)簽上所顯示的文字。將對話框的Style屬性改為:Child, Border屬性改為:Thin, 只選中Title Bar復(fù)選框,去掉其他復(fù)選框。然后你可以在這些對話框中加入要分開顯示的各個控件。為上述對話框資源分別制作一個對話框類,該對話框類是
6、從CPropertyPage繼承。這樣一來各子對話框類就好了,主對話框類可以直接使用CPropertySheet類。使用如下代碼即可: CPropertySheet sheet("屬性頁對話框");CPage1 page1;CPage2 page2;/加入子對話框作為一個屬性頁sheet.AddPage(&page1);sheet.AddPage(&page2);/產(chǎn)生一個模態(tài)對話框,也可以使用Create方法來產(chǎn)生一個非模態(tài)對話框(具體參見MSDN)sheet.DoModal();這樣這個對話框效果如下:但是會有人問,如何在主對話框中放置其他控件呢?如果直
7、接使用CPropertySheet的話,是不可以的,但是別忘了我們可以從CPropertySheet類繼承自己的類??!下面來看看方案三的做法。 方案三本方案的例子請見源代碼打包文件中的Property3部分首先還是要創(chuàng)建那些要在屬性頁中的顯示的子對話框類,創(chuàng)建步驟和方案二一樣,都是從CPropertyPage繼承。 這次我們將從CPropertySheet類繼承自己的類(假設(shè)類名為CMySheet)。我們要在這里放上一個button控件。那么現(xiàn)在先在CMySheet中加入一個CButton類的成員變量m_button。在CMySheet類中的OnInitDialog()函數(shù)里,這樣寫:BOOL
8、 bResult = CPropertySheet:OnInitDialog();/取得屬性頁的大小CRect rectWnd;GetWindowRect(rectWnd);/調(diào)整對話框的寬度SetWindowPos(NULL, 0, 0,rectWnd.Width() + 100,rectWnd.Height(),SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);CRect rectButton(rectWnd.Width() + 25, 25,rectWnd.Width()+75, 75);/用程序創(chuàng)建一個按鈕m_button.Create("
9、;Button", BS_PUSHBUTTON, CRect(rectWnd.Width(), 25,rectWnd.Width()+75, 50) , this, 1);/顯示這個按鈕m_button.ShowWindow( SW_SHOW );CenterWindow();return bResult;效果如下:使用方案三雖然能在主對話框中加入控件,但是也比較麻煩,首先所加的控件只能在屬性頁的右邊或下邊。并且用程序來產(chǎn)生控件比較煩瑣,位置與大小不易控制。那么還有其他方法,既能在對話框中加入屬性頁,又能在主對話框隨意添加控件?還是有的,看看方案四。 方案四本方案的例子請見源代碼打包
10、文件中的Property4部分這次我們不從CPropertySheet繼承自己的類,還是直接使用它。各屬性頁的子對話框類還是需要的,創(chuàng)建方法和上述兩個方案相同。 首先我們新建一個基于對話框的工程。在編輯已有的一個主對話框中可以自由加一些所需的控件,但是得留出一定的空間用于放置屬性頁。在主對話框類里加入一個CPropertySheet類的一個成員變量(m_sheet)代表整個屬性頁。再加入一些各子對話框類的實例作為成員變量(m_page1、m_page2)。在主對話框類的OnInitDialog()函數(shù)中加入:/加入標(biāo)簽,標(biāo)簽名由各個子對話框的標(biāo)題欄決定m_sheet.AddPage(&
11、m_page1);m_sheet.AddPage(&m_page2);/用Create來創(chuàng)建一個屬性頁m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);RECT rect;m_sheet.GetWindowRect(&rect);int width = rect.right - rect.left;int height = rect.bottom - rect.top;/調(diào)整屬性頁的大小和位置m_sheet.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE |
12、SWP_NOZORDER | SWP_NOACTIVATE);效果如下:這個方案可以自由在主對話框中加一些必要的控件,而且屬性頁中的控件也都分散在了各個子對話框類中,使用非常方便。 但是這樣也有一些缺陷:主對話框不能處理屬性頁上標(biāo)簽的消息,即點擊標(biāo)簽時無法通知主對話框。(可能筆者水平有限,理論上應(yīng)該可以,但筆者尚未解決這個問題)方案五本方案的例子請見源代碼打包文件中的Property5部分這次我們?nèi)匀灰褂肨ab Control,并且從CTabCtrl控件類繼承自己的類(CTabSheet)來處理。(此方法來自CodeGuru的一篇文章,本人稍做修改使其使用更簡便) 首先我先介紹一下如何使用C
13、TabSheet。先要制作子對話框類,這次的子對話框類不要從CPropertyPage繼承,而是直接從CDialog繼承。并且各個子對話框資源的屬性應(yīng)設(shè)置為:Style為Child, Border為None。在主對話框資源中,加入一個Tab Control,并且適當(dāng)調(diào)整位置和大小。利用ClassWizard來為這個Tab Control創(chuàng)建一個CTabSheet的控件變量。在主對話框的OnInitDialog()加入:m_sheet.AddPage("tab1", &m_page1, IDD_DIALOG1);m_sheet.AddPage("tab2&q
14、uot;, &m_page2, IDD_DIALOG2);m_sheet.Show();就這樣就可以在對話框上制作出一個完美的屬性頁了。效果和上圖完全一樣。 下面我就來講講CTabSheet類的細(xì)節(jié)內(nèi)容。CTabSheet是從CTabCtrl繼承來的,用于Tab Control的控件類。在類中有一個成員變量用來記錄各子對話框的指針CDialog* m_pPagesMAXPAGE; MAXPAGE是該類所能加載的標(biāo)簽的最大值。類中有一個AddPage方法,用于記錄子對話框的指針和所使用對話框資源的ID號。BOOL CTabSheet:AddPage(LPCTSTR title, CDia
15、log *pDialog,UINT ID)if( MAXPAGE = m_nNumOfPages )return FALSE;/保存目前總的子對話框數(shù)m_nNumOfPages+;/記錄子對話框的指針、資源ID、要在標(biāo)簽上顯示的文字m_pPagesm_nNumOfPages-1 = pDialog;m_IDDm_nNumOfPages-1 = ID;m_Titlem_nNumOfPages-1 = title;return TRUE;在使用AddPage加入了若干子對話框后,必須調(diào)用CTabSheet的Show方法來真正生成標(biāo)簽和子對話框。 void CTabSheet:Show()/利用CD
16、ialog:Create來創(chuàng)建子對話框,并且使用CTabCtrl:InsertItem來加上相應(yīng)的標(biāo)簽for( int i=0; i < m_nNumOfPages; i+ )m_pPagesi->Create( m_IDDi, this );InsertItem( i, m_Titlei );/由于對話框顯示時默認(rèn)的是第一個標(biāo)簽被選中,所以應(yīng)該讓第一個子對話框顯示,其他子對話框隱藏m_pPages0->ShowWindow(SW_SHOW);for( i=1; i < m_nNumOfPages; i+)m_pPagesi->ShowWindow(SW_HIDE
17、);SetRect();生成好標(biāo)簽和子對話框后,調(diào)用CTabSheet:SetRect來計算并調(diào)整屬性頁的大小。void CTabSheet:SetRect()CRect tabRect, itemRect;int nX, nY, nXc, nYc;/得到Tab Control的大小GetClientRect(&tabRect);GetItemRect(0, &itemRect);/計算出各子對話框的相對于Tab Control的位置和大小nX=itemRect.left;nY=itemRect.bottom+1;nXc=tabRect.right-itemRect.left-
18、2;nYc=tabRect.bottom-nY-2;/利用計算出的數(shù)據(jù)對各子對話框進(jìn)行調(diào)整m_pPages0->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);for( int nCount=1; nCount < m_nNumOfPages; nCount+ )m_pPagesnCount->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);在單擊標(biāo)簽欄后,應(yīng)該是相應(yīng)的子對話框顯示,正在顯示的子對話框應(yīng)該隱藏。因此利用ClassWiz
19、ard來處理WM_LBUTTONDOWN消息。void CTabSheet:OnLButtonDown(UINT nFlags, CPoint point) CTabCtrl:OnLButtonDown(nFlags, point);/判斷是否單擊了其他標(biāo)簽if(m_nCurrentPage != GetCurFocus()/將原先的子對話框隱藏m_pPagesm_nCurrentPage->ShowWindow(SW_HIDE);m_nCurrentPage=GetCurFocus();/顯示當(dāng)前標(biāo)簽所對應(yīng)的子對話框m_pPagesm_nCurrentPage->ShowWind
20、ow(SW_SHOW);這樣利用CTabSheet這個類就可以輕松地在對話框上放置自己的屬性頁了,并且控件都分散在各子對話框類中,符合對象封裝的思想。而且用這個方法來制作屬性頁就可以利用ClassWizard來輕松地生成消息映射處理Tab Control的消息了。例如:可以處理TCN_SELCHANGE消息來對切換了標(biāo)簽時進(jìn)行一些動作。 本文共使用了5種方法在對話框中加屬性頁,當(dāng)然應(yīng)該還有其他方法,當(dāng)本人水平有限,如果各位讀者有更好的方法,可不要忘了告訴我。作者信箱:hcl-最新評論 發(fā)表評論 文章投稿查看所有評論 推薦給好友 打印由淺入深層層推進(jìn)非常感謝 ( luoguizhou 發(fā)表于 2
21、008-5-25 10:00:00) 謝謝! ( gaixq 發(fā)表于 2008-3-12 17:05:00) very good articles, thanks for share ( ikohl 發(fā)表于 2007-9-6 11:05:00) 采用方案四,無法調(diào)整屬性頁大小,導(dǎo)致加載的屬性頁被縮小的,能有解決的辦法嗎?高手們,可以加我QQ:77359140,E-Mail:( isabc 發(fā)表于 2007-7-3 14:52:00) 試了下第方案五,效果不錯,比用 CPropertyPage
22、160;簡便多了但該方案中的代碼有些小 BUG,就是在 SetRect() 方法中設(shè)置子對話框的位置時沒有 TabControl 控件的屬性,當(dāng)標(biāo)簽位置不同時,子對話框顯示位置會出錯。解決方法,通過 GetStyle() 獲取 TabControl 的風(fēng)格設(shè)置,判斷 TCS_VERTICAL、TCS_BOTTOM、TCS_RIGHT 是否置位來分別計算子對話框的位置。 ( tuxw 發(fā)表于 2007-6-3 1:17:00) 請教樓主一個問題. 我在工程里運用了最后一種重載TabCtrl的方法,可是出現(xiàn)了一個問題. 在第一個屬性頁里(CDialog)包含一個listCtrl控件. list數(shù)據(jù)大于可視范圍后沒有出現(xiàn)滾動條. 我在
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度訂制尺寸訂框安裝合同
- 2025年度物流企業(yè)合作投資與知識產(chǎn)權(quán)保護(hù)協(xié)議
- 二零二五年度旅游企業(yè)法人景區(qū)經(jīng)營權(quán)轉(zhuǎn)讓合同
- 2025年度股權(quán)激勵協(xié)議書-員工股權(quán)激勵與股權(quán)激勵計劃實施合同范本
- 二零二五年度紅薯種植技術(shù)培訓(xùn)與收購服務(wù)合同
- 關(guān)于業(yè)務(wù)合作的函件示例
- 家裝設(shè)計行業(yè)項目執(zhí)行標(biāo)準(zhǔn)
- 幼兒園教育服務(wù)合作框架協(xié)議
- 初中力學(xué)基礎(chǔ)實驗課教案
- 公司辦公管理規(guī)章制度手冊
- 2025天津市安全員-B證考試題庫附答案
- 二年級下冊數(shù)學(xué)口算題-可打印
- 公司信息化安全規(guī)章制度及操作手冊
- 新風(fēng)施工合同
- 2025-2030年園藝修剪機(jī)器人行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 福建省南平市2024-2025學(xué)年九年級上學(xué)期期末語文試題(解析版)
- 人教版四年級數(shù)學(xué)下冊第四單元測試卷(含答案)
- 2025年湖北省技能高考(建筑技術(shù)類)《建筑工程測量》模擬練習(xí)試題庫(含答案)
- 2023年中國綜合社會調(diào)查調(diào)查手冊
- 2024-2027年中國網(wǎng)絡(luò)安全評估行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略研究報告
- 失智老年人照護(hù)X證書制度試點工作養(yǎng)老護(hù)理職業(yè)和失智老人照護(hù)員工種的發(fā)展講解
評論
0/150
提交評論