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

📄 listctrl.cpp

📁 一个fir滤波器Designer的例子
💻 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 + -