您的位置:首页 > 编程语言 > C语言/C++

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

2014-02-12 08:45 267 查看
正常情况下,我们的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);
}
天天努力一点点,好日子会慢慢的到来的。嘻嘻
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: