CTabCtrl 是界面设计的常用选项。但愿有功能经常无法符合,其实CTabCtrl 有自绘机制,而且在MFC环境下封装的不错。大家自己看就是了,我这里介绍一下WTL环境下的自绘。
先放一个 MFC CTabCtrl自绘机制 http://blog.csdn.net/zgl7903/article/details/5861504 这个里面写得非常清楚了。
先说说如何打开CTabCtrl的自绘功能 ,首先看下官方介绍 ,要使用自绘功能,必须设置Style为 TCS_OWNERDRAWFIXED ,通俗讲,这是必须的。打开了这个属性后,绘制的功能就交给父窗口了,父窗口会收到WM_DRAWITEM的消息。幸好,WTL有完善的自绘机制,具体可以参见http://data.tohnichi-sh.com/wtl/partv_vc6.html
我们的自己的类继承CTabCtrl COwnerDraw 这两个父类以后,自然就获取了DrawItem这个函数。我们要做的就是简单的重载这个函数,自己绘制就可以了。初学的同学,经常搞不明白每次DrawItem到底要绘制哪里,具体参加下图。你每次绘制CTabCtrl就是每个标签头部的区域。你有几个标签,就要绘制几次。
通过DrawItem的入口参数,你可以知道当前你要绘制的是哪个标签头,至于是否选中CTrabCtrl基类提供了丰富的函数让你判断。这样一切的原料都有了,就看你如何做这盘菜了。有的同学喜欢每个在当前选中的标签加个关闭按钮,有的同学比如我,喜欢在整个CTabCtrl加一个关闭按钮。这些都可以通过自绘实现。
注意事项:打开自绘机制后,选中的标签和整体有一条白线。参见范例1。如果要消除这条白线,其实也简单,自绘了嘛,什么都是自己的。我在DrawItem中加了这段代码
void DrawItem(LPDRAWITEMSTRUCT lpdis) { if (lpdis->itemID==-1) return; // If there are no list box items, skip this message. // use draw item DC CDCHandle dc(lpdis->hDC); DRAWITEMSTRUCT& ds = *lpdis; int iItem = ds.itemID; if (lpdis->itemID == (unsigned) GetCurSel () ) { dc.FillSolidRect ( &ds.rcItem,GetSysColor(COLOR_BTNFACE) ); }
只需要先把自己的这块区域填充 COLOR_BTNFACE 的颜色就行。如果你自己重新定义了颜色,可以修改这里。这样讨厌的白线就没有了,选中的标签头和下面融为一体。
我给几个WTL CTabCtrl的参考资源:
http://www.codeproject.com/Articles/2475/A-WTL-Tab-Control-for-Managing-Tab-Views
http://www.codeproject.com/Articles/2597/Disable-CTabCtrl-tab-items-in-WTL-Using-the-Owner
http://www.codeproject.com/Articles/1786/Ownerdraw-Tab-Controls-Borders-and-All
特别是第一个,里面有个Style,把各类CTabCtrl属性样式都作了范例,非常有参考价值。