初学者小白,今天要探讨的是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);
}
- 我们需要在主窗口类的实现文件中,包含.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编码,所以多花了几步,对类型做了转换。