我有一个tabctrl,初始化的时候要显示第一个标签,可是对话框弹出来的时候看得见该标签对话框上的内容(各种控件)闪了一下界面就空白了,如果点到别的标签再回到这个标签,内容能显示,或者拿鼠标在空白区域里晃啊晃也会显示出来。放置tabctrl控件对话框的初始化函数如下:BOOL CDlgStructureAnlys::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
m_tabctrl.InsertItem(0,_T("圆角半径"));
m_tabctrl.InsertItem(1,_T("最小冲孔尺寸"));
m_tabctrl.InsertItem(2,_T("孔间/孔边距(平面)"));
m_tabctrl.InsertItem(3,_T("悬臂/凹槽"));
m_tabctrl.InsertItem(4,_T("弯曲边/孔边距"));
m_tabctrl.InsertItem(5,_T("弯曲半径"));
m_page1.Create(IDD_STRUCTPAGE1,GetDlgItem(IDC_TABCTRL));
m_page2.Create(IDD_STRUCTPAGE2,GetDlgItem(IDC_TABCTRL));
m_page3.Create(IDD_STRUCTPAGE3,GetDlgItem(IDC_TABCTRL));
m_page4.Create(IDD_STRUCTPAGE4,GetDlgItem(IDC_TABCTRL));
m_page5.Create(IDD_STRUCTPAGE5,GetDlgItem(IDC_TABCTRL));
m_page6.Create(IDD_STRUCTPAGE6,GetDlgItem(IDC_TABCTRL));/* m_page1.Create(IDD_STRUCTPAGE1,&m_tabctrl);
m_page2.Create(IDD_STRUCTPAGE2,&m_tabctrl);
m_page3.Create(IDD_STRUCTPAGE3,&m_tabctrl);
m_page4.Create(IDD_STRUCTPAGE4,&m_tabctrl);
m_page5.Create(IDD_STRUCTPAGE5,&m_tabctrl);
m_page6.Create(IDD_STRUCTPAGE6,&m_tabctrl);
*/
CRect rc;
m_tabctrl.GetClientRect(&rc);
rc.top += 41;
rc.bottom -= 3;
rc.left += 2;
    rc.right -= 2; m_page1.MoveWindow(&rc);
m_page2.MoveWindow(&rc);
m_page3.MoveWindow(&rc);
m_page4.MoveWindow(&rc);
m_page5.MoveWindow(&rc);
m_page6.MoveWindow(&rc); m_page1.ShowWindow(FALSE);
m_page2.ShowWindow(FALSE);
m_page3.ShowWindow(FALSE);
m_page4.ShowWindow(FALSE);
m_page5.ShowWindow(FALSE);
m_page6.ShowWindow(TRUE); m_tabctrl.SetCurSel(5); pDialog[0] = &m_page1;
pDialog[1] = &m_page2;
pDialog[2] = &m_page3;
pDialog[3] = &m_page4;
pDialog[4] = &m_page5;
pDialog[5] = &m_page6;
/*
pDialog[0]->ShowWindow(SW_HIDE);
    pDialog[1]->ShowWindow(SW_HIDE);
pDialog[2]->ShowWindow(SW_HIDE);
pDialog[3]->ShowWindow(SW_HIDE);
pDialog[4]->ShowWindow(SW_HIDE);
pDialog[5]->ShowWindow(SW_SHOW);
*/
m_CurSelTab = 5; return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}void CDlgStructureAnlys::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
m_CurSelTab=m_tabctrl.GetCurSel();
pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);

*pResult = 0;
}

解决方案 »

  1.   

    GetClientRect得到的是相对坐标,需要ClientToScreen。
      

  2.   

    应该不是这个问题吧,查了一下,TabCtrl都是用GetClientRect,倒是没有看到过ClientToScreen,相对位置的问题也应该不会让所有控件都显示不出来吧
      

  3.   

    你这样试试:
    BOOL CDlgStructureAnlys::OnInitDialog()  

    CDialog::OnInitDialog(); // TODO: Add extra initialization here m_CurSelTab = -1;pDialog[0] = &m_page1; 
    pDialog[1] = &m_page2; 
    pDialog[2] = &m_page3; 
    pDialog[3] = &m_page4; 
    pDialog[4] = &m_page5; 
    pDialog[5] = &m_page6; m_page1.Create(IDD_STRUCTPAGE1,&m_tabctrl); 
    m_page2.Create(IDD_STRUCTPAGE2,&m_tabctrl); 
    m_page3.Create(IDD_STRUCTPAGE3,&m_tabctrl); 
    m_page4.Create(IDD_STRUCTPAGE4,&m_tabctrl); 
    m_page5.Create(IDD_STRUCTPAGE5,&m_tabctrl); 
    m_page6.Create(IDD_STRUCTPAGE6,&m_tabctrl); CRect rc; 
    m_tabctrl.GetClientRect(&rc); 
    m_tabctrl.ClientToScreen(&rc); 
    rc.top += 41; 
    rc.bottom -= 3; 
    rc.left += 2; 
    rc.right -= 2; m_page1.MoveWindow(&rc); 
    m_page2.MoveWindow(&rc); 
    m_page3.MoveWindow(&rc); 
    m_page4.MoveWindow(&rc); 
    m_page5.MoveWindow(&rc); 
    m_page6.MoveWindow(&rc); m_tabctrl.InsertItem(0,_T("圆角半径")); 
    m_tabctrl.InsertItem(1,_T("最小冲孔尺寸")); 
    m_tabctrl.InsertItem(2,_T("孔间/孔边距(平面)")); 
    m_tabctrl.InsertItem(3,_T("悬臂/凹槽")); 
    m_tabctrl.InsertItem(4,_T("弯曲边/孔边距")); 
    m_tabctrl.InsertItem(5,_T("弯曲半径")); m_tabctrl.SetCurSel(5); return TRUE;  // return TRUE unless you set the focus to a control 
                  // EXCEPTION: OCX Property Pages should return FALSE 
    } void CDlgStructureAnlys::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult)  

    // TODO: Add your control notification handler code here 
    if (m_CurSelTab != -1)
    pDialog[m_CurSelTab]->ShowWindow(SW_HIDE); 
    m_CurSelTab=m_tabctrl.GetCurSel(); 
    pDialog[m_CurSelTab]->ShowWindow(SW_SHOW); *pResult = 0; 
    }
      

  4.   

    m_tabctrl.ClientToScreen(&rc);
    多了这一行反倒是什么都看不到了。
      

  5.   

    ClientToScreen是必须的。
    我有一点搞错了,SetCurSel不会引发TCN_SELCHANGE消息,所以还是要稍稍改一下。
    m_tabctrl.SetCurSel(5);之后加上:
    m_CurSelTab = 5;
    pDialog[5]->ShowWindow(SW_SHOW);
      

  6.   

    依然是看不到。
    另,按以前的写法,主对话框弹出后,貌似各标签对话框初始化函数都响应了(因为各初始化函数里面的afxmessagebox都有反应),不知是何原因。
      

  7.   

    对不起,是我搞错了,这里不能加ClientToScreen。
      

  8.   

    这样写应该不会有问题了。
    BOOL CDlgStructureAnlys::OnInitDialog()   
    {  
    CDialog::OnInitDialog();  // TODO: Add extra initialization here  m_CurSelTab = -1; pDialog[0] = &m_page1;  
    pDialog[1] = &m_page2;  
    pDialog[2] = &m_page3;  
    pDialog[3] = &m_page4;  
    pDialog[4] = &m_page5;  
    pDialog[5] = &m_page6;  m_page1.Create(IDD_STRUCTPAGE1,&m_tabctrl);  
    m_page2.Create(IDD_STRUCTPAGE2,&m_tabctrl);  
    m_page3.Create(IDD_STRUCTPAGE3,&m_tabctrl);  
    m_page4.Create(IDD_STRUCTPAGE4,&m_tabctrl);  
    m_page5.Create(IDD_STRUCTPAGE5,&m_tabctrl);  
    m_page6.Create(IDD_STRUCTPAGE6,&m_tabctrl);  CRect rc;  
    m_tabctrl.GetClientRect(&rc);  
    rc.top += 41;  
    rc.bottom -= 3;  
    rc.left += 2;  
    rc.right -= 2;  m_page1.MoveWindow(&rc);  
    m_page2.MoveWindow(&rc);  
    m_page3.MoveWindow(&rc);  
    m_page4.MoveWindow(&rc);  
    m_page5.MoveWindow(&rc);  
    m_page6.MoveWindow(&rc);  m_tabctrl.InsertItem(0,_T("圆角半径"));  
    m_tabctrl.InsertItem(1,_T("最小冲孔尺寸"));  
    m_tabctrl.InsertItem(2,_T("孔间/孔边距(平面)"));  
    m_tabctrl.InsertItem(3,_T("悬臂/凹槽"));  
    m_tabctrl.InsertItem(4,_T("弯曲边/孔边距"));  
    m_tabctrl.InsertItem(5,_T("弯曲半径"));  m_tabctrl.SetCurSel(5);  
    m_CurSelTab = 5; 
    pDialog[5]->ShowWindow(SW_SHOW); return TRUE;  // return TRUE unless you set the focus to a control  
                  // EXCEPTION: OCX Property Pages should return FALSE  
    }  
      

  9.   

    可能我没有说清楚,并不是用tabcrtl创建属性页失败,各个子对话框可以加载在标签控件下,但是放标签的主对话框弹出的时候,指定的应该首先显示的子对话框像是被刷新过一下消失了,选到其它标签的对话框之后再回来就没有问题了。
      

  10.   

    照下面这样改,试试看:
    m_page1.ShowWindow(TRUE);//修改 
    m_page2.ShowWindow(FALSE); 
    m_page3.ShowWindow(FALSE); 
    m_page4.ShowWindow(FALSE); 
    m_page5.ShowWindow(FALSE); 
    m_page6.ShowWindow(FALSE);//修改m_tabctrl.SetCurSel(0);//修改 pDialog[0] = &m_page1; 
    pDialog[1] = &m_page2; 
    pDialog[2] = &m_page3; 
    pDialog[3] = &m_page4; 
    pDialog[4] = &m_page5; 
    pDialog[5] = &m_page6; 
    /* 
    pDialog[0]->ShowWindow(SW_HIDE); 
        pDialog[1]->ShowWindow(SW_HIDE); 
    pDialog[2]->ShowWindow(SW_HIDE); 
    pDialog[3]->ShowWindow(SW_HIDE); 
    pDialog[4]->ShowWindow(SW_HIDE); 
    pDialog[5]->ShowWindow(SW_SHOW); 
    */ 
    m_CurSelTab = 0;//修改 
      

  11.   

    不能用ShowWindow(TRUE),应该用ShowWindow(SW_SHOW),你按照我上面最后贴的代码试一下,如果还不行可以把代码发到我邮箱:[email protected],我来调试看看。
      

  12.   

    先谢谢你的热心,呵呵。代码在调试的时候没有错误(因为做的是solidworks2007的插件,没装这个软件没法看效果额,我重新建了一个MFC的工程,同样的代码没有问题)您说的ShowWindow(SW_SHOW)我也试过了。现在发现,只要m_tabctrl.SetCurSel(0);这个地方不写0,一开始默认的标签是其它5个的时候,界面就不会变白。比较莫名。
      

  13.   

    CRect rc;
    m_tab.GetClientRect(&rc);
    rc.left+=1;
    rc.top+=20; rc.right-=1;
    rc.bottom-=2;
    m_dlgFaultCfg.MoveWindow(&rc);
    m_dlgFaultInfo.MoveWindow(&rc);
    m_dlgExam.MoveWindow(&rc);
    m_dlgFaultCfg.ShowWindow(SW_SHOW);
    m_dlgFaultInfo.ShowWindow(SW_HIDE);
    比如是m_dlgFaultCfg.ShowWindow(SW_SHOW) 在后面加一句m_dlgFaultCfg.SetFocus()
    ,你是没加这一句话吧。ClientToScreen 不要用这个 啊