关于TabCtrl标签显示一个比较怪异的问题(急等大侠帮忙!!!)
我的一个工程中用了一个现成类A,这个类继承了CtabCtrl。A类中onPaint方法写了绘制标签头背景和标签文本的代码。
代码如下:
OnPaint()
{
CPaintDC dc(this);
CRect rcClient;
GetClientRect(&rcClient);
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,rcClient.Width(),30);
dcMemory.SelectObject(&bmp);
//画背景
Graphics _g(dcMemory.m_hDC);
_g.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
_g.DrawImage(_pTabImageBG,0,0,rcClient.Width()+100,30);
CRect itemRect;
for (int i=0;i<GetItemCount();i++)
{
GetItemRect(i,&itemRect);
if (_buttonState==stateMouseNormal)
{
if (i==GetCurSel())
{
_g.DrawImage(_pTabImageItem3,itemRect.left,0,
itemRect.Width(),itemRect.Height());
_g.DrawImage(_pTabImageClose1,
itemRect.right-17-5,
7,
17,
16);
}
else
{
_g.DrawImage(_pTabImageItem1,itemRect.left,0,
itemRect.Width(),itemRect.Height());
}
}
else if (_buttonState==stateMouseHover)
{
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if (i==GetCurSel())
{
_g.DrawImage(_pTabImageItem3,itemRect.left,0,
itemRect.Width(),itemRect.Height());
CRect rcClose(
itemRect.right-17-5,
7,
itemRect.right-5,
7+16);
_rcClose=rcClose;
if (rcClose.PtInRect(pt))
{
_g.DrawImage(_pTabImageClose2,
itemRect.right-17-5,
7,
17,
16);
}
else
{
_g.DrawImage(_pTabImageClose1,
itemRect.right-17-5,
7,
17,
16);
}
}
else
{
if (itemRect.PtInRect(pt))
{
_g.DrawImage(_pTabImageItem2,itemRect.left,0,
itemRect.Width(),itemRect.Height());
}
else
{
_g.DrawImage(_pTabImageItem1,itemRect.left,0,
itemRect.Width(),itemRect.Height());
}
}
_bMouseWatch=TRUE;
}
else if (_buttonState==stateMouseDown)
{
if (i==GetCurSel())
{
_g.DrawImage(_pTabImageItem3,itemRect.left,0,
itemRect.Width(),itemRect.Height());
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
CRect rcClose(
itemRect.right-17-5,
7,
itemRect.right-5,
7+16);
_rcClose=rcClose;
if (rcClose.PtInRect(pt))
{
_g.DrawImage(_pTabImageClose3,
itemRect.right-17-5,
7,
17,
16);
_nCurrentItem=i;
//点到关闭按钮上了
}
else
{
_g.DrawImage(_pTabImageClose1,
itemRect.right-17-5,
7,
17,
16);
}
}
else
{
_g.DrawImage(_pTabImageItem1,itemRect.left,0,
itemRect.Width(),itemRect.Height());
}
}
//_g.DrawImage(_pTabImageIcon,itemRect.left+4,6,16,16);
/* 显示选项卡标签*******************************************/
TCHAR TempBuf[255];
TCITEM itemCurrent;
itemCurrent.mask = TCIF_TEXT;
itemCurrent.pszText = TempBuf;
itemCurrent.cchTextMax = sizeof(TempBuf);
GetItem(i, &itemCurrent);
//FontFamily fontFamily(L"宋体");//选择一种字体
//Font myFont(&fontFamily,10,FontStyleRegular,UnitInch);
//Font myFont(L"宋体", 10.5F);
//Font myFont(L"",8.0F);
//Gdiplus::Font myFont(L"Arial", 15, FontStyleRegular,UnitPixel);
Font myFont(L"宋体", 10.5F);
PointF origin((REAL)itemRect.left+22.0F,8.0F);
SolidBrush blackBrush(Color(200, 0, 0, 0));
USES_CONVERSION;
_g.DrawString(
A2W(itemCurrent.pszText),
(INT)wcslen(A2W(itemCurrent.pszText)),
&myFont,
origin,
&blackBrush);
/* end of 显示选项卡标签**********************************/
}//end for
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&dcMemory,0,0,SRCCOPY);
_g.ReleaseHDC(dcMemory.m_hDC);
dcMemory.DeleteDC();
bmp.DeleteObject();
}
其中每个标签头关联了一个对话窗口,当对话窗口中数据发生变化时,比如接收到来自服务器的消息时,我想把这个窗口对应的Tab标签换另外一种背景,像QQ那样来信息时,任务栏中的聊天窗口变成黄色高亮显示.
于是我把onpaint方法稍微修改了下,当tab标签关联的窗口中数据发生变化时,与之相关联的tab标签绘制上另外一张图片,结果发现换绘制另外一张图片的代码执行了,tab标签还是原来的样子,并没有换上我想换的图片(说明:图片路径都对,并且存在这张图片),请问这是怎么回事呢,如何解决呢