本文示例源代码或素材下载
在Windows XP中资源管理器左侧显示目录树结构时,当在项目中移动鼠标的时候,项目标签的文字的字体和颜色会产生变化,使目录的选择非常醒目.本人在学习制作Windows98的资源管理器的过程中,加入了相似的功能,其基本思路是:在与TreeCtrl控件关联的类(CDirTreeCtrl)中重载鼠标移动消息函数,设置相关的文本的颜色参数,在WM_PAINT消息映射函数定义的设备环境中改变逻辑字体属性(由LOGFONT结构描述)并使用设置的字体,达到项目字体变动的目的.具体内容如下:
1>.在CDirTreeCtrl的头文件中定义以下变量:
HTREEITEM hItem_bc; //存放检测项目的句柄
COLORREF ItemText_OldColor; //存放系统初始字体颜色参数,在类的初始化函数中赋值
LOGFONT logfont_old; //存放系统初始逻辑字体属性,在类的初始化函数中赋值
struct Color_Font
{
COLORREF color;
LOGFONT logfont;
}
CMap<void*,void*,Color_Font,Color_Font&> m_mapColorFont;
2>.重载鼠标移动消息函数:
void CDirTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rc;
TVHITTESTINFO tvInfo;
tvInfo.pt=point;
HTREEITEM hItem=HitTest(&tvInfo); //获得光标进入的项目的句柄
GetItemRect(hItem,&rc,TRUE);
BOOL yn=rc.PtInRect(point);
Color_Font cf;
if(yn) { //光标进入项目标签
cf.color=RGB(0,0,150); //设置项目文本需改变的颜色参数
SetCursor(hIcon_sx); //设置手形光标,hIcon_sx为光标的句柄
hItem_bc=hItem;
}
else {
cf.color=ItemText_OldColor;
}
m_mapColorFont[hItem]=cf;
if(!m_mapColorFont.Lookup(hItem,cf))
cf.color=(COLORREF)-1;
m_mapColorFont[hItem]=cf;
Invalidate(FALSE); //强制执行OnPaint()
CTreeCtrl::OnMouseMove(nFlags, point);
}
3>.重载WM_PAINT消息函数:
void CDirTreeCtrl::OnPaint()
{
CPaintDC dc(this); // paint设备环境
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CRect rcClip,rcClient;
dc.GetClipBox(&rcClip);
GetClientRect(&rcClient);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
memDC.SelectObject(&bitmap);
CWnd::DefWindowProc(WM_PAINT,(WPARAM)memDC.m_hDC,0);
if(hItem_bc != NULL) {
CRect rect;
UINT selflog=TVIS_DROPHILITED|TVIS_SELECTED;
Color_Font cf;
if(!(GetItemState(hItem_bc,selflog) & selflog) && m_mapColorFont.Lookup(hItem_bc,cf))
{
CFont *pFontDC;
CFont fontDC;
LOGFONT logfont;
logfont=logfont_old;
logfont.lfUnderline=TRUE; //设置字体的下划线属性
fontDC.CreateFontIndirect(&logfont); //创建新字体
pFontDC=memDC.SelectObject(&fontDC); //将新字体选入设备环境
memDC.SetTextColor(cf.color);
CString sItem=GetItemText(hItem_bc);
GetItemRect(hItem_bc,&rect,TRUE);
memDC.TextOut(rect.left+2,rect.top+2,sItem);
memDC.SelectObject(pFontDC);//在设备环境中恢复原字体
fontDC.DeleteObject();
}
}
dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),
&memDC,rcClip.left,rcClip.top,SRCCOPY);
bitmap.DeleteObject();
hItem_bc=NULL;
}
来源:vchelp 作者:夕阳人