⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editablelistctrl.cpp

📁 VC++和ACCESS使用ADO连接
💻 CPP
字号:
// EditableListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "MinistryPerson.h"
#include "EditableListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEditableListCtrl

CEditableListCtrl::CEditableListCtrl()
{
	m_CurSelSubItem = -1;
	m_CurSelItem = -1;
}

CEditableListCtrl::~CEditableListCtrl()
{
}


BEGIN_MESSAGE_MAP(CEditableListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CEditableListCtrl)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_EN_KILLFOCUS(IDC_LISTEDIT, OnEditKillFocus)
	ON_WM_MOUSEWHEEL()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEditableListCtrl message handlers



/*********************************************************************
函数说明:	  重写父类的虚函数以实现对  m_Edit 的初始化
函数参数:	  void
*********************************************************************/
void CEditableListCtrl::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	RECT rc = {0};
	m_Edit.Create(WS_CHILD | WS_TABSTOP | WS_VISIBLE | ES_LEFT, rc, this, IDC_LISTEDIT);	// 创建编辑框
	CListCtrl::PreSubclassWindow();
}


/*********************************************************************
函数说明:	  
函数参数:	  
*********************************************************************/
void CEditableListCtrl::ShowEditBoxint(BOOL bIsShow, int nItem, int nSubItem)
{
	CString strContent;
	CRect	rc;

	if (!bIsShow)
	{
		m_Edit.ShowWindow(SW_HIDE);		// 应藏编辑框
		return;
	}

	strContent = GetItemText(nItem, nSubItem);		// 得到当前项的内容
	GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rc);// 得到当前项的位置和大小
	m_Edit.SetWindowText(strContent);				// 设置编辑框内容是当前项的内容
	m_Edit.SetFocus();								// 把焦点移到编辑框上
	m_Edit.SetSel(0, -1);							// 设置为选中状态
	// 设定编辑框的位置、大小为当前项的位置大小
	m_Edit.MoveWindow(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
	m_Edit.ShowWindow(SW_SHOW);						// 显示编辑框
}

/*********************************************************************
函数说明:	  
函数参数:	  
*********************************************************************/
void CEditableListCtrl::ShowEditBoxCRect(BOOL bIsShow, CRect *rc)
{
	ASSERT((bIsShow && (rc != NULL)) || !bIsShow);		// bIsShow 决定是否显示, rc 为显示的区域
	if (rc != NULL)		
	{
		// rc不为NULL时,设定编辑框的区域为rc
		m_Edit.MoveWindow(rc->left, rc->top, rc->right - rc->bottom, TRUE);
	}

	if (bIsShow)	// 是否显示
	{
		m_Edit.SetFocus();
		m_Edit.ShowWindow(SW_SHOW);
	}
	else if (!bIsShow)
	{
		m_Edit.ShowWindow(SW_HIDE);
	}
}

/*********************************************************************
函数说明:	  双击消息
函数参数:	  
*********************************************************************/
void CEditableListCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
	if (lpnmlv->iItem >= 0)
	{
		CRect rc;
		CWnd *Wnd = GetParent();			// 得到父窗口
		m_CurSelItem = lpnmlv->iItem;		// 得到双击项
		m_CurSelSubItem = lpnmlv->iSubItem;	// 得到双击的子项
		// 得到双击项的文本
		CString strText = GetItemText(m_CurSelItem, m_CurSelSubItem); 
		m_Edit.SetWindowText(strText);		// 设定编辑框文本为双击项文本
		m_Edit.SetSel(0, -1);				// 设定编辑框为选中状态

		// 得到边界区域
		GetSubItemRect(lpnmlv->iItem, lpnmlv->iSubItem, LVIR_LABEL, rc);

		// 设定编辑框的位置、大小
		rc.bottom = rc.bottom - rc.top;
		rc.right  = rc.right - rc.left;
		ShowEditBoxCRect(FALSE, &rc);
		Wnd->SendMessage(UM_LISTEDIT_DBCLICK, (WPARAM)lpnmlv, 0);	// 给父窗口发送双击消息
	}

	*pResult = 0;
}

/*********************************************************************
函数说明:	  
函数参数:	  
*********************************************************************/
void CEditableListCtrl::OnEditKillFocus()
{
	CString str;
	CWnd *Wnd;

	Wnd = GetParent();
	ShowEditBoxCRect(FALSE, NULL);		// 应藏编辑框
	m_Edit.GetWindowText(str);
	SetItemText(m_CurSelItem, m_CurSelSubItem, str.GetBuffer(0));	// 设定当前项的文本为编辑框文本

	// 通知父窗口当前项的内容已经改变
	::SendMessage(Wnd->m_hWnd, UM_LISTEDIT_KILLFOCUS, m_CurSelItem, m_CurSelSubItem);

	// 一定要将以下 2 变量置为 -1,否则会出错
	m_CurSelItem = -1;	
	m_CurSelSubItem = -1;
	m_Edit.SetWindowText("");	// 清空编辑框内容
}

BOOL CEditableListCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
	SetFocus();
	return CListCtrl::OnMouseWheel(nFlags, zDelta, pt);
}

void CEditableListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	SetFocus();	
	CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CEditableListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	SetFocus();	
	CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -