扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Paul DiLascia 来源:msdn中国 2007年11月20日
关键字:
Mayur Patel
答:更改选项卡控件中选项卡的颜色十分简单,但要将属性表的颜色翻新则需要大量的工作,不下很大决心是做不到的。对于选项卡,基本思想是使控件成为所有者描述的控件,然后处理 WM_DRAWITEM。如果您使用 MFC,则可以重写虚函数 DrawItem。
在 Microsoft Systems Journal1998 年 3 月发行的那一期中,我介绍了如何实现一个选项卡控件类 — CtabCtrlWithDisable,它支持禁用选项卡。作为禁用选项卡的一部分,当选项卡禁用时,CTabCtrlWithDisable 将选项卡的文本颜色变为浅灰色。本月,我从 CTabCtrlWithDisable 借用了一些代码,实现了一个新的类 — CcolorTablCtrl,它可以使您更改选项卡的颜色(请参见图 5)。
要使用 CcolorTablCtrl,请在您的属性表中创建一个实例:
以下是引用片段: class CMyPropSheet : public CPropertySheet { protected: CColorTabCtrl m_tabCtrl; }; |
您必须在属性表的 OnInitDialog 处理程序中子类化选项卡控件(以便 MFC 可以使用它),然后将前景色和背景色设置成您喜欢的任何颜色:
以下是引用片段: // in CMyPropSheet::OnInitDialog() HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL); m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this); m_tabCtrl.SetColor(WHITE, RED); |
这里的 WHITE 和 RED 是标准的 COLORREF 值,即 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦您实例化并初始化 CcolorTabCtrl,颜色选项卡控件就会完成剩下的工作(请参见图 6)。
图 6 颜色选项卡控件
CColorTabCtrl 重写了 SubclassDlgItem,它调用 ModifyStyle 来将风格更改为TCS_OWNERDRAWFIXED。进行重写的较好位置是在 PreSubclassWindow 中,因为不管控件是子类化还是通过 CreateWindow 创建都会调用这个函数(但由于杂志篇幅有限,我必须对代码进行压缩,因此我采用了这样的捷径)。注意,SubclassDlgItem 是一个简单的重写,而不是虚函数。为了设置颜色,SetColor 将颜色保存在两个成员变量 m_clrBackground 和 m_clrForeground 中。
一旦风格设置为所有者描述的,每次需要 Windows? 绘制选项卡时,它都会发送 WM_DRAWITEM 消息。MFC 捕获这个消息并调用选项卡控件的虚函数 DrawItem,CColorTabCtrl 通过用新的颜色绘制文本来实现这个函数:
以下是引用片段: // in CColorTabCtrl::DrawItem dc.FillSolidRect(rc, m_clrBackground); dc.SetBkColor(m_clrBackground); dc.SetTextColor(m_clrForeground); dc.DrawText(...); |
这些都非常简单,所以要了解具体实现请查看源代码。由于您可能不想只更改选项卡颜色而不更改页面颜色,所以我也实现了一个 CcolorPropertyPage,它可以让您将属性页的背景颜色改成匹配的颜色,如图 6 所示。对于属性表,更改背景颜色最简单的方式就是处理 WM_ERASEBKGND:
以下是引用片段: BOOL CColorPropertyPage::OnEraseBkgnd(CDC* pDC) { CRect rc; GetClientRect(&rc); pDC->FillSolidRect(rc, m_clrBackground); return TRUE; } |
如果您自己试运行这段代码,您会发现有各种令人苦恼的问题。首先,如果您更改页面颜色,所有控件的背景色都会是错误的,所以还必须修正。对此,您必须处理 WM_CTLCOLOR 和 WM_ERASEBKGND。有关详细
另一个问题是选项卡控件仍然使用系统 3D 颜色来绘制选项卡的边缘和圆角。唉!要修正这个问题,只能自己处理 WM_PAINT 并负责所有的绘图操作。包括画出选项卡在被选定时与其他选项卡的偏移,以便它以前景色显示。此时,您就要开始对选项卡控件进行一番彻底改造了。每个使用 Windows 的编程人员都知道,更改控件颜色无一例外都是很痛苦的事情,一旦您走上了这条路,要做的事情就似乎没有尽头了。相信很快标准颜色就会比它们原先的颜色
以下是引用片段: ctl.BackColor = Color.Aquamarine; |
祝大家编程愉快!
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓涢悾娲⒑闂堟单鍫ュ疾濠婂嫭鍙忔繝濠傜墛閸嬨劍銇勯弽銊с€掗柟钘夊暣閺岀喖鎮滈埡鍌涚彋閻庤娲樺畝绋跨暦閸洖鐓涢柛灞剧矋濞堟悂姊绘担绛嬪殐闁搞劋鍗冲畷銏ゅ冀椤愩儱小闂佹寧绋戠€氼參宕伴崱妯镐簻闁靛牆鎳庢慨顒€鈹戦埥鍡椾簼婵犮垺锚铻炴俊銈呮噺閸嬪倹绻涢崱妯诲碍閻庢艾顦甸弻宥堫檨闁告挾鍠庨锝夘敆娓氬﹦鐭楁繛鎾村焹閸嬫捇鏌e☉娆愬磳闁哄本绋戦埞鎴﹀川椤曞懏鈻婄紓鍌欑劍椤ㄥ懘鎯岄崒鐐靛祦閹兼番鍔岄悞鍨亜閹烘垵顏╅悗姘槹閵囧嫰寮介妸褎鍣ョ紓浣筋嚙濡繈寮婚悢纰辨晣鐟滃秹鎮橀懠顒傜<閺夊牄鍔庣粻鐐烘煛鐏炶姤鍠橀柡浣瑰姍瀹曠喖顢橀悩铏钒闂備浇宕垫慨鎶芥⒔瀹ュ鍨傞柦妯猴級閿濆绀嬫い鏍ㄧ☉濞堟粓姊虹涵鍛【妞ゎ偅娲熼崺鈧い鎺嗗亾闁挎洩濡囧Σ鎰板籍閸繄顓洪梺缁樺姇瀵剙螖閸涱喚鍘搁梺鍓插亽閸嬪嫰鎮橀敃鍌涚厱閻庯綆鍋嗘晶顒傜磼閸屾稑绗ч柟鐟板閹煎湱鎲撮崟闈涙櫏闂傚倷绀侀幖顐も偓姘卞厴瀹曞綊鏌嗗鍛紱閻庡箍鍎遍ˇ浼村磿瀹ュ鐓曢柡鍥ュ妼婢ь垰霉閻樿秮顏堟箒闂佹寧绻傚Λ妤呭煝閺囥垺鐓冪憸婊堝礈濮樿泛钃熼柕濞у嫷鍋ㄩ梺缁樺姇椤曨參鍩㈤弴銏″€甸柨婵嗗€瑰▍鍥ㄣ亜韫囨稐鎲鹃柡灞炬礋瀹曢亶顢橀悢濂変紦