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

本文示例源代码或素材下载

  在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    作者:夕阳人   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值