读书人

关于tab页显示的有关问题

发布时间: 2012-02-02 23:57:14 作者: rapoo

求助:关于tab页显示的问题
做了三个对话框 , 其中一个(tabdlg)添加了tab控件, 另两个打算做tab页显示, 这两个是从propertypage继承来的对话框。

在TabDlg.cpp中向控制中增加标签,来实现背景设置功能。

BOOL CTabDlg::OnInitDialog()

{ CDialog::OnInitDialog();

TC_ITEM tcItem;//添加标签

tcItem.mask=TCIF_TEXT;

tcItem.pszText="字 间 距";

m_tabCtrl.InsertItem(0,&tcItem);

tcItem.pszText="颜色设置";

m_tabCtrl.InsertItem(1,&tcItem);

m_tabCtrl.SetCurSel(1);

return TRUE;

}

当标签切换时,标签控制会自动向对话框窗口发送TCN_SELCHANGE通知消息,这时需要根据所选择的标签索引号对属性页的显示和隐藏进行切换控制,应完善OnSelchangeTabctrl()函数

我的是这样的


void CTHIRDDlg::OnTcnSelchangeTabSet(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
int iPage = m_tabCtrl.GetCurSel();
switch(iPage){
case 0:
//GetDlgItem()->ShowWindow(SW_HIDE);
//GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_SHOW);
AfxMessageBox(_T("hello"),0,0);
break;
case 1:
//GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_SHOW);
AfxMessageBox(_T("hello2"),0,0);
break;
}
*pResult = 0;
}
当只显示AfxMessageBox(_T("hello"),0,0); 时 可以相应tab页切换
但是在加了GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_SHOW);之后 出现错误
程序跳到了这里
BOOL CWnd::ShowWindow(int nCmdShow)
{
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

if (m_pCtrlSite == NULL)
return ::ShowWindow(m_hWnd, nCmdShow);
else
return m_pCtrlSite->ShowWindow(nCmdShow);
}
IDC_EDIT_MANAGER 是一个我添加在tab页面里的一个编辑框

我这个方法是参考http://www.yourblog.org/data/200512/398951.html
不知道错在哪里




[解决办法]
http://www.diybl.com/course/3_program/vc/vc_js/20071226/93505.html
[解决办法]
你既然用对话框做页面,就直接Page1->ShowWindow(SW_SHOW);就可以控制整个页面隐藏了,不用直接控制页面里的控件

另外你的IDC_EDIT_MANAGER是属于你的页面里的控件,你直接在主对话框力调用GetDlgItem(IDC_EDIT_MANAGER)肯定失败啦
IDC_EDIT_MANAGER又不是当前窗口的控件
[解决办法]

探讨
你既然用对话框做页面,就直接Page1->ShowWindow(SW_SHOW);就可以控制整个页面隐藏了,不用直接控制页面里的控件

另外你的IDC_EDIT_MANAGER是属于你的页面里的控件,你直接在主对话框力调用GetDlgItem(IDC_EDIT_MANAGER)肯定失败啦
IDC_EDIT_MANAGER又不是当前窗口的控件

[解决办法]
CPropertyPage是搭配CPropertySheet使用的,用CTabCtrl应该用CDialog做子对话框。
你可以在主对话框类中定义子对话框变量或指针来控制各个子对话框。
[解决办法]
参见孙鑫的属性对话框代码
[解决办法]
但是在加了GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_SHOW);之后 出现错误?


显然是IDC_EDIT_MANAGER所指的控件还没有建立呢。
[解决办法]
switch(iPage){
case 0:
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_SHOW);
break;
case 1:
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT_MANAGER)->ShowWindow(SW_HIDE);
break;
}

[解决办法]
GetDlgItem()得到的是当前的承载TAB的对话框控件,而你IDC_EDIT_MANAGER是页里面的控件,肯定不行啦!

你要先得到承载IDC_EDIT_MANAGER得对话框,然后再GetDlgItem.

读书人网 >VC/MFC

热点推荐