MFC高级-重绘tab控件

本文介绍如何自定义Tab控件的重绘过程,包括创建子类、重写绘制函数及背景重绘函数等步骤,并解决字体设置等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初学者小白,今天要探讨的是tab控件的重绘, tab控件包含三部分,标签(标签背景色,标签字体(字体又分为高度啊,字体类型啊,字体颜色啊等等)),tab页,还有整个的背景颜色三部分,网上东西过于繁杂,因此小白这里整理了一些必要的,外加一些讲解,给更多人解疑同时和大家一起讨论。
1.勾选固定所有者文本,意在告诉计算机,我们将自己创建一个tab类,并且使用
在这里插入图片描述
2.使用类向导功能,我们自己创建一个子类Mytab,继承tab类
在这里插入图片描述
3. 使用类向导功能,重写虚函数DrawItem(绘制标签和tab页)和添加消息处理函数OnEraseBkgnd(重绘tab控件的背景)

在这里插入图片描述
在这里插入图片描述
4. 在.h 和 .cpp 中添加如下代码

BOOL Mytab::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect;
	GetClientRect(&rect);


	CBrush cbrush = RGB(248, 248, 248);
	//cbrush.CreateSolidBrush(RGB(248, 248, 248));
	pDC->FillRect(&rect, &cbrush);
	return true;
	//return CTabCtrl::OnEraseBkgnd(pDC);
}
void Mytab::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

	// TODO:  添加您的代码以绘制指定项
	CBrush cbr;
	cbr.CreateSolidBrush(RGB(248, 248, 248));//标签背景颜色

	char szTableText[100];
	TC_ITEM tci;

	memset(szTableText, '\0', sizeof(szTableText));
	tci.mask = TCIF_TEXT;
	tci.pszText = (LPWSTR)szTableText;
	tci.cchTextMax = sizeof(szTableText) - 1;

	GetItem(lpDrawItemStruct->itemID, &tci);


 	//填充选项卡背景
	CDC* dc = CDC::FromHandle(lpDrawItemStruct->hDC);
	dc->FillRect(&lpDrawItemStruct->rcItem, &cbr);


	//填充选项卡文字
	dc->SetBkColor(RGB(248, 248, 248)); //文字背景
	dc->SetTextColor(RGB(98, 98, 98));//文字颜色
	// 修改字体
	CFont* pCurFont = GetFont(); //获取当前字体
 	LOGFONTW lfont;
	lfont.lfUnderline = FALSE; //没有下划线
	lfont.lfEscapement = 0;//保持水平
	lfont.lfItalic = FALSE;//是否为斜体
	lfont.lfWeight = FW_BOLD; //字体加粗	
	lfont.lfStrikeOut = FALSE; //没有删除线
	lfont.lfHeight = 20;
 	LPCSTR  temp =  "微软雅黑";
	USES_CONVERSION;//宏;
 	wchar_t* wp = lfont.lfFaceName;//通过指针修改数值
	 * wp = * A2W(temp);
 	CFont cf;
	cf.CreateFontIndirect(&lfont);

	pCurFont = dc->SelectObject(&cf);
	RECT rect;
	rect = lpDrawItemStruct->rcItem;
	rect.top += 3;
	dc->DrawText(tci.pszText, lstrlen(tci.pszText), &rect, DT_CENTER);

}
  1. 我们需要在主窗口类的实现文件中,包含.h,然后在主窗口的头文件中,添加一个Mytab类的变量,并且在OnInitalDlg函数中,初始化一下代码,比如我这边简单设置了下标签,最后的最后需要我们void CMFCtabDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, m_tabctrol); },将控件id与我们自己创建的tab控件类进行一下关联,即可

在这里插入图片描述
这里简单提几个我当时遇到的问题,修改字体这块,尤其是修改字体类型,当时变量是个wchar数组,所以我用的是先用指针指向了该字体类型,然后解引用,再进行赋值操作,不知道各位小伙伴有没有更好的方法(wchar数组一旦被定义了,就不能通过A=B这种直接赋值来更改了),对了字体类型转换那里,我坚持了Unicode编码,所以多花了几步,对类型做了转换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值