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);
}
天天努力一点点,好日子会慢慢的到来的。嘻嘻
思路如下:
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++实现平面上的形状编辑
- c++实现平面上的形状编辑
- MFC可编辑列表框控件功能实现
- c++实现平面上的形状编辑
- c++实现平面上的形状编辑
- C++中嵌入网页(duilib编辑框的实现)
- js+CSS 实现可以编辑的下拉列表框
- 用Javascript实现类似ComboBox的可编辑下拉列表框.
- gvim 下实现c/c++ 编辑环境
- 下拉列表框只能选择,我想选择后还可以允许用户对选择的内容进行修改,如何实现可编辑的下拉列表框?
- C++实现两个字符串之间的Levenshtein Distance(编辑距离)
- 最小编辑距离及其C++实现
- 编辑距离C++实现(poj3356)
- c++实现平面上的形状编辑
- c++实现平面上的形状编辑
- 详细的单链表基本操作C/C++实现
- 最优二叉查找树的详细分析,c++代码实现
- 算法导论-第15章-动态规划:钢条切割问题自底向下方法C++实现
- 【C++ STL应用与实现】23: 如何使用std::mem_fn (since C++11)
- C++箴言:接口继承和实现继承