📄 editlistctrl.cpp
字号:
// EditListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "EditListCtrl.h"
#include <windowsx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_EDIT 0X01
#define PROPERTY_ITEM 0x02
#define PROPERTY_SUB 0x03
/////////////////////////////////////////////////////////////////////////////
// CEditListCtrl
CEditListCtrl::CEditListCtrl()
{
m_edit.m_hWnd = NULL;
m_bCtrlEditable=TRUE;
}
CEditListCtrl::~CEditListCtrl()
{
}
BEGIN_MESSAGE_MAP(CEditListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CEditListCtrl)
ON_WM_LBUTTONDBLCLK()
ON_WM_PARENTNOTIFY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USER_EDIT_END,OnEditEnd)
END_MESSAGE_MAP()
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CRect rcCtrl;
LVHITTESTINFO lvhti;
lvhti.pt = point;
int nItem = CListCtrl::SubItemHitTest(&lvhti);
if(nItem == -1)
return;
int nSubItem = lvhti.iSubItem;
if(m_bCtrlEditable && m_arrayEditable.GetSize()>nSubItem)
{
if (m_arrayEditable[nSubItem])
{
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);
ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
}
}
CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CEditListCtrl::ShowEdit(BOOL bShow,int nItem,int nIndex,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);
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,nIndex);
m_edit.MoveWindow(rcCtrl);
m_edit.ShowWindow(SW_SHOW);
m_edit.SetWindowText(strItem);
::SetFocus(m_edit.GetSafeHwnd());
m_edit.SetSel(-1);
m_edit.SetCtrlData(MAKEWPARAM(nIndex,nItem));
}
else
m_edit.ShowWindow(SW_HIDE);
}
long CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
if(wParam == TRUE)
{
CString strText(_T(""));
m_edit.GetWindowText(strText);
DWORD dwData = m_edit.GetCtrlData();
int nItem= dwData>>16;
int nIndex = dwData & 0x0000ffff;
CListCtrl::SetItemText(nItem,nIndex,strText);
if (GetOwner()->GetSafeHwnd())
{
GetOwner()->PostMessage(WM_CELLCHANGED,nItem,nIndex);
}
}
else
{
}
if(lParam == FALSE)
m_edit.ShowWindow(SW_HIDE);
return 0;
}
void CEditListCtrl::OnParentNotify(UINT message, LPARAM lParam)
{
CListCtrl::OnParentNotify(message, lParam);
//////////////////////////////////////////////////////////////////////////
CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
if(pHeaderCtrl == NULL)
return;
CRect rcHeader;
pHeaderCtrl->GetWindowRect(rcHeader);
ScreenToClient(rcHeader);
//The x coordinate is in the low-order word and the y coordinate is in the high-order word.
CPoint pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
{
if(m_edit.m_hWnd != NULL)
{
DWORD dwStyle = m_edit.GetStyle();
if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
{
m_edit.ShowWindow(SW_HIDE);
}
}
}
}
BOOL CEditListCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_TAB && m_edit.m_hWnd!= NULL)
{
DWORD dwStyle = m_edit.GetStyle();
if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
{
OnEditEnd(TRUE,TRUE);
CRect rcCtrl;
int nItem;
int nSub;
if(FALSE == Key_Ctrl(nItem,nSub))
Key_Shift(nItem,nSub);
CListCtrl::GetSubItemRect(nItem,nSub,LVIR_LABEL,rcCtrl);
CPoint pt(rcCtrl.left+1,rcCtrl.top+1);
OnLButtonDblClk(0,pt);
POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
if (pos == NULL)
{
}
else
{
while (pos)
{
int ntpItem = CListCtrl::GetNextSelectedItem(pos);
CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
}
}
CListCtrl::SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
return TRUE;
}
}
}
return CListCtrl::PreTranslateMessage(pMsg);
}
BOOL CEditListCtrl::Key_Shift(int& nItem,int& nSub)
{
int nItemCount = CListCtrl::GetItemCount();
DWORD dwData = m_edit.GetCtrlData();
nItem= dwData>>16;
nSub = dwData&0x0000ffff;
CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
if(pHeader == NULL)
return FALSE;
short sRet = GetKeyState(VK_SHIFT);
int nSubcCount = pHeader->GetItemCount();
sRet = sRet >>15;
if(sRet == 0)
{
nSub += 1;
if(nSub >= nSubcCount)
{
if(nItem == nItemCount-1)
{
nItem = 0;
nSub = 0;
}
else
{
nSub = 0;
nItem += 1;
}
}
if(nItem >= nItemCount)
nItem = nItemCount-1;
return FALSE;
}
else
{
nSub -= 1;
if(nSub < 0)
{
nSub = nSubcCount -1;
nItem --;
}
if(nItem < 0)
nItem = nItemCount-1;
return TRUE;
}
return FALSE;
}
BOOL CEditListCtrl::Key_Ctrl(int& nItem,int &nSub)
{
short sRet = GetKeyState(VK_CONTROL);
DWORD dwData = m_edit.GetCtrlData();
nItem= dwData>>16;
nSub = dwData&0x0000ffff;
sRet = sRet >>15;
int nItemCount = CListCtrl::GetItemCount();
if(sRet == 0)
{
}
else
{
nItem = nItem >=nItemCount-1? 0:nItem+=1;
return TRUE;
}
return FALSE;
}
int CEditListCtrl::InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem )
{
int ir=CListCtrl::InsertColumn( nCol, lpszColumnHeading, nFormat, nWidth, nSubItem );
BOOL bTemp=FALSE;
m_arrayEditable.Add(bTemp);
return ir;
}
BOOL CEditListCtrl::DeleteColumn( int nCol )
{
BOOL br=CListCtrl::DeleteColumn( nCol );
if (br)
{
m_arrayEditable.RemoveAt(nCol);
}
return br;
}
void CEditListCtrl::EnableColEditable(int nCol, BOOL bEditable)
{
if (nCol<m_arrayEditable.GetSize())
{
m_arrayEditable[nCol]=bEditable;
}
}
void CEditListCtrl::EnableEditable(BOOL bEdit)
{
m_bCtrlEditable=bEdit;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -