请问下,怎样修改tab页的选中标签的字体颜色,和背景颜色?谢谢回答

liujin1234 2009-06-09 10:28:28
如题,谢谢回答
...全文
2673 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lplovezz 2010-07-06
  • 打赏
  • 举报
回复
学习...
xiaojiao_IT 2010-06-08
  • 打赏
  • 举报
回复
嗯 很好用
DavidHsing 2009-06-09
  • 打赏
  • 举报
回复
用 VS2008 sp1 里面 CMFCTabCtrl,啥都帮你做了。看图:

hurryboylqs 2009-06-09
  • 打赏
  • 举报
回复
需要自绘,自己派生一个tabctrl
响应WM_PAINT消息 在里面绘制即可,并不复杂的


int nTab= GetItemCount();
int nSel = GetCurSel();
if (!nTab) // no pages added
return 0;
CRect rcItem;
while(nTab--)
{
GetItemRect(nTab,&rcItem);
//在此绘制标签文本背景等
}
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
继续顶
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
沙发
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
嘿嘿,终于修改好了,谢谢各位的回答,尤其谢谢小白同志,多次帮忙修改!!
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hurryboylqs 的回复:]
你要将你的控件跟这个类关联起来
C/C++ codeCPaintDC dc(this);intnTab=GetItemCount();intnSel=GetCurSel();

CRect rcItem;while(nTab--)
{
GetItemRect(nTab,&rcItem);if(nSel==0)
{
dc.SetTextColor(RGB(255,255,255));
}


}

你这段代码什么意思??怎么能这么绘的呢?晕极,给段代码你,自己转下

C/C++ codeLR…
[/Quote]你的相应的onpaint怎么和我的不一样?我的相应的根本没有参数
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bxf19830819 的回复:]
在void CEnTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpdis)中修改标签文字颜色与背景颜色
[/Quote]谢谢,我不会设置,我现在只是设置了没有选中的标签的文字颜色,选中的,不知道怎么设置
峰白 2009-06-09
  • 打赏
  • 举报
回复

void CEnTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
TC_ITEM tci;
CDC* pDC = CDC::FromHandle(lpdis->hDC);
CRect rect(lpdis->rcItem);
char szTabText[256];
memset(szTabText,'\0',sizeof(szTabText));

tci.mask = TCIF_TEXT;
tci.pszText = szTabText;
tci.cchTextMax = sizeof(szTabText) -1;
GetItem(lpdis->itemID, &tci);

if (lpdis->itemAction & ODA_DRAWENTIRE)
{
pDC->TextOut(rect.left+5, rect.top+5, tci.pszText);
}

if ((lpdis->itemState & ODS_SELECTED) &&
(lpdis->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
//Make the color of text of the selected tab to be BLUE.
pDC->FillSolidRect(rect,RGB(255,255,255));//修改选中背景颜色

pDC->SetTextColor(RGB(0,0,0)); //修改该选中文字颜色
pDC->TextOut(rect.left+5, rect.top+5, tci.pszText);
}
}
峰白 2009-06-09
  • 打赏
  • 举报
回复
在void CEnTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpdis)中修改标签文字颜色与背景颜色
hurryboylqs 2009-06-09
  • 打赏
  • 举报
回复
你要将你的控件跟这个类关联起来

CPaintDC dc(this);
int nTab= GetItemCount();
int nSel = GetCurSel();

CRect rcItem;
while(nTab--)
{
GetItemRect(nTab,&rcItem);
if (nSel==0)
{
dc.SetTextColor(RGB(255,255,255));
}


}



你这段代码什么意思??怎么能这么绘的呢?晕极,给段代码你,自己转下


LRESULT CTabCtrlEx::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{

CRect rect;
GetClientRect(&rect);
CPaintDC dc(m_hWnd);
CMemoryDC MemDC(dc, rect);
CBrush br;
br.CreateSolidBrush(RGB(227,230,235));
MemDC.FillRect(&rect,br);

int nTab;
int nItemCount = GetItemCount();
int nSel = GetCurSel();
nTab = nItemCount;
if (!nTab) // no pages added
return 0;
CRect rcItem;
CRect rectTemp;
CString strItem;
TCITEM tcItem;
tcItem.pszText = strItem.GetBuffer(1024);
tcItem.cchTextMax = 1023;

CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(157,177,186));
MemDC.SelectPen(pen);

while(nTab--)
{
memset(tcItem.pszText,0,1024*2);
GetItemRect(nTab,&rcItem);
if (nTab==nSel)
{
rcItem.InflateRect(0,3,0,0);
}
rectTemp = rcItem;
rectTemp.DeflateRect(1,1);
if (nTab ==nSel)
{
MemDC.FillSolidRect(&rectTemp,RGB(227,230,235));
}
else
{
MemDC.Rectangle(&rcItem);
MemDC.FillSolidRect(&rectTemp,RGB(255,255,255));
}

CPoint point;
GetCursorPos(&point);
ScreenToClient(&point);
if (rcItem.PtInRect(point)||(nTab ==nSel)) // 鼠标在标签或者标签被选中,高亮显示
{
rectTemp = rcItem;
rectTemp.bottom=rectTemp.top+3;
MemDC.FillSolidRect(&rectTemp,RGB(255,200,60));
}

CFont font;
font.CreateFont(12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
CMainFrame::get_string(IDS_ITEM_NAME_DEF_FONT));
MemDC.SelectFont(font);
MemDC.SetBkMode(TRANSPARENT);
tcItem.mask = TCIF_TEXT;
GetItem(nTab,&tcItem);
strItem.Format(_T("%s"),tcItem.pszText);
MemDC.DrawText(strItem,strItem.GetLength(),&rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

if (nTab==nItemCount-1)
{
MemDC.MoveTo(rcItem.right,rcItem.bottom);
MemDC.LineTo(rect.right,rcItem.bottom);
}
}

return 0;
}
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 DavidHsing 的回复:]
用 VS2008 sp1 里面 CMFCTabCtrl,啥都帮你做了。看图:


[/Quote]谢谢你的回答,我用的是vc++6.0。
liujin1234 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hurryboylqs 的回复:]
需要自绘,自己派生一个tabctrl
响应WM_PAINT消息 在里面绘制即可,并不复杂的

C/C++ codeintnTab=GetItemCount();intnSel=GetCurSel();if(!nTab)//no pages addedreturn0;
CRect rcItem;while(nTab--)
{
GetItemRect(nTab,&rcItem);//在此绘制标签文本背景等}
[/Quote]你好,谢谢你的回答,我用了你的方法但是仍然没有被修改是怎么回事?谢谢

void CEnTabCtrl::onPaint()
{
CPaintDC dc(this);
int nTab= GetItemCount();
int nSel = GetCurSel();

CRect rcItem;
while(nTab--)
{
GetItemRect(nTab,&rcItem);
if (nSel==0)
{
dc.SetTextColor(RGB(255,255,255));
}


}


}

这是我修改后的代码

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧