プログラミングメモ →目次

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