📄 listctrl.cpp
字号:
// ListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "ListCtrl.h"
#include "EditCell.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_EDITCELL 1001
/////////////////////////////////////////////////////////////////////////////
// EditListCtrl
EditListCtrl::EditListCtrl (CString Text /* = "Some Text" */)
{
m_OddEven=0;
}
EditListCtrl::~EditListCtrl()
{
}
BEGIN_MESSAGE_MAP(EditListCtrl, CListCtrl)
//{{AFX_MSG_MAP(EditListCtrl)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
ON_WM_KEYDOWN()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// EditListCtrl message handlers
void EditListCtrl::Resize (int cx, int cy)
{
CRect Rect (0, 0, cx, cy);
MoveWindow (&Rect);
InvalidateRect (Rect);
SetColumnWidth (2, LVSCW_AUTOSIZE_USEHEADER);
}
CEdit* EditListCtrl::EditSubItem (int Item, int Column)
{
// The returned pointer should not be saved
// Make sure that the item is visible
Column=1;
if (!EnsureVisible (Item, TRUE))
{
if(GetItemCount()<256)
{
InsertItemEx(Item,1);
if (!EnsureVisible (Item, TRUE))
return NULL;
}
else
return NULL;
}
// Make sure that nCol is valid
CHeaderCtrl* pHeader = (CHeaderCtrl*) GetDlgItem(0);
int nColumnCount = pHeader->GetItemCount();
if (Column >= nColumnCount || GetColumnWidth (Column) < 5)
return NULL;
// Get the column offset
int Offset = 0;
for (int iColumn = 0; iColumn < Column; iColumn++)
Offset += GetColumnWidth (iColumn);
CRect Rect;
GetItemRect (Item, &Rect, LVIR_BOUNDS);
// Now scroll if we need to expose the column
CRect ClientRect;
GetClientRect (&ClientRect);
if (Offset + Rect.left < 0 || Offset + Rect.left > ClientRect.right)
{
CSize Size;
if (Offset + Rect.left > 0)
Size.cx = -(Offset - Rect.left);
else
Size.cx = Offset - Rect.left;
Size.cy = 0;
Size.cx--;
Scroll (Size);
Rect.left -= Size.cx;
}
// Get Column alignment
LV_COLUMN lvCol;
lvCol.mask = LVCF_FMT;
GetColumn (Column, &lvCol);
DWORD dwStyle;
if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
dwStyle = ES_LEFT;
else if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
dwStyle = ES_RIGHT;
else dwStyle = ES_CENTER;
Rect.left += Offset+4;
Rect.right = Rect.left + GetColumnWidth (Column) - 8;
if (Rect.right > ClientRect.right)
Rect.right = ClientRect.right;
dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE ;
CEdit *pEdit = new EditCell (this, Item, Column, GetItemText (Item, Column));
pEdit->Create (dwStyle, Rect, this, IDC_EDITCELL);
return pEdit;
}
int EditListCtrl::HitTestEx (CPoint& Point, int* pColumn)
{
int ColumnNum = 0;
int Row = HitTest (Point, NULL);
if (pColumn)
*pColumn = 0;
// Make sure that the ListView is in LVS_REPORT
if ((GetWindowLong (m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT)
return Row;
// Get the top and bottom row visible
Row = GetTopIndex();
int Bottom = Row + GetCountPerPage();
if (Bottom > GetItemCount())
Bottom = GetItemCount();
// Get the number of columns
CHeaderCtrl* pHeader = (CHeaderCtrl*) GetDlgItem(0);
int nColumnCount = pHeader->GetItemCount();
// Loop through the visible rows
for(; Row <= Bottom; Row++)
{
// Get bounding rect of item and check whether point falls in it.
CRect Rect;
GetItemRect (Row, &Rect, LVIR_BOUNDS);
if (Rect.PtInRect (Point))
{
// Now find the column
for (ColumnNum = 0; ColumnNum < nColumnCount; ColumnNum++)
{
int ColWidth = GetColumnWidth (ColumnNum);
if (Point.x >= Rect.left && Point.x <= (Rect.left + ColWidth))
{
if (pColumn)
*pColumn = ColumnNum;
return Row;
}
Rect.left += ColWidth;
}
}
}
return -1;
}
int EditListCtrl::InsertItemEx (int Item,int Value)
{
CString ItemVal,Temp;
int i,m,n;
int Result;
ItemVal.Format("a[%d]",Item);
if(Item<0||Item>GetItemCount())
return 0;
n=GetItemNum(Item);
Result=InsertItem(Item,ItemVal);
m=GetItemCount();
for(i=m-1;i>Item;i--)
{
ItemVal.Format("a[%d]",i);
SetItemText(i,0,ItemVal);
if(i==Item+1)
{
SetItemNum(i,n);
}
else
{
m=GetItemNum(i-1);
SetItemNum(i,m);
}
}
ItemVal.Format("%d",Value);
SetItemText (Item,1,ItemVal);
//SetColumnWidth (2, LVSCW_AUTOSIZE_USEHEADER);
return Result;
}
void EditListCtrl::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (GetFocus() != this)
SetFocus();
CListCtrl::OnHScroll (nSBCode, nPos, pScrollBar);
}
void EditListCtrl::OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (GetFocus() != this)
SetFocus();
CListCtrl::OnVScroll (nSBCode, nPos, pScrollBar);
}
void EditListCtrl::OnEndLabelEdit (NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;
LV_ITEM *plvItem = &plvDispInfo->item;
if (plvItem->pszText != NULL)
{
SetItemText (plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
}
int m=GetItemCount();
if(m_OddEven==0)
{
SetItemNum(m-plvItem->iItem-1,-1*GetItemNum(plvItem->iItem));
}
else if(m_OddEven==1)
{
SetItemNum(m-plvItem->iItem-1,GetItemNum(plvItem->iItem));
}
if((m%2)&&(plvItem->iItem==(m-1)/2)&&m_OddEven==0)
{
SetItemNum((m-1)/2,0);
}
*pResult = FALSE;
}
void EditListCtrl::OnLButtonDown (UINT nFlags, CPoint Point)
{
CListCtrl::OnLButtonDown (nFlags, Point);
int Index;
int ColNum;
if ((Index = HitTestEx (Point, &ColNum)) != -1)
{
if (ColNum==1)
{
EditSubItem (Index,ColNum);
}
}
}
int EditListCtrl::GetItemNum(int Item)
{
CString NumStr;
int Number;
char NumChar[20];
NumStr=GetItemText(Item,1);
memcpy(NumChar,NumStr,20);
NumChar[19]=0;
int i;
Number=0;
int r;
if(NumChar[0]=='-')
r=-1;
else
{
r=1;
Number=NumChar[0]-48;
}
for(i=1;NumChar[i];i++)
Number=Number*10+NumChar[i]-48;
Number=Number*r;
return Number;
}
void EditListCtrl::SetItemNum(int Item,int Value)
{
CString NumStr;
NumStr.Format("%d",Value);
SetItemText(Item,1,NumStr);
}
BOOL EditListCtrl::DeleteSelItem()
{
int i,j,m,n;
CString SBuf;
char SChar[20];
m=GetItemCount();
for(i=0;i<m;i++)
{
if(GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
{
DeleteItem(i);
for(j=i+1;j<m;j++)
{
if(GetItemState(j,LVIS_SELECTED)==LVIS_SELECTED)
DeleteItem(j);
else
break;
}
n=i;
for(j=n;j<m;j++,n++)
{
SBuf.Format("a[%d]",n);
memcpy(SChar,SBuf,20);
SChar[19]=0;
SetItemText(n,0,SChar);
SBuf=GetItemText(j,1);
memcpy(SChar,SBuf,20);
SChar[19]=0;
SetItemText(n,1,SChar);
}
}
}
RefreshData(0);
return TRUE;
}
void EditListCtrl::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
{
// Up and down are in the OnKeyDown so that the user can hold down the arrow
// keys to scroll through the entries.
switch (nChar)
{
case VK_DELETE:
{
DeleteSelItem();
return;
}
}
CListCtrl::OnKeyDown (nChar, nRepCnt, nFlags);
}
void EditListCtrl::RefreshData(int Order)
{
int i,m;
m=GetItemCount();
UpdateData();
if(Order==0)
{
if(m_OddEven==0)
{
for(i=0;i<m/2;i++)
SetItemNum(m-i-1,-1*GetItemNum(i));
if(m%2)
{
SetItemNum((m-1)/2,0);
}
}
else if(m_OddEven==1)
{
for(i=0;i<m/2;i++)
SetItemNum(m-i-1,GetItemNum(i));
}
}
else if(Order==1)
{
if(m_OddEven==0)
{
for(i=0;i<m/2;i++)
SetItemNum(i,-1*GetItemNum(m-i-1));
if(m%2)
{
SetItemNum((m-1)/2,0);
}
}
else if(m_OddEven==1)
{
for(i=0;i<m/2;i++)
SetItemNum(i,GetItemNum(m-i-1));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -