MFCにおけるCPropertySheetとCTabCtrlの使用


一、コントロールの紹介
MFCには多くの有用なクラスがカプセル化されており,CTabCtrlとCPropertySheetはその中の2つの比較的一般的なタイプである.CTabCtrlはTabコントロールに対応するクラスであり、WindowsアプリケーションではTabコントロールが大量に使用されている.プロパティページはCPropertySheetに対応しており、デスクトップ上で右クリックしてポップアップ表示ダイアログボックスがCPropertySheetタイプのオブジェクトです.実際、このようなポップアップされた「プロパティページ」のようなウィンドウの大部分はCPropertySheetです.
実は、この2つのクラスの間にも密接なつながりがあります.Spy++を使用してプロパティページウィンドウを観察すると、Tabコントロールも含まれています.
二、属性ページの使用
プロパティページの使用は比較的簡単で、プロセスもはっきりしています.まず、CPropertySheetとCDialogダイアログクラスは同じようにCWndクラスに派生しているので、彼ら2人は似たようなところがたくさんあります.私はこの兄弟があまりにも似ているのではないか分からないので、Spy++は私が自分で作ったCPropertySheetウィンドウをCDialogと認識しました.
プロパティ・ページとダイアログ・ボックスが似ている以上、プロパティ・ページのクラスが1つあれば、DoModal()メソッドを使用してモードのウィンドウを生成したり、Create()を使用して非モードのウィンドウを生成したりすることができます.注意非モードのウィンドウが表示される場合、変数の生存期間の問題を考慮するのは、非モードダイアログボックスと同じです.
プロパティページウィンドウの中にそんなに多くのタブがどのように作られていますか?CPropertyPageが必要です.これはダイアログ・ボックス・クラスのサブクラスで、タブに対応しています.プロパティ・ページでは、AddPage()メソッドを使用してタブを追加します.
タブがダイアログである以上、リソースウィンドウでダイアログを作成し、クラスウィザードを使用してクラスを作成します.CPropertyPageから派生することを選択することに注意してください.MSDNでは、このようなダイアログ・ボックスのリソース・テンプレートを作成する際にいくつかの注意点について説明しています.
1.TitleBarプロパティを保持します.ダイアログのタイトルは、将来タブに表示されるラベルです.
2.ダイアログスタイルはChild、枠線はThin
3.ダイアログをDisabledにする
では、プロパティページの使用手順をまとめてみましょう.
1.テンプレートリソースを構築し、必要なCPropertyPageを構築します.
2.CPropertySheetクラスを使用して、少なくとも1つのタブをAddPage()メソッドで追加します.あるいは、独自のCMyPropertySheetクラスを派生させ、メンバー変数として各CPropertyPageを内部に追加し、コンストラクション関数でAddPageを使用することもできます.
3.プロパティ・ページを使用する必要がある場所で変数を宣言し、DoModal()またはCreate()メソッドを使用してプロパティ・ページを表示します.
三、Tabコントロールの使用
Tabコントロールは一般的にダイアログボックスで使用されます.私から見ればTabコントロール自体は複雑ではありませんが、簡単なボタンのセットです.各タブを直接操作することはできません.ユーザー選択タブの動作に手動で応答する必要があります.
たとえば、各タブに異なるコンテンツを表示するには、不要なコンテンツを表示/非表示にする必要があります.各タブの内容が多い場合は、ダイアログボックスなどのコンテナに配置できます.これにより、タブはダイアログボックスに対応し、関係が明確になります.これらのダイアログボックスは、タイトルバー、Childスタイル、枠線なし、非モードに設定する必要があります.これを例にとると、ダイアログボックスでTabコントロールを使用するには
1.タブコントロールをダイアログに追加
2.各タブのダイアログテンプレートリソースを作成する
3.Tabコントロールに応答するTCN_SELCHANGEメッセージは、OnSelChange()関数で、表示したいタブをShowWindow()関数で表示し、その他を非表示にします.非モードダイアログの生存期間の問題はここに依然として存在し、無視できない.
4.Tabコントロールを初期化します.ダイアログの初期化時にOnSelChange()関数を手動で呼び出す方法で実現できる.
CTabCtrlまたはCPropertySheetを使用してラベル・ページを実装します.
CTabCtrl
1.MFCアプリケーションを作成してから、リソースマネージャにダイアログを新規作成し、対応するクラスを作成し、ツールボックスからTab Controlコントロールをダイアログに入れます.
ダイアログクラスで、CTabCtrl変数を宣言します.
CTabCtrl m_tab;
変数m_タブは、ダイアログボックスのタブコントロールと対話するために使用されます.そのため、DoDataExchange関数にDDX_を追加します.Control文:
DDX_Control(pDX, IDC_TAB_NEW, m_tab);
IDC_TAB_NEWは、Tab ControlコントロールのIDです.
2.Tab Controlコントロールの2ページとして使用する2つの新しいダイアログを作成します.StyleをChild、BorderをNoneに変更することを忘れないでください.その後、他のコントロールを追加することができます.
次に、CPage 1とCPage 2のような2つのダイアログボックスに2つのクラスを作成します.
次に、ダイアログ・クラス・ヘッダ・ファイルに、この2つのダイアログ・オブジェクトを追加します.変数int m_を同時に追加CurSelTabは、どのPageが切り替えられるかを示すために使用されています.
int m_CurSelTab; CPage1 m_page1; CPage2 m_page2; CDialog* pDialog[2];//ダイアログ・ボックス・オブジェクト・ポインタの保存
ダイアログクラスの初期化関数では,CPage 1,CPage 2,Tab Controlを関連付けてページアドレスを保存し,初期ページを設定する必要がある.
// Tab Control        
m_tab.InsertItem(0, _T("Farm"));  
m_tab.InsertItem(1, _T("Note"));  
  
//         
m_page1.Create(IDD_DIALOG1, &m_tab);  
m_page2.Create(IDD_DIALOG2, &m_tab);  
  
//   Tab        
CRect rc;  
m_tab.GetClientRect(rc);  
rc.top += 20;  
  
m_page1.MoveWindow(&rc);  
m_page2.MoveWindow(&rc);  
  
//              
pDialog[0] = &m_page1;  
pDialog[1] = &m_page2;  
  
//        
pDialog[0]->ShowWindow(SW_SHOW);  
pDialog[1]->ShowWindow(SW_HIDE);  
  
//        
m_CurSelTab = 0;

ここではCDialogポインタ配列を用いてTab Controlの各ページを保存し,配列の大きさはTab Controlページの個数であり,配列の下には各ページのインデックスが対応している(これにより迅速なアクセスが容易である).次に、Tab Controlにメッセージハンドラを追加します.
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_NEW, &CTabDlg::OnTcnSelchangeTabNew)
void CTabDlg::OnTcnSelchangeTabNew(NMHDR *pNMHDR, LRESULT *pResult)  
  
{  
    //             
    pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);  
  
    //           
    m_CurSelTab = m_tab.GetCurSel();  
  
    //            
    pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);  
    *pResult = 0;  
}

3.Tab Controlコントロールの外部で内部ダイアログボックスのコントロールのデータを取得するには、DDX/DVDメカニズムを使用し、対応するUpdateData関数を呼び出す必要があります.
m_page1.UpdateData(); 
m_page2.UpdateData();
CPropertySheet
1.MFCアプリケーションを作成してから、エクスプローラに新しいダイアログを作成し、対応するクラスを作成します.このダイアログを編集すると、必要なコントロールを自由に追加できますが、
タブをクリックします.メインダイアログクラスにCPropertySheetクラスのメンバー変数m_を追加sheetはラベルページ全体を表します.
2.次に2つのダイアログを作成し、それに対応する2つのクラスを作成する場合は、ベースクラスをCPropertyPageとして選択することに注意してください.新しく生成された2つのクラスがCPage 1,CPage 2であると仮定する.
3.先ほどm_に加入しましたsheetメンバーの位置、上記のタイプのメンバー変数m_を加えるpage1,m_page2.
CPropertySheet m_sheet;
CPage1        m_page1;
Cpage2         m_page2;
メインダイアログクラスのOnInitDialog()関数に次のものを追加します.
//    ,                   
m_sheet.AddPage(&m_page1);  
m_sheet.AddPage(&m_page2);  
  
//      title   
m_page1.m_psp.dwFlags|=PSP_USETITLE;   
m_page1.m_psp.pszTitle= "   A";   
  
m_page2.m_psp.dwFlags|=PSP_USETITLE;   
m_page2.m_psp.pszTitle= "   B";   
  
// Create           
m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);  
  
//  m_sheet     
RECT rect;  
GetWindowRect(&rect);  
m_sheet.MoveWindow(&rect);