可编辑的list control的实现

关键点:用一个cedit控件来实现对应位置的操作

 

// 头文件
class CMyEdit : public CEdit
{
public:
	afx_msg void OnKillFocus(CWnd* pNewWnd);
};

// MyEdit.cpp : 实现文件
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
	ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// CMyEdit 消息处理程序
void CMyEdit::OnKillFocus(CWnd* pNewWnd)
{
	CEdit::OnKillFocus(pNewWnd);

	// TODO: 在此处添加消息处理程序代码
	CWnd* pParent = this->GetParent();
	::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,0,0);
}

// 头文件
class CMyListCtrl : public CListCtrl
{
public:
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg LRESULT OnEditEnd(WPARAM wParam, LPARAM lParam);
public:
	void ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl);
	CMyEdit m_edit;
private:
	int m_nItem;
	int m_nSubItem;
};
// MyListCtrl.cpp : 实现文件
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	ON_WM_LBUTTONDBLCLK()
	ON_MESSAGE(WM_USER_EDIT_END, &CMyListCtrl::OnEditEnd)
END_MESSAGE_MAP()

void CMyListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rcCtrl;
	LVHITTESTINFO lvhti;
	lvhti.pt = point;
	m_nItem = CListCtrl::SubItemHitTest(&lvhti);
	if (m_nItem == -1) return;
	m_nSubItem = lvhti.iSubItem;
	if (m_nSubItem !=1) return;
	CListCtrl::GetSubItemRect(m_nItem,m_nSubItem,LVIR_LABEL,rcCtrl);
	ShowEdit(TRUE,m_nItem,m_nSubItem,rcCtrl);

	CListCtrl::OnLButtonDblClk(nFlags, point);
}

void CMyListCtrl::ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl)
{
	if (m_edit.m_hWnd == NULL)
	{
		m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,IDC_EDIT_FOR_LISTCTRL);
		m_edit.ShowWindow(SW_HIDE);

		CFont tpFont;
		tpFont.CreateStockObject(DEFAULT_GUI_FONT);
		m_edit.SetFont(&tpFont);
		tpFont.DeleteObject();
	}
	if (bShow == TRUE)
	{
		CString strItem = CListCtrl::GetItemText(nItem,nSubItem);
		m_edit.MoveWindow(&rcCtrl);
		m_edit.ShowWindow(SW_SHOW);
		m_edit.SetWindowText(strItem);
		m_edit.SetFocus();
		m_edit.SetSel(-1); 
	}
	else
		m_edit.ShowWindow(SW_HIDE);
}


LRESULT CMyListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
	CString strText;
	m_edit.GetWindowText(strText);
	CListCtrl::SetItemText(m_nItem,m_nSubItem,strText);
	m_edit.ShowWindow(SW_HIDE);

	return 0;
}

  

posted @ 2021-08-31 09:30  大鹏赋  阅读(129)  评论(0)    收藏  举报