实现自定义CListCtrl

一、 综述

 

   Mfc自带的 listctrl 虽然能够完成一些常用的操作,但是如果对于某些特定的应用,则无能为力,这时候,就学要对空间进行扩展,以实现满足特定需要的功能。

本文阐述了如何实现具有自定义行高,而且能够选择和编辑的listctrl 控件。

 

二、 实现

(1) 实现自定义行高。

 

      我们都知道,mfc 自带的 listctrl 控件的行高是固定的,不能够自定义的进行改变。如果设置一个比较大位图,或者简单的设置比较大号的字体,这些方法虽然能够改变行高,但是没有接触到问题的实质。我们使用消息反射机制来实现自定义行高。有关消息反射机制,请参见msdn 。实现自定义行高的listctrl 基于以下事实:当我们给listctrl 发送WM_WINDOWPOSCHANGED消息时,也就是告诉 listdctrl 控件大小、位置等发生变化,这时候 listctrl 控件就会触发 WM_MEARSURITEM 消息,当然这个是反射消息。通过映射这个消息,我们就可以改变 listctrl 控件的行高。当然还要设置 listctrl 的 Owen Draw Fixed 风格, WM_MEARSURITEM 只有在 Owen Draw Fixed 风格才有效。

 

总结一下,如果要创建自定义行高的listctrl ,大概要以下步骤:

 

(1) 定义新类,继承listctrl ,设置 Owen Draw Fixed 风格,并且手动映射ON_WM_MEASUREITEM_REFLECT 消息。

 

(2) 增加设置行高的接口,通过设置发送WM_WINDOWPOSCHANGED 消息引发 ON_WM_MEASUREITEM_REFLECT 消息,例如:

 

  void CListEx::SetItemHeight(UINT nHeight)

   {

      m_nItemHeight = nHeight;

      CRect rcWin;

      GetWindowRect(&rcWin);

       WINDOWPOS wp;

       wp.hwnd = m_hWnd;

       wp.cx = rcWin.Width();

       wp.cy = rcWin.Height();

      wp.flags = SWP_NOACTIVATE | SWP_NOMOVE|    SWP_NOOWNERZORDER | SWP_NOZORDER;

       SendMessage(WM_WINDOWPOSCHANGED,0, (LPARAM)&wp);

     }

 

(3) 映射ON_WM_MEASUREITEM_REFLECT 反射消息,在反射消息里设置行高, 例如:

 

      void CListEx ::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 

      {

             lpMeasureItemStruct->itemHeight = m_nItemHeight;

      }

(4) 完成控件自绘函数,CListEx::DrawItem。自此,自定义设置行高功能已经实现。

 

三、 增加编辑功能

增加编辑功能一般的思路,就是在单击或双击的时候,创建一个CEDIT 编辑框,然后把编辑框覆盖当前的 subitem 上,并且使编辑框获取焦点。当编辑框失去焦点时,把编辑框里的文字,显示到 listctrl 控件上,就可以了。为了能够使控件知道何时显示编辑框中的文字,所以还有重写编辑框,当编辑框失去焦点时,通过消息通知 listctrl 控件。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 void SetHeaderBKColor int R int G int B int Gradient ; public: 设置表头高度 void SetHeaderHeight float Height ; CPtrList m ptrListCol; 保存列颜色 CPtrList m ptrListItem; 保存Item颜色表 CPtrList m colTextColor; 保存列字体颜色 CPtrList m ItemTextColor; 保存单元格字体颜色 bool FindColColor int col COLORREF &color ; 查找列颜色 bool FindItemColor int col int row COLORREF &color ; bool FindColTextColor int col COLORREF &color ; 查找列字体颜色 bool FindItemTextColor int col int row COLORREF &color ; void SetColColor int col COLORREF color ; 设置列颜色 void SetItemColor int col int row COLORREF color ; 设置Item颜色 void SetColTextColor int col COLORREF color ; 设置列文本颜色 void SetItemTextColor int col int row COLORREF color ; void SetRowHeigt int nHeight ; 设置行高 void SetHeaderFontHW int nHeight int nWith ; 设置表头字体大小 void SetHeaderTextColor COLORREF color ; COLORREF m color; BOOL SetTextColor COLORREF cr ; void SetFontHW int nHeight int nWith ; 设置字体的高和宽 void EraseItemColor int col int row ; stColor FindItemColor2 int col int row COLORREF &color ; void EraseAllColor ;">可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值