例えば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;
}
}
参照