在Windows XP中资源管理器左侧显示目录树结构时,当在项目中移动鼠标的时候,项目标签的文字的字体和颜色会产生变化,使目录的选择非常醒目.本人在学习制作Windows98的资源管理器的过程中,加入了相似的功能,其基本思路是:在与TreeCtrl控件关联的类(CDirTreeCtrl)中重载鼠标移动消息函数,设置相关的文本的颜色参数,在WM_PAINT消息映射函数定义的设备环境中改变逻辑字体属性(由LOGFONT结构描述)并使用设置的字体,达到项目字体变动的目的.具体内容如下:
1>.在CDirTreeCtrl的头文件中定义以下变量:
1 2 3 4 5 6 7 8 9 | 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>.重载鼠标移动消息函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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消息函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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; } |
联系客服