CTabCtrl的字体可以修改吗?

jjcooljj 2003-07-02 11:17:24
我想修改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);
}
...全文
327 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjcooljj 2003-07-02
  • 打赏
  • 举报
回复
难道VC真的要麻烦到重载DrawItem才能修改字体吗?
这也太麻烦了。
我得类的问题果然处在OnLButtonDown上,可是我原来的程序错在哪里呢?!用GetCurSel也是出同样的错误啊!
清泉ys 2003-07-02
  • 打赏
  • 举报
回复
没必要对OnLButtonDown
OnCmdMsg 处理
删了
DrawItem是虚函数直接重载
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

void CExtabCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
}
yongdu 2003-07-02
  • 打赏
  • 举报
回复
重载DrawItem方法是对的。没有简单的方法

HitTest没用过。。。。试试用GetCurSel返回几?

16,466

社区成员

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

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

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