积极答复者
关于Tab Control(CTabCtrl)控件的创建与使用

问题
-
在长期使用这些基础控件的同时,我注意到,这个控件一直不支持可直接翻页的编辑模式,而在C#,以及C++ CLR,即基于.NET开发模式下都可支持直接按页编辑。
所以,这个时候,就需要动态进行部署页面,最常用的模式为一页一个对话框,大致创建模式如下:
// 第一步:添加Tab标题 m_wndTab.InsertItem(0,_T("第一页")); m_wndTab.InsertItem(2,_T("第二页")); // 第二步:建立各Tab页 m_test1Page.Create(IDD_Test1_Dlg, GetDlgItem(IDC_TAB1)); m_test2Page.Create(IDD_Test2_Dlg, GetDlgItem(IDC_TAB1)); // 第三步:设置页面的位置在m_wndTab控件范围内 CRect rc; m_wndTab.GetClientRect(rc); rc.top += 21; rc.bottom -= 1; rc.left += 1; rc.right -= 1; m_test1Page.MoveWindow(rc); m_test1Page.ShowWindow(SW_SHOW); m_test2Page.MoveWindow(rc); m_test2Page.ShowWindow(SW_HIDE);
这样就可以创建出了一个对应的Tab和页面,然后在根据Tab切换切面的事件进行隐藏和现实。
但是,问题是,就出在位置调整的代码上,尤其是rc.top这里可能不同的电脑会出现不一样的情况,这就导致有可能会出现一丝空隙或者是被覆盖了一些,如下图的情况,是我早前建立的一段程序
这个截图,外面一个Tab稍微有点往上了,其实往上还好,但是之前出现过往下的情况就是空出了一丝空白就很难受。
然后里面那个Tab就出现问题了,有很大一片空白,而在我早前开发的时候其实这个位置都是确定已经调整好的
所以在此,想问下,CTabCtrl控件除了这种创建方式还有其他的创建方式吗,我目前手里有一个重载CTabCtrl控件类的,全部动态使用这个类来加入这个控件,但是其过程也挺麻烦的,代码量也不少,但创建出来后是挺标准的一个Tab,Tab页里面的背景色也都是白色,外面也不需要进行响应页面的切换,因为派生类里面已经实现了。如下图:
这种创建方式,唯一一点,目前这个派生类不太够用,好多控件需要设置高度的情况我还得要重新修改拓展这个类,而且,确实都是纯代码创建了。
另外,这个可编辑的功能我也向微软提了意见。
不知道这个控件还有其他的方式建立吗?谢谢各位了。控件虽然简单,但是,这个确实如果对于界面有要求的话,对话框插入的方式可能确实不太完美。
- 已编辑 hili210 2019年8月25日 7:59
答案
-
你好,
感谢你在MSDN论坛发帖。
>>尤其是rc.top这里可能不同的电脑会出现不一样的情况,这就导致有可能会出现一丝空隙或者是被覆盖了一些
看了下你主要的问题来源于不同电脑的选项卡高度不同,由于你设置的为固定值21,所以导致你的程序在不同电脑上表现不一样。我认为可能CTabCtrl控件的选项卡默认高度是根据字体的高度来变化的。这样的话不如尝试下设置选项卡高度,这样所有的电脑都会有一个相同的选项卡高度,而不是根据电脑默认值设定。你的程序表现也会趋于稳定。
方法如下:
1. 设置你的CTabCtrl控件的Style为Fixed Width。
2. 调用CTabCtrl控件的方法SetItemSize(CSize size);//CSize的两个变量为选项卡的宽度和高度。
>>不知道这个控件还有其他的方式建立吗?
很抱歉,我暂时没有更好的想法,如果单纯想解决你目前的这个问题,可以尝试下上面的方法。
Best Regards,
Suarez Zhou
- 已标记为答案 hili210 2019年8月28日 3:36
全部回复
-
你好,
感谢你在MSDN论坛发帖。
>>尤其是rc.top这里可能不同的电脑会出现不一样的情况,这就导致有可能会出现一丝空隙或者是被覆盖了一些
看了下你主要的问题来源于不同电脑的选项卡高度不同,由于你设置的为固定值21,所以导致你的程序在不同电脑上表现不一样。我认为可能CTabCtrl控件的选项卡默认高度是根据字体的高度来变化的。这样的话不如尝试下设置选项卡高度,这样所有的电脑都会有一个相同的选项卡高度,而不是根据电脑默认值设定。你的程序表现也会趋于稳定。
方法如下:
1. 设置你的CTabCtrl控件的Style为Fixed Width。
2. 调用CTabCtrl控件的方法SetItemSize(CSize size);//CSize的两个变量为选项卡的宽度和高度。
>>不知道这个控件还有其他的方式建立吗?
很抱歉,我暂时没有更好的想法,如果单纯想解决你目前的这个问题,可以尝试下上面的方法。
Best Regards,
Suarez Zhou
- 已标记为答案 hili210 2019年8月28日 3:36