打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在树型控件中移动鼠标产生字体及颜色的变化

在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;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何设置CTreeCtrl树形控件Item项的颜色和字体
《Windows核心编程》の“字体”和“颜色”对话框
VS2010/MFC编程入门之十八(对话框:字体对话框)
怎么获取WIN7系统默认字体
设置TextOut字体显示大小
使用"字体"对话框设置文本字体
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服