MFC TAB标签显示问题

只敲键盘不弹琴 2019-06-04 03:36:36
用TAB控件动态添加页面,在增加了很多页面情况下,删除页面会导致标签页为空,需要手动点击滚动条才刷新标签显示。我的想法是获取当前显示的标签数量为0在代码让滚动条滚动。但是不知道这两个是否有函数整

鼠标点过去居然有标签出来

点滚动条就可以正常显示了


有什么方法可以解决这个显示问题?
...全文
443 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
你的什么系统? VS什么版本? 我的VS2008 Win7 XP下都没有异常呢 实在不行就自绘好了 自绘CTabCtrl控件的实现
我刚用VS2005写了个测试程序,然后放到WIN7上跑也是有一样的问题。我的项目直接选的MFC对话框,然后删除默认的确认取消按钮,添加了ADD和DEL按钮,然后拖了个TAB控件,没做其他设置,代码就是给TAB控件添加了个变量m_Tab,然后就是两个按钮的实现
void CTABtest2005Dlg::OnBnClickedButtonAdd()
{
	// TODO: 在此添加控件通知处理程序代码
	int iTabCount = m_Tab.GetItemCount();
	char titlebuf[32] = { 0 };
	sprintf(titlebuf, "%d PAGE", iTabCount);

	m_Tab.InsertItem(iTabCount, titlebuf);
	m_Tab.SetCurSel(iTabCount);
}

void CTABtest2005Dlg::OnBnClickedButtonDel()
{
	// TODO: 在此添加控件通知处理程序代码

	int iRemoveTab = m_Tab.GetCurSel();

	m_Tab.DeleteItem(iRemoveTab);
	int tabcount = m_Tab.GetItemCount();

	if (tabcount == 0)
	{
		m_Tab.SetCurSel(-1);
	}
	else if (iRemoveTab == tabcount)       //删除的是最后一页
	{
		m_Tab.SetCurSel(iRemoveTab - 1);
	}
	else
	{
		m_Tab.SetCurSel(iRemoveTab);
	}
}
测试程序代码就完了,开始测试就是先不断的点ADD,点了20几个标签,然后在点DEL,删除完当前显示的,都出现上面的问题了
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
你的什么系统? VS什么版本? 我的VS2008 Win7 XP下都没有异常呢 实在不行就自绘好了 自绘CTabCtrl控件的实现
你提供的自绘只是绘制选项卡的背景和字体等颜色,也是继承CTabCtrl类,应该解决不了我这个问题,我自己这边也有重绘这一块,虽然实现上略有不同,但是原理是一样的
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
你的什么系统? VS什么版本? 我的VS2008 Win7 XP下都没有异常呢 实在不行就自绘好了 自绘CTabCtrl控件的实现
win10系统,VS2013,谢谢
  • 打赏
  • 举报
回复
鉴于子对话框挡住的可能性,我重新弄了个测试程序,只包含又两个按钮和一个TAB控件,没有子对话框界面。结果还是有这个问题,而且标签页消失后点击标签页出现的是排在最前的标签所在的位置,点击滚动条后才刷新出正确标签。所以我觉得应该是TAB控件本身问题,或者哪里针对这情况设置。或者有没有函数可以获取到TAB自带的滚动条,代码实现触发滚动。 测试代码:
void CTABtestDlg::OnBnClickedButtonAdd()
{
	// TODO:  在此添加控件通知处理程序代码
	int iTabCount = m_Tab.GetItemCount();
	char titlebuf[32] = { 0 };
	sprintf(titlebuf, "%d PAGE", iTabCount);

	m_Tab.InsertItem(iTabCount, titlebuf);
	m_Tab.SetCurSel(iTabCount);
}


void CTABtestDlg::OnBnClickedButtonDel()
{
	// TODO:  在此添加控件通知处理程序代码
	int iRemoveTab = m_Tab.GetCurSel();

	m_Tab.DeleteItem(iRemoveTab);
	int tabcount = m_Tab.GetItemCount();

	if (tabcount == 0)
	{
		m_Tab.SetCurSel(-1);
	}
	else if (iRemoveTab == tabcount)       //删除的是最后一页
	{
		m_Tab.SetCurSel(iRemoveTab - 1);
	}
	else
	{
		m_Tab.SetCurSel(iRemoveTab);
	}
}
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
很明显看出移位了 说明取的父窗口不对 CRect rcRect; m_tab.GetClientRect( &rcRect ); m_tab.AdjustRect(FALSE, &rcRect); if(m_Page.GetParent()) { m_tab.ClientToScreen(&rcRect); //转换到屏幕坐标 m_Page.GetParent()->ScreenToClient(&rcRect); //转到到当前窗口客户区位置 } //移动页面 m_Page.MoveWindow(rcRect);
我按你这代码改了,还是跟上次一样发生了移位,位移的原因应该是用对子对话框设置的父窗体是 pTabPage->Create(nID,GetDlgItem(IDC_TABDB)); //IDC_TABDB是TAB控件ID 如果改成主对话框的就没有位移了,但是问题没能解决。 鉴于都猜测可能是子对话框挡住了,所以我干脆修改了下代码,不创建子对话框,只保留TAB标签,自然就不存在挡住的问题了,但是删除TAB标签还是出现了之前一样的问题。所以我觉得问题应该是在TAB控件本身
zgl7903 2019-06-06
  • 打赏
  • 举报
回复
你的什么系统? VS什么版本? 我的VS2008 Win7 XP下都没有异常呢 实在不行就自绘好了 自绘CTabCtrl控件的实现
zgl7903 2019-06-05
  • 打赏
  • 举报
回复
添加完页面后按Tab控件的坐标调整下子页面位置试试看


CRect rcRect;
m_tab.GetClientRect( &rcRect );
m_tab.AdjustRect(FALSE, &rcRect);
//子页面的父窗口当前窗口?
if(m_Page.GetParent() && m_Page.GetParent()->m_hWnd == m_hWnd)
{
m_tab.ClientToScreen(&rcRect); //转换到屏幕坐标
ScreenToClient(&rcRect); //转到到当前窗口客户区位置
}
//移动页面
m_Page.MoveWindow(rcRect);


zgl7903 2019-06-05
  • 打赏
  • 举报
回复
很明显看出移位了 说明取的父窗口不对

CRect rcRect;
m_tab.GetClientRect( &rcRect );
m_tab.AdjustRect(FALSE, &rcRect);
if(m_Page.GetParent())
{
m_tab.ClientToScreen(&rcRect); //转换到屏幕坐标
m_Page.GetParent()->ScreenToClient(&rcRect); //转到到当前窗口客户区位置
}
//移动页面
m_Page.MoveWindow(rcRect);

  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
添加完页面后按Tab控件的坐标调整下子页面位置试试看

CRect rcRect;
m_tab.GetClientRect( &rcRect );
m_tab.AdjustRect(FALSE, &rcRect);
//子页面的父窗口当前窗口?
if(m_Page.GetParent() && m_Page.GetParent()->m_hWnd == m_hWnd)
{
  m_tab.ClientToScreen(&rcRect); //转换到屏幕坐标
  ScreenToClient(&rcRect); //转到到当前窗口客户区位置
}
//移动页面
m_Page.MoveWindow(rcRect); 
还是出现了这种现象,这个测试代码还没有加窗体拉伸,所以很明显看出移位了
  • 打赏
  • 举报
回复
引用 1 楼 Eleven 的回复:
是不是你的Tab控件上的子对话框大小太大挡住了Tab标签?
应该不是,我的对话框和自对话框都做了可拉伸,控件的位置也正常,应该不是挡住了。鼠标移到每出现的TAB上点击,又能出现一个,也只能出现一个,移开点击另外一个,原来出现的又消失了。。但是点击滚动条的按钮,就能刷出来。所以我琢磨着没有好的解决方法,就获取当前显示的标签数量,在代码实现点击滚动条。但是今天往TAB的滚动条发滚动消息没效果,获取滚动条也获取的都是空。 //CScrollBar* tabSc = m_Tab.GetScrollBarCtrl(SB_HORZ); //SB_HORZ SB_VERT SB_CTL SB_BOTH ::SendMessage(m_Tab.m_hWnd, WM_HSCROLL, MAKEWPARAM(SB_PAGELEFT, 0), NULL);
Eleven 2019-06-04
  • 打赏
  • 举报
回复
是不是你的Tab控件上的子对话框大小太大挡住了Tab标签?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧