程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在VC對話框中加入屬性頁

在VC對話框中加入屬性頁

編輯:vc教程

  當一個基於對話框的程序中有相當多的控件時,你一定會想到使用屬性頁來將這些控件分類放置。本文針對這種方法來討論幾種可能實現的方案。

  方案一

  本方案的例子請見源代碼打包文件中的Property1部分

  在對話框上放置一個Tab Control的控件,再在對話框上放置所需的控件(本例放置了2個按鈕,試圖在每個標簽中顯示一個)。然後利用Class Wizard來為Tab Control控件創建一個控件變量,該變量是CTabCtrl類的,再為其他控件也創建相應的控件類。 在主對話框的初始函數中CProperty1Dlg::OnInitDialog()加入如下代碼:

//本例插入兩個標簽,實際運用中可通過循環插入所需個數的標簽,運行後默認第一個標簽被選中
m_tab.InsertItem( 0, _T("Tab1") );
m_tab.InsertItem( 1, _T("Tab2") );
//將不是第一個標簽的控件隱藏掉,只留下你要的控件
m_button2.ShowWindow( SW_HIDE );

  再利用ClassWizard處理Tab Control的 TCN_SELCHANGE 的消息。在消息處理函數中,利用CWnd::ShowWindow來使相應的控件顯示和隱藏。

void CProperty1Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
//GetCurSel返回當前被選中的標簽的索引號(以0為基礎算起)
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;
}

  這樣做以後就可以使界面上的控件在不同的標簽中顯示了,但是這個方案也有很多弊病。

  所有的控件仍然在一個對話框內,在使用對話框編輯器進行編輯時,操作很不方便。

  為了能分類顯示控件,必須用ClassWizard為每一個控件創建一個控件變量,以便利用各控件變量的CWnd基類的ShowWindow函數來顯示和隱藏。有時為了使用DDX和DDV機制來進行數據交換,還要創建一些存放值的變量,這樣就使得整個對話框類變得相當龐大難以操作。

  當然你也可以使用數組來存放那些控件變量或值變量,但是這樣並不是最好,有時一些不相關的控件變量放入一個數組中,通過沒有實際意義的數組索引號來訪問控件,對程序的編寫會造成麻煩。 最好能將所有控件進行分類,放入不通對話框類中,這些對話框作為子對話框出現在主對話框中。可以。現在看看方案二。

  方案二

  本方案的例子請見源代碼打包文件中的Property2部分

  這個方案中,我將使用MFC中現成的CPropertySheet和CPropertyPage類來完成將控件分散到各個對話框類中。本文發表於http://bianceng.cn(編程入門網)

  首先加入兩個(或數個)對話框資源。修改各對話框資源的屬性,將對話框的Caption屬性改為你要在標簽上所顯示的文字。將對話框的Style屬性改為:Child, Border屬性改為:Thin, 只選中Title Bar復選框,去掉其他復選框。然後你可以在這些對話框中加入要分開顯示的各個控件。

  為上述對話框資源分別制作一個對話框類,該對話框類是從CPropertyPage繼承。這樣一來各子對話框類就好了,主對話框類可以直接使用CPropertySheet類。使用如下代碼即可:

  CPropertySheet sheet("屬性頁對話框");
CPage1 page1;
CPage2 page2;
//加入子對話框作為一個屬性頁
sheet.AddPage(&page1);
sheet.AddPage(&page2);
//產生一個模態對話框,也可以使用Create方法來產生一個非模態對話框(具體參見MSDN)
sheet.DoModal();

  這樣這個對話框效果如下:

  但是會有人問,如何在主對話框中放置其他控件呢?如果直接使用CPropertySheet的話,是不可以的,但是別忘了我們可以從CPropertySheet類繼承自己的類啊!下面來看看方案三的做法。

  方案三

  本方案的例子請見源代碼打包文件中的Property3部分

  首先還是要創建那些要在屬性頁中的顯示的子對話框類,創建步驟和方案二一樣,都是從CPropertyPage繼承。

  這次我們將從CPropertySheet類繼承自己的類(假設類名為CMySheet)。我們要在這裡放上一個button控件。那麼現在先在CMySheet中加入一個CButton類的成員變量m_button。

  在CMySheet類中的OnInitDialog()函數裡,這樣寫:

  BOOL bResult = CPropertySheet::OnInitDialog();
//取得屬性頁的大小
CRect rectWnd;
GetWindowRect(rectWnd);
//調整對話框的寬度
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);
//用程序創建一個按鈕
m_button.Create("Button", BS_PUSHBUTTON, CRect(rectWnd.Width(), 25,rectWnd.Width()+75, 50) , this, 1);
//顯示這個按鈕
m_button.ShowWindow( SW_S

[1] [2] [3] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved