CTabCtrl的字体可以修改吗?
我想修改CTabCtrl的字体,原来尝试过继承CTabCtrl重新写了DrawItem的方法,但是不知道为什么用自己写得类HitTest的返回值错误,自己写得类里面重载的方法如下。其实我想做的只是改变字体,是不是不用自己写一个类这么麻烦呢?!
如果直接使用CTabCtrl应该怎么做呢?!
那位高人知道我下面这段程序中有什么错误,会导致在我在使用这个类的时候,明明按下的是第3个item,但是HitTest返回的却是3,也就是说选中的是第4个item。为什么呢?!
enum { PADDING = 3, EDGE = 20};
/////////////////////////////////////////////////////////////////////////////
// CMyTabCtrl
CMyTabCtrl::CMyTabCtrl()
{
LOGFONT logFont;
memset(&logFont, 0, sizeof(LOGFONT));
logFont.lfHeight = 12;
strcpy(logFont.lfFaceName, "宋体");
m_SelFont.CreateFontIndirect(&logFont);
}
CMyTabCtrl::~CMyTabCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyTabCtrl, CTabCtrl)
//{{AFX_MSG_MAP(CMyTabCtrl)
ON_WM_LBUTTONDOWN()
ON_WM_DRAWITEM()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyTabCtrl message handlers
BOOL CMyTabCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if(GetParent()->GetSafeHwnd())
return GetParent()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
return CTabCtrl::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
void CMyTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CTabCtrl::OnLButtonDown(nFlags, point);
TCHITTESTINFO tci; tci.pt = point;
int nTab = HitTest(&tci);
//if((m_nCurrentTabIndex != nTab) && (nTab != -1))
{
//m_nCurrentTabIndex = nTab;
if(GetParent() != NULL)
::PostMessage(GetParent()->GetSafeHwnd(), USR_TABCHANGED, (WPARAM)nTab, NULL);
Invalidate();
}
CTabCtrl::OnLButtonDown(nFlags, point);
}
void CMyTabCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CTabCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMyTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
TC_ITEM tci;
int nTabIndex = lpDrawItemStruct->itemID;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSavedDC = pDC->SaveDC();
// validity check
if (nTabIndex < 0) return;
BOOL bSelected = (nTabIndex == GetCurSel());
// prepare drawable region
CRect rItem(lpDrawItemStruct->rcItem);
if (bSelected)
rItem.bottom -= 1;
else
rItem.bottom += 2;
// fill region with default color
COLORREF crFrom = RGB(128, 0, 0);
//pDC->FillSolidRect(rItem, crFrom);
// text & icon
rItem.left += PADDING;
rItem.top += PADDING + (bSelected ? 1 : 0);
pDC->SetBkMode(TRANSPARENT);
CString sTemp;
tci.mask = TCIF_TEXT | TCIF_IMAGE;
tci.pszText = sTemp.GetBuffer(100);
tci.cchTextMax = 99;
GetItem(lpDrawItemStruct->itemID, &tci);
sTemp.ReleaseBuffer();
CImageList * pImageList = GetImageList();
// text
rItem.right -= PADDING;
rItem.bottom -= PADDING;
if (bSelected)
{
pDC->SetTextColor(RGB(0,0,0));
pDC->SelectObject(&m_SelFont);
rItem.top -= ::GetSystemMetrics(SM_CYEDGE);
if (pImageList != NULL)
{
CRect rcIcon = rItem;
rcIcon.right = rcIcon.left + 16;
rItem.left += 16;
pImageList->Draw(pDC, tci.iImage, CPoint(rcIcon.left, rcIcon.top), ILD_NORMAL);
}
pDC->DrawText(sTemp, rItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
}
else
{
pDC->SelectObject(&m_SelFont);
pDC->SetTextColor(RGB(0, 0, 0));
if (pImageList != NULL)
{
CRect rcIcon = rItem;
rcIcon.right = rcIcon.left + 16;
rItem.left += 16;
pImageList->Draw(pDC, tci.iImage, CPoint(rcIcon.left, rcIcon.top), ILD_NORMAL);
}
pDC->DrawText(sTemp, rItem, DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
}
pDC->RestoreDC(nSavedDC);
}