我不想用CPropertySheet和来做属性页,我选择了CTabCtrl,然后在CTabCtrl内添加对话框。过程大致如下:一、在对话框 COutDlg 中添加一个 TabCtrl,ID=IDC_TAB_CTRL二、建立一个对话框CInDlg(ID=IDD_DLG_IN),并添加一个 CListCtrl 控件,ID=IDC_LIST三、建立其他的CIn1Dlg, CIn2Dlg,分别作为TabCtrl的第2页和第3页四、在COutDlg中添加成员变量:
    CInDlg m_dlgIn;   CIn1Dlg m_dlgIn1;  CIn2Dlg m_dlgIn2;
    CTabCtrl m_tab;五、在COutDlg::OnInitDialog(...)中添加创建对话框的内容:
CRect rect;
m_dlgIn.Create(IDD_DLG_IN, this);// 创建对话框
m_dlgIn.GetWindowRect(&rect);    // 获得对话框的大小
m_dlgIn.MoveWindow(20, 30, rect.Width(), rect.Height());
m_dlgIn.ShowWindow(SW_HIDE);     // 并设置为隐藏 m_dlgIn1.Create(IDD_DLG_IN1, this);// 创建对话框
m_dlgIn1.MoveWindow(20, 30, rect.Width(), rect.Height());
m_dlgIn1.ShowWindow(SW_HIDE);     // 并设置为隐藏...
六、重载COutDlg::OnSelchangeTab和COutDlg::OnSelchangingTab
void COutDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
{
    switch (m_tab.GetCurrentSel()) {
    case 0: m_dlgIn.ShowWindow(SW_SHOW); break;
    case 1: m_dlgIn1.ShowWindow(SW_SHOW); break;
    case 2: m_dlgIn2.ShowWindow(SW_SHOW); break;
    default:  m_dlgIn.ShowWindow(SW_SHOW); break;
    }
}
void CRouterDlg::OnSelchangingTab(NMHDR* pNMHDR, LRESULT* pResult) 
{
    switch (m_tab.GetCurrentSel()) {
    case 0: m_dlgIn.ShowWindow(SW_HIDE); break;
    case 1: m_dlgIn1.ShowWindow(SW_HIDE); break;
    case 2: m_dlgIn2.ShowWindow(SW_HIDE); break;
    default:  m_dlgIn.ShowWindow(SW_HIDE); break;
    }
}然后 编译 连接 运行,没问题。但是:   如果你在CInDlg中的CListCtrl中单击(使CListCtrl获得焦点)后,再用其他的一个窗口放到最前面(将CListCtrl空间盖住),然后再将我们的对话框切换到最前面来时,可怜的CListCtrl却不会刷新!!!!!!
   为什么?
   是我少了什么步骤了吗? 各位给各提示,OK?

解决方案 »

  1.   

    还有一点我测试了:好像是CTabCtrl盖住的部分不会更新,而其他的部分还是会更新的。
      

  2.   

    可以看一下你的代码吗??[email protected]
      

  3.   

    feiniaoliang(飞鸟良) 
     
    我已经帮你发送过去了,帮忙看看,OK?谢谢
      

  4.   

    烂烂地搞定——在COutDlg::OnPaint的
    if (IsIconic())
        ....
    else
    {
        CDialog::OnPaint();
        m_dlgIn.Invalidate();
        m_dlgIn1.Invalidate();
        m_dlgIn2.Invalidate();
    }