VC列表list上增加edit控件和combo控件实现


自定义类CEditItem

头文件

#define EDIT_TYPE_DOUBLE   1
#define EDIT_TYPE_STRING   2
#define EDIT_TYPE_NBR16    3
#define EDIT_TYPE_NBR10    4

#define WM_EDIT_ITEM  (WM_USER+0002)

class CEditItem : public CEdit
{
// Construction
public:
	CEditItem();
	CEditItem(int nItem, int nSubItem,int nDigitType = EDIT_TYPE_STRING)
	{
		m_nItem = nItem;
		m_nSubItem = nSubItem;
		m_nDigitType = nDigitType;
		m_sTempText = "";
	}

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CEditItem)
	public:
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CEditItem();

	// Generated message map functions
protected:
	//{{AFX_MSG(CEditItem)
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

private:
	int m_nItem;
	int m_nSubItem;
	int m_nDigitType;//数据类型
	CString m_sTempText;//存储先前的内容
public:
	void SetWindowText(CString strText);

源文件

CEditItem::CEditItem()
{
	m_nItem     =  -1;
	m_nSubItem  =  -1;
	m_nDigitType = 0;
	m_sTempText = "";
}

CEditItem::~CEditItem()
{
}


BEGIN_MESSAGE_MAP(CEditItem, CEdit)
	//{{AFX_MSG_MAP(CEditItem)
	ON_WM_KILLFOCUS()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CEditItem message handlers

void CEditItem::OnKillFocus(CWnd* pNewWnd) 
{
	CEdit::OnKillFocus(pNewWnd);
	
	// TODO: Add your message handler code here
	CString str = "";
	CEdit::GetWindowText(str);
	if(str.IsEmpty())
	{
		SetWindowText(m_sTempText);
	}
	GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
}

BOOL CEditItem::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
	{
		CString str = "";
		CEdit::GetWindowText(str);
		if(str.IsEmpty())
		{
			SetWindowText(m_sTempText);
		}
		GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
		return true; 
	}
	else if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
	{
		SetWindowText(m_sTempText);
		GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
		return true;
	}
	else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0x30 || pMsg->wParam == 0x31 || pMsg->wParam == 0x32
		||pMsg->wParam == 0x33||pMsg->wParam == 0x34||pMsg->wParam == 0x35||pMsg->wParam == 0x36
		||pMsg->wParam == 0x37||pMsg->wParam == 0x38||pMsg->wParam == 0x39 ))
	{
	}
	else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0x41 || pMsg->wParam == 0x42 || pMsg->wParam == 0x43
		||pMsg->wParam == 0x44 || pMsg->wParam == 0x45 || pMsg->wParam == 0x46 ))
	{
		if((m_nDigitType == EDIT_TYPE_NBR10 ) || (m_nDigitType == EDIT_TYPE_DOUBLE ) )
		{
			return true;
		}
	}
	else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0xBD || pMsg->wParam == 0xBE ))
	{
		if(m_nDigitType == EDIT_TYPE_NBR16 )
		{
			return true;
		}
	}
	else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_NUMPAD0 || pMsg->wParam == VK_NUMPAD1 || pMsg->wParam == VK_NUMPAD2
		||pMsg->wParam == VK_NUMPAD3||pMsg->wParam == VK_NUMPAD4||pMsg->wParam == VK_NUMPAD5||pMsg->wParam == VK_NUMPAD6
		||pMsg->wParam == VK_NUMPAD7||pMsg->wParam == VK_NUMPAD8||pMsg->wParam == VK_NUMPAD9))
	{
	}
	else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_BACK || pMsg->wParam == VK_DELETE || pMsg->wParam == VK_LEFT
		||pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || pMsg->wParam == VK_SUBTRACT))
	{}
	else if(pMsg->message == WM_KEYDOWN)
	{
		if(m_nDigitType == EDIT_TYPE_NBR10 || m_nDigitType == EDIT_TYPE_NBR16)
		{
			return true;
		}
		if(m_nDigitType == EDIT_TYPE_DOUBLE)
		{
			if(pMsg->wParam == VK_DECIMAL)
			{}
			else
			{
				return true;
			}
		}
	}
	
	return CEdit::PreTranslateMessage(pMsg);
}

//获取控件之前内容
void CEditItem::SetWindowText(CString strText)
{
	m_sTempText = strText;
	CEdit::SetWindowText(strText);
}


自定义类CComboBoxItem

头文件

#define WM_COMBO_ITEM  (WM_USER+0003)

class CComboBoxItem : public CComboBox
{
// Construction
public:
	CComboBoxItem();
	CComboBoxItem(int nItem, int nSubItem)
	{
		m_nItem = nItem;
		m_nSubItem = nSubItem;
	}

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CComboBoxItem)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CComboBoxItem();

	// Generated message map functions
protected:
	//{{AFX_MSG(CComboBoxItem)
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
private:
	int m_nItem;
	int m_nSubItem;
};

源文件

CComboBoxItem::CComboBoxItem()
{
	m_nItem    = -1;
	m_nSubItem = -1;
}

CComboBoxItem::~CComboBoxItem()
{
}


BEGIN_MESSAGE_MAP(CComboBoxItem, CComboBox)
	//{{AFX_MSG_MAP(CComboBoxItem)
	ON_WM_KILLFOCUS()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CComboBoxItem message handlers

void CComboBoxItem::OnKillFocus(CWnd* pNewWnd) 
{
	CComboBox::OnKillFocus(pNewWnd);
	
	// TODO: Add your message handler code here
	GetParent()->SendMessage(WM_COMBO_ITEM,m_nItem,m_nSubItem);
}


控件控制类CMyListCtrl

头文件

#include "EditItem.h"
#include "ComboBoxItem.h"

/
// CMyListCtrl window

class CMyListCtrl : public CListCtrl
{
// Construction
public:
	CMyListCtrl();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMyListCtrl)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CMyListCtrl();

	// Generated message map functions
protected:
	//{{AFX_MSG(CMyListCtrl)
	afx_msg void OnEditItem(WPARAM wParam, LPARAM lParam);
	afx_msg void OnComboItem(WPARAM wParam, LPARAM lParam);
	afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
private:
	CComboBoxItem *m_pCombo;
	CEditItem *m_pEdit;
};

源文件

CMyListCtrl::CMyListCtrl()
{
	m_pEdit = NULL;
	m_pCombo = NULL;
}

CMyListCtrl::~CMyListCtrl()
{
}


BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CMyListCtrl)
	ON_MESSAGE(WM_EDIT_ITEM,OnEditItem)
	ON_MESSAGE(WM_COMBO_ITEM,OnComboItem)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CMyListCtrl message handlers
void CMyListCtrl::OnEditItem(WPARAM wParam, LPARAM lParam)
{
	CString strText = "";
	if(m_pEdit)
	{
		m_pEdit->GetWindowText(strText);
		m_pEdit->PostMessage(WM_CLOSE);
		delete m_pEdit;
		m_pEdit = NULL;
	}
	else
	{
		return;
	}
	
	int nItem = int(wParam);
	int nSubItem = int(lParam);
	
	SetItemText(nItem,nSubItem,strText);
}

void CMyListCtrl::OnComboItem(WPARAM wParam, LPARAM lParam)
{
	CString strText = "";
	if(m_pCombo)
	{
		m_pCombo->GetWindowText(strText);
		m_pCombo->PostMessage(WM_CLOSE);
		delete m_pCombo;
		m_pCombo = NULL;
	}
	else
	{
		return;
	}
	
	int nItem = int(wParam);
	int nSubItem = int(lParam);
	
	SetItemText(nItem,nSubItem,strText);
}

void CMyListCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	if( -1 == pNMListView->iItem)
	{
		*pResult = 0;
		return;
	}

	int nItem = pNMListView->iItem;
	int nSubItem = pNMListView->iSubItem;
	CString strText = GetItemText(nItem,nSubItem);

	CRect rect( 0,0,1,1 );
	GetSubItemRect(nItem, nSubItem,LVIR_BOUNDS , rect);

	if(2 == nSubItem)//combo
	{
		if(m_pCombo)
		{
			m_pCombo->PostMessage(WM_CLOSE);
			delete m_pCombo;
			m_pCombo = NULL;
		}
		rect.bottom += 300;
		m_pCombo = new CComboBoxItem(nItem, nSubItem);
		DWORD dwStyle = ES_LEFT;
		dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_VSCROLL;
		m_pCombo->Create(dwStyle, rect, this, 122);
		m_pCombo->ResetContent();
		m_pCombo->AddString("boy");
		m_pCombo->AddString("girl");
		m_pCombo->SelectString(-1,strText);
		m_pCombo->ShowDropDown();
		m_pCombo->SetFocus();
	}
	else if(1 == nSubItem)//edit
	{
		if(m_pEdit)
		{
			m_pEdit->PostMessage(WM_CLOSE);
			delete m_pEdit;
			m_pEdit = NULL;
		}
		m_pEdit = new CEditItem(nItem, nSubItem);
		DWORD dwStyle = ES_LEFT;
		dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
		m_pEdit->Create(dwStyle,rect,this,121);
		m_pEdit->SetWindowText(strText);
		m_pEdit->SetFocus();
		m_pEdit->SetSel(0,-1);
	}
	else
	{
		if(0 == nSubItem)
		{
			rect.right = rect.left + GetColumnWidth(0);
		}
	}
	
	*pResult = 0;
}


对话框调用方法

头文件

#include "MyListCtrl.h"

/
// CListEditDlg dialog

class CListEditDlg : public CDialog
{
// Construction
public:
	CListEditDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CListEditDlg)
	enum { IDD = IDD_LISTEDIT_DIALOG };
	CMyListCtrl	m_list1;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CListEditDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CListEditDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	void SetListInit();
};

源文件

void CListEditDlg::SetListInit()
{
	//属性设置
	m_list1.ModifyStyle(LVS_TYPEMASK,LVS_REPORT&LVS_TYPEMASK|LVS_SINGLESEL);
	DWORD dwStyle = m_list1.GetExtendedStyle();
	m_list1.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	
	//设置行宽
	CImageList image;
	image.Create(1,30,ILC_COLOR24|ILC_MASK,4,0);
	m_list1.SetImageList(&image,LVSIL_SMALL);
	
	//设置字体和大小
	CFont font;
	font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋体");
	m_list1.SetFont(&font);
	m_list1.GetHeaderCtrl()->SetFont(&font);
	
	//设置标题头
	m_list1.InsertColumn(0,"序号",LVCFMT_LEFT,80,0);
	m_list1.InsertColumn(1,"姓名",LVCFMT_LEFT,120,0);
	m_list1.InsertColumn(2,"性别",LVCFMT_LEFT,80,0);
	
	//设置内容
	m_list1.InsertItem(0,"001");
	m_list1.SetItemText(0,1,"小明");
	m_list1.SetItemText(0,2,"boy");
	
	m_list1.InsertItem(1,"002");
	m_list1.SetItemText(1,1,"小红");
	m_list1.SetItemText(1,2,"gril");
	
	m_list1.InsertItem(2,"003");
	m_list1.SetItemText(2,1,"小华");
	m_list1.SetItemText(2,2,"boy");
}

运行效果



双击姓名栏



双击性别栏




源码下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值