C++实现可编辑列表框控件类

正常情况下,我们的ListCtrl是不可编辑的。那么我们怎么来实现一个可编辑的ListCtrl类呢?
思路如下:
1、类成员CEdit变量
2、当在列表框上双击一项时,获取点击坐标所对应的行和列,分别使用 HitTest函数和 SubItemHitTest函数
3、根据行和列获取点击区域的矩形大小rect,用于创建编辑框时,指定其位置和大小
4、new出个CEdit对象的指针m_pEdit,用Create函数去创建编辑框,在rect所在的位置
5、获取列表框中原来的数值ListValue,将ListValue设置到编辑框控件中,设置焦点,并将光标置尾部
6、在 编辑框失去焦点的时候,将编辑框中的值EditValue设置到列表控件上去,并释放我们new出来的m_pEdit,当然读者也可以截获回车键消息,让其也响应失去焦点。
7、这个类是继承于 CListCtrl的,其实想想也知道,呵呵 大笑

源文件:
.h
#pragma   once
// CEditCtrl

class   CEditCtrl   :   public   CListCtrl
{
             DECLARE_DYNAMIC ( CEditCtrl   )

public :
             CEditCtrl ();
             virtual   ~ CEditCtrl   ();
public :
             CEdit *                      m_pEdit ;
private   :
             int        m_nCheckItem ;
             int        m_nCheckSubItem ;
protected   :
             DECLARE_MESSAGE_MAP ()
public :
             afx_msg   void   OnLButtonDblClk (   UINT   nFlags   ,   CPoint   point );
             afx_msg   void   OnEnKillfocusEditRolename ();
             virtual   BOOL   PreTranslateMessage (   MSG *   pMsg   );
};
.cpp
#include   "stdafx.h"
#include   "EditCtrl.h"


// CEditCtrl

IMPLEMENT_DYNAMIC   ( CEditCtrl ,   CListCtrl )

CEditCtrl   :: CEditCtrl ()
{
             m_pEdit   =   NULL   ;
}

CEditCtrl   ::~ CEditCtrl ()
{
}

BEGIN_MESSAGE_MAP   ( CEditCtrl ,   CListCtrl )
             ON_WM_LBUTTONDBLCLK ()
             ON_EN_KILLFOCUS (10000, & CEditCtrl   :: OnEnKillfocusEditRolename )
END_MESSAGE_MAP   ()




void   CEditCtrl   :: OnLButtonDblClk (   UINT   nFlags   ,   CPoint   point )
{
             // 获取双击的行和列
             LVHITTESTINFO   lvInfo   ;
             CRect   ItemRect   ;
             CString   strValue   ;
             lvInfo . pt   =   point ;
             HitTest (& lvInfo   );
             SubItemHitTest (& lvInfo   );
          
             m_nCheckItem   =   lvInfo   . iItem ;
             m_nCheckSubItem   =   lvInfo   . iSubItem ;
             // 点击空白部分或者点击序号
             if   ( m_nCheckItem   ==-1|| m_nCheckSubItem ==0)
          {
                      return ;
          }

             // 获取点击的矩形
             GetSubItemRect ( m_nCheckItem   , m_nCheckSubItem ,   LVIR_BOUNDS , ItemRect   );

             // 创建 Edit   ,在失去焦点时销毁
             m_pEdit   =   new   CEdit ;
             m_pEdit -> Create   ( WS_CHILD |   WS_VISIBLE , ItemRect   , this ,10000);
             // 获取点击的值 , 设置到   Edit 控件中
             strValue   =   GetItemText   ( m_nCheckItem ,   m_nCheckSubItem );
             m_pEdit -> SetWindowText   ( strValue );
             // 设置焦点并把焦点置末尾
             m_pEdit -> SetFocus   ();
             m_pEdit -> SetSel   (-1);

             CListCtrl :: OnLButtonDblClk   ( nFlags ,   point );
}
// Edit   控件失去焦点时
void   CEditCtrl   :: OnEnKillfocusEditRolename ()
{
             // 获取 Edit   值填充到 ListCtrl
             CString   strValue   ;
             m_pEdit -> GetWindowText   ( strValue );
             SetItemText ( m_nCheckItem   , m_nCheckSubItem ,   strValue );
             // 销毁指针
             delete   m_pEdit   ;
}

BOOL   CEditCtrl   :: PreTranslateMessage (   MSG *   pMsg   )
{
             // 如果点击的是回车键
             if   ( pMsg   -> message   ==   WM_KEYDOWN )
          {
                      int   nVirtual   =   pMsg ->   wParam ;
                      if   ( nVirtual   == VK_RETURN )
                   {
                                SendMessage ( WM_KILLFOCUS   );
                                return   TRUE   ;
                   }
          }
             return   CListCtrl   :: PreTranslateMessage (   pMsg );
}
天天努力一点点,好日子会慢慢的到来的。嘻嘻

你可能感兴趣的:(C++实现可编辑列表框控件类)