CListCtrl可编辑列值封装类

Home / Hackintosh MrLee 2015-7-16 3897

这个功能也是入门朋友经常遇到的问题,网上也有不少解决方案。不过不是很灵活,在这里,我简单封装了一下,使用更方便。只需要把你申明的CListCtrl变量改成我封装的CEditListCtrl即可。当然要导头文件。不然无法找到类型。 下面是源码 .h文件
#pragma once
#define WM_USER_EDIT_END WM_USER + 1001
class CListCtrlEdit : public CEdit
{
	DECLARE_DYNAMIC(CListCtrlEdit)
protected:
	DECLARE_MESSAGE_MAP()
public:
	void OnKillFocus(CWnd* pNewWnd);
};
// CEditListCtrl
class CEditListCtrl : public CListCtrl
{
	DECLARE_DYNAMIC(CEditListCtrl)
public:
	CEditListCtrl();
	virtual ~CEditListCtrl();
protected:
	DECLARE_MESSAGE_MAP()
private:
	CListCtrlEdit* m_listEdit;
	int m_Row;
	int m_Col;
public:
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);
	virtual void PreSubclassWindow();
};

下面是.cpp文件
// EditListCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "EditListCtrl.h"
//
IMPLEMENT_DYNAMIC(CListCtrlEdit, CEdit)
BEGIN_MESSAGE_MAP(CListCtrlEdit, CEdit)
	ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)
{
	CWnd* pParent = this->GetParent();
	::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,0,0);
}
// CEditListCtrl
IMPLEMENT_DYNAMIC(CEditListCtrl, CListCtrl)
CEditListCtrl::CEditListCtrl()
	: m_Row(0),
	m_Col(0),
	m_listEdit(NULL)
{
}
CEditListCtrl::~CEditListCtrl()
{
	if(m_listEdit)delete m_listEdit;
}
BEGIN_MESSAGE_MAP(CEditListCtrl, CListCtrl)
	ON_WM_LBUTTONDBLCLK()
	ON_MESSAGE(WM_USER_EDIT_END,CEditListCtrl::OnEditEnd)
END_MESSAGE_MAP()
// CEditListCtrl 消息处理程序
void CEditListCtrl::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	CListCtrl::PreSubclassWindow();
	SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); //设置list风格
}
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	LVHITTESTINFO lvhti;    // 大气象:保存ListCtrl行列信息的结构
	lvhti.pt = point;
	m_Row = CListCtrl::SubItemHitTest(&lvhti);
	if (m_Row == -1) return;
	m_Col = lvhti.iSubItem;
	CRect rect;
	CListCtrl::GetSubItemRect(m_Row,m_Col,LVIR_LABEL,rect);//获得子项的RECT
	if (!m_listEdit)
	{
		//创建EDIT控件
		m_listEdit = new CListCtrlEdit;
		//转换坐标为列表框中的坐标
		BOOL bSuc = m_listEdit->Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,1);
		if(!bSuc)ASSERT("Edit Create Fail");
		CFont tpFont;
		tpFont.CreateStockObject(DEFAULT_GUI_FONT);
		m_listEdit->SetFont(&tpFont);
		tpFont.DeleteObject();
	}
	m_listEdit->MoveWindow(&rect);//移动Edit到RECT坐在的位置;
	m_listEdit->SetWindowText(GetItemText(m_Row,m_Col));//将该子项中的值放在Edit控件中;
	m_listEdit->SetFocus();//设置Edit焦点
	m_listEdit->ShowCaret();//显示光标
	m_listEdit->SetSel(-1);//将光标移动到最后
	m_listEdit->ShowWindow(SW_SHOW);//显示Edit控件
	CListCtrl::OnLButtonDblClk(nFlags, point);
}
LRESULT CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
	//CString strText;
	//m_listEdit->GetWindowText(strText);
	//CListCtrl::SetItemText(m_Row,m_Col,strText);
	//以上是修改内容代码,要启用先取消注释
	m_listEdit->ShowWindow(SW_HIDE);
	return 0;
}

引用方法,在Dlg窗口的DoDataExchange里面把变量CEditListCtrl m_retList和对应的ID关联起来。

sm20150716140128


效果图:

test20150716135334


附:如果自带的满足不了你的需求,可以尝试CGridListCtrlEx,这是个国外开源的一个强大的列表控件,支持下拉列表,图片,URL链接……

本文链接:https://www.it72.com/3717.htm

推荐阅读
最新回复 (0)
返回