📄 editablelistctrl.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 + -