CTabCtrlにCDialogを埋め込む(VC++) タブにダイアログを埋め込んで、タブ毎のダイアログでコントロールを管理する方法のメモです。
1.親ダイアログ(CTabDlg)にタブコントロールを追加して、関連付け変数のCTabCtrl m_ctrlTabを作ります。 2.リソースエディタで、ダイアログを作成して、スタイルの編集で、ボーダーを無し、子(Child)にするように設定します。関連付けのクラスを作ります。 3.タブコントロール変数の m_ctrlTabからタブを作ります。m_ctrlTabの子ウィンドウとして、ダイアログのインスタンスを2つをつくります。 4.カレントタブが変わるイベントのTCN_SELCHANGEのハンドルで、子ウィンドウのダイアログを表示したり、隠したりします。 5.クラスの一部
// CTabDlgDlg ダイアログ class CTabDlgDlg : public CDialog { // コンストラクション public: CTabDlgDlg(CWnd* pParent = NULL); // 標準コンストラクタ CDlg1* m_pDlg1; CDlg2* m_pDlg2; // ダイアログ データ enum { IDD = IDD_TABDLG_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート // 実装 protected: HICON m_hIcon; // 生成された、メッセージ割り当て関数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: CTabCtrl m_ctrlTab; afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult); }; BOOL CTabDlgDlg::OnInitDialog() { CDialog::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 // タブを2つ作る m_ctrlTab.InsertItem(0, L"Tab1"); m_ctrlTab.InsertItem(1, L"Tab2"); // サイズを計算する CRect r; m_ctrlTab.GetClientRect(&r); r.left +=2; r.right -=4; r.top += 20; r.bottom -= 4; // ダイアログを、タブの子ウィンドウとして作る m_pDlg1 = new CDlg1(&m_ctrlTab); m_pDlg1->Create(CDlg1::IDD, &m_ctrlTab); m_pDlg1->MoveWindow(&r); m_pDlg2 = new CDlg2(&m_ctrlTab); m_pDlg2->Create(CDlg2::IDD, &m_ctrlTab); m_pDlg2->MoveWindow(&r); // タブ0をカレントにし、ダイアログ1を表示する m_ctrlTab.SetCurSel(0); m_pDlg1->ShowWindow(SW_SHOW); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } void CTabDlgDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Add your control notification handler code here *pResult = 0; if (m_ctrlTab.GetCurSel() == 0) { m_pDlg1->ShowWindow(SW_SHOW); m_pDlg2->ShowWindow(SW_HIDE); } else { m_pDlg2->ShowWindow(SW_SHOW); m_pDlg1->ShowWindow(SW_HIDE); } } 6.ソース tabdlg.zip
|