MFC——仿TabCtrl实现多页显示

在MFC中有自带的TabCtrl可以实现多页,但是那个标签放在上面,不太美观,并且字体格式也比较固定,当然这个标签头是可以重绘的。

首先,为什么要有多页显示的需求?就是在切换不同功能按钮的时候,能相应的显示出来。这样,就比较清晰。有人说,那也可以把所有的内容都放在一个界面上,在功能切换的时候,显示要显示的,隐藏不要显示的。没错,这样是可以实现,不过这样一个是界面布局很乱,另外就是,增加需要额外的界面控制逻辑,也很乱,在就是在业务处理上,也会出现一个按钮可能属于这个功能界面上,也有可能属于哪个功能界面上,这样也挺乱的。所以,需要不用的功能页用不用的界面。这也就是TabCtrl存在的意义。只是这个,并不想android里的TabHost那样好用,或者说,android里提供的方法,做界面要容易很多,不过也有可能是本人对MFC不够熟悉。言归正传,说TabCtrl。它虽然可以实现这种功能,但是表头太丑陋了。现在很多应用都在其上封装了自己的用的东西,像listCtrl、TabCtrl这样的。听说QQ的界面库做了2,3年。技术是在不断更新的,所以产品和项目里的技术也要用相对新的技术来实现。

这里想说一种简单的方法,当然不是最好的。

首先创建2个测试用的对话框,DlgTest1、DlgTest2,界面上放不同的按钮就好。

然后在主界面上放2个button,button1和button2,点button1显示DlgTest1,点button2显示DlgTest2。

在主界面的OnInitDialog()里添加:

 

[cpp][/cpp] view plaincopy

  1. m_test1.Create(IDD_DLG_TEST1, this);
  2. m_test2.Create(IDD_DLG_TEST2, this);
  3. CRect rect;
  4. GetClientRect(&rect);
  5. m_Rect.bottom = rect.bottom-20;
  6. m_Rect.top = rect.top + 20;
  7. m_Rect.left = rect.left + 120;
  8. m_Rect.right = rect.right-20;
  9. //默认显示test1
  10. m_test1.MoveWindow(m_Rect);
  11. m_test1.ShowWindow(SW_SHOW);

这里的m_Rect是显示Dlg的区域。

 

在OnPaint()里添加:

 

[cpp][/cpp] view plaincopy

  1. dc.Rectangle(&m_Rect);

然后在button1的按钮事件里添加:

 

 

[cpp][/cpp] view plaincopy

  1. m_test2.ShowWindow(SW_HIDE);
  2. m_test1.MoveWindow(m_Rect);
  3. m_test1.ShowWindow(SW_SHOW);

在button2的按钮事件里添加:

 

 

[cpp][/cpp] view plaincopy

  1. m_test1.ShowWindow(SW_HIDE);
  2. m_test2.MoveWindow(m_Rect);
  3. m_test2.ShowWindow(SW_SHOW);

 

这样就可以了,这也就是仿TabCtrl实现多页的效果。这个比重绘表头要简单些,当然也可以重绘表头这种,不过需要一点时间来研究和积累的。接下来有时间我会尝试的去做的,有一起的吗?

标签