你好,新年快乐,(可以一直说到周四)
我正在尝试改变CTabCtrl
类中选项卡的颜色。我正在尝试创建自己的ReskinCTablCtrl,这样我就可以在单独的类中调用它,并在整个程序中轻松使用它。
目前我可以更改CTabCtrl
的背景颜色,但不能修改选项卡本身。
我使用ON_WM_ERASEBKGND()
来绘制背景,它工作起来没有问题:
BOOL ReskinCTabCtrl::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CBrush myBrush(RGB(51, 51, 51)); // dialog background color
BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
pDC->SetBkColor(RGB(51, 51, 51));
pDC->FillRect(&rect, &myBrush);
return bRes;
}
然而,我在改变选项卡颜色方面并不成功。它们仍然是默认的MFC颜色。我尝试过实现ON_WM_PAINT()
和ON_WM_DRAWITEM()
,但没有任何成功。我想我可以使用OnDraw和DrawItem来获得特定的选项卡矩形,类似于我在这个问题末尾发布的第二个链接示例。
void ReskinCTabCtrl::OnPaint() {
...
// paint the tabs first and then the borders
int nTab = GetItemCount();
int nSel = GetCurSel();
if (!nTab) // no pages added
return;
while (nTab--)
{
if (nTab != nSel)
{
dis.itemID = nTab;
dis.itemState = 0;
VERIFY(GetItemRect(nTab, &dis.rcItem));
dis.rcItem.bottom -= 2;
DrawItem(&dis);
DrawItemBorder(&dis);
}
}
...
}
我真的很感激至少有一些方向去解决这个问题,也许一些更多的例子或什么方法,我应该集中使用.我不需要标签是不同的颜色,也许有一个简单的方法做到这一点?
我一直试图遵循一些例子,如下面的链接,但我仍然不能找出正确的方法来做到这一点。
https://support.microsoft.com/en-us/help/179909/how-to-change-the-background-color-of-a-tab-control
https://www.codeproject.com/Articles/1786/Ownerdraw-Tab-Controls-Borders-and-All
1条答案
按热度按时间nvbavucw1#
在资源编辑器中为选项卡控件启用OwnerDraw,或在
OnInitDialog
中设置TCS_OWNERDRAWFIXED
CTabCtrl
具有WM_DRAWITEM
的消息反射,因此我们不希望从父类覆盖WM_DRAWITEM
/OnDrawItem
。而是在CTabCtrl::DrawItem(LPDRAWITEMSTRUCT)
中覆盖。不幸的是,结果相当难看,有点像在按钮中重写
DrawItem
。如果视觉样式可用并已启用,则可以替代
CTabCtrl::OnPaint
并手动绘制所有内容。示例: