none
关于Tab Control(CTabCtrl)控件的创建与使用 RRS feed

  • 问题

  • 在长期使用这些基础控件的同时,我注意到,这个控件一直不支持可直接翻页的编辑模式,而在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
    2019年8月25日 7:57

答案

  • 你好,

    感谢你在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
    2019年8月26日 6:49

全部回复

  • 你好,

    感谢你在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
    2019年8月26日 6:49
  • 你好,

    你的问题得到解决了吗?如果解决了,请标记有价值的回复为正确答案,或者你有更好的方法,我们也欢迎你分享出来并标记为答案。这会帮助其他有相同问题的社区成员更快地找到解决方案。

    Best Regards,

    Suarez Zhou

    2019年8月28日 2:51
  • 好的,我刚看到,谢谢回复,这个方案暂时可以解决我适应的问题了,谢谢
    2019年8月28日 3:36