WTL中CTabCtrl的自绘定制

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属性样式都作了范例,非常有参考价值。

猜你喜欢

转载自blog.csdn.net/stevenkoh/article/details/9980139
WTL