本文主要是介绍改变CTabCtrl控件字体颜色与背景 含实例vs2019,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
由于CTabCtrl控件的tab切换当前选中tab很不明显,在网上查了很多资料,没有发现特别适合而且说得明白的教程,所以参考官方文档自己写了一个派生类1、建立派生类,派生于CTabCtrl
class CTabCtrlEx : public CTabCtrl
{
public:CTabCtrlEx(); // 标准构造函数virtual ~CTabCtrlEx();//接受响应消息DECLARE_MESSAGE_MAP()virtual void PreSubclassWindow();//改变tab全局背景色BOOL OnEraseBkgnd(CDC* pDC);//改变tab头背景颜色、字体背景色、字体颜色virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
2、cpp中实现的时候,需要响应两个消息分别是:ON_WM_ERASEBKGND()、ON_WM_DRAWITEM()
BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)ON_WM_ERASEBKGND()ON_WM_DRAWITEM()
END_MESSAGE_MAP()
3、特别注意,PreSubclassWindow里面需要设置空间的一个类,来让它响应咱们设置的消息
void CTabCtrlEx::PreSubclassWindow()
{// TODO: 在此添加专用代码和/或调用基类ModifyStyle(0, TCS_OWNERDRAWFIXED);CTabCtrl::PreSubclassWindow();
}
4、我没有改变tab整个页面背景的需求,所以此处我没有实现,代码注释掉了
BOOL CTabCtrlEx::OnEraseBkgnd(CDC* pDC)
{/* CBrush br(RGB(255, 0, 0));CRect rc;GetClientRect(rc);pDC->FillRect(rc, &br);*/return true;
}
5、咱们看看tab头的背景及颜色设置,我的需求是突出选中tab,所以这块我加了限定:if (lpDrawItemStruct->itemID != GetCurSel()),不加限定是修改所有tab头的颜色。
void CTabCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{//创建画刷CBrush cbr;cbr.CreateSolidBrush(RGB(228, 229, 231));获取选项卡文字内容char szTabText[100];TC_ITEM tci;memset(szTabText, '\0', sizeof(szTabText));tci.mask = TCIF_TEXT;tci.pszText = szTabText;tci.cchTextMax = sizeof(szTabText) - 1;GetItem(lpDrawItemStruct->itemID, &tci);//填充选项卡背景CDC* dc = CDC::FromHandle(lpDrawItemStruct->hDC);dc->FillRect(&lpDrawItemStruct->rcItem, &cbr);dc->SetBkColor(RGB(228, 229, 231));//当前选中if (lpDrawItemStruct->itemID != GetCurSel()){//绘制选项卡文字dc->SetTextColor(RGB(0, 0, 0));}else{//绘制选项卡文字dc->SetTextColor(RGB(255, 0, 0));}RECT rc;rc = lpDrawItemStruct->rcItem;rc.top += 3;dc->DrawText(tci.pszText, lstrlen(tci.pszText), &rc, DT_CENTER);
}
6、最终效果:
实例下载:https://download.csdn.net/download/shenhch/85271088
这篇关于改变CTabCtrl控件字体颜色与背景 含实例vs2019的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!