Last Updated 2002/07/24
Programming Tips Visual C++ MFC ダイアログ プロパティシート  索 引 
プロパティページの無効化
2002/07/24

例えば1ページ目の状態により他のページを無効にしたい場合など.

1番簡単なのは,CTabControl を EnableWindow() すればタブ全体が無効となる.
(が,グレーダウンしない)

標準の方法では出来ない為ちょっとした操作が必要になる.

CMyPropertySheetクラス定義
{
private:
    BOOL m_bPageEnable[16];             // 最大ページ数

public:
    void EnablePage(int, BOOL);
    BOOL IsPageEnable(int nPage) {return m_bPageEnable[nPage];}
    void TogglePage(int);

};
-----------------------------------------------------------------


void CMyPropertySheet::EnablePage(int nPage, BOOL sw)
{
    m_bPageEnable[nPage] = sw;
    TogglePage(nPage);
}


void CMyPropertySheet::TogglePage(int nPage)
{
  //TABのページ名が書いてある所の外枠を得る
    CTabCtrl* pTab = GetTabControl();
    CRect rect;
    pTab->GetItemRect(nPage, &rect);
    rect.DeflateRect(rect.Height() / 2 + 1, 2);//端っこの方はのける

  //そこに紗をかける(擬似的無効化表示)
    CDC* pDC = pTab->GetDC();
    CPen pen(PS_SOLID, rect.Height(), RGB(128, 128, 128));
    CPen* pOldPen = pDC->SelectObject(&pen);
    pDC->SetROP2(R2_XORPEN);
    pDC->MoveTo(rect.left, (rect.top + rect.bottom) / 2);
    pDC->LineTo(rect.right, (rect.top + rect.bottom) / 2);
    pDC->SelectObject(pOldPen);
    ReleaseDC(pDC);
}
-----------------------------------------------------------------


void CMyPropertyPage1::OnCheck1() 
{
    CMyPropertySheet* pSheet = (CMyPropertySheet*)GetParent();

    if( ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck() )
        pSheet->EnablePage(1, FALSE);
    else
        pSheet->EnablePage(1, TRUE);
}


-----------------------------------------------------------------
BOOL CMyPropertyPage2::OnSetActive() 
{
    CMyPropertySheet* pSheet = (CMyPropertySheet*)GetParent();

    if( pSheet->IsPageEnable(1) ) {
    // 有効
        return CPropertyPage::OnSetActive();  //通常通り
    } else {
    // 無効
        pSheet->SetActivePage(&(pSheet->m_Page1));  //強制的に1ページへ
        pSheet->TogglePage(1);  //無効表示もどき
        return 0;
    }
}


参照
前後のTips
プロパティページの無効化

DSS ProgrammingTipsCGI Ver2.02