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

📄 mylistctrl.cpp

📁 这个是一个比较全的超市管理系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "MyListCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct ItemData
{
public:
  ItemData() : arrpsz( NULL ), dwData( NULL ) {}
  LPTSTR* arrpsz;
  DWORD dwData;  
private:
  ItemData( const ItemData& );
  ItemData& operator=( const ItemData& );
};
CMyListCtrl::CMyListCtrl()
: m_iNumColumns( 0 )
, m_iSortColumn( -1 )
, m_bSortAscending( TRUE )
,blnMenu(TRUE)
,itemX(-1)
,itemY(-1)
,blnAllEdit(TRUE)
,m_EditStyle(ctr_Edit_DblClick)
{
}
CMyListCtrl::~CMyListCtrl()
{
	CboArrayIndex.FreeExtra();
	strArrayEditStyle.FreeExtra();
	for(int i=0;i<CboArrayData.GetSize();i++)
	{
		CStringArray *strArray=(CStringArray *)CboArrayData.GetAt(i);
		strArray->FreeExtra();
	}
	CboArrayData.FreeExtra();
	NumArrayIndex.FreeExtra();
	NumArrayData.FreeExtra();
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_WM_DESTROY()
ON_WM_RBUTTONDOWN( )
ON_WM_LBUTTONDOWN( )
ON_WM_LBUTTONDBLCLK( )
ON_WM_PARENTNOTIFY()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_COMMAND(ID_MENU_list, OnMenuitemlist)
ON_COMMAND(ID_MENU_icon, OnMenuitemicon)
ON_COMMAND(ID_MENU_smallicon, OnMenuitemsmallicon)
ON_COMMAND(ID_MENU_report, OnMenuitemreport)
ON_COMMAND(ID_MENU_No,OnMenuNo)
ON_COMMAND(ID_MENU_Click,OnMenuClick)
ON_COMMAND(ID_MENU_DblClick,OnMenuDblClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyListCtrl::PreSubclassWindow()
{  
	ctl_EditText.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
	ctl_EditDateTime.Create(ES_AUTOHSCROLL|WS_CHILD|ES_CENTER|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditDateTime);
 	ctl_EditComboDown.Create(WS_CHILD|CBS_DROPDOWN |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboDown);
 	ctl_EditComboDownList.Create(WS_CHILD|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboList);
	ctl_EditNum.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
	CFont *ft=GetFont();
	ctl_EditComboDown.SetFont(ft,TRUE);
	ctl_EditText.SetFont(ft,TRUE);
	ctl_EditDateTime.SetFont(ft,TRUE);
	ctl_EditNum.SetFont(ft,TRUE);
	ctl_EditComboDownList.SetFont(ft,TRUE);
	ctl_EditComboDownList.SetExtendedUI(TRUE);
	ctl_EditComboDown.SetExtendedUI(TRUE);
//	ModifyStyle(0,LVS_OWNERDRAWFIXED);
	CListCtrl::PreSubclassWindow();
}
//添加一项
int CMyListCtrl::AddItem(int image)
{
	LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
	for(int i=0;i<m_iNumColumns;i++)
	{
	  arrpsz[ i ] = new TCHAR[1];
	  (void)lstrcpy( arrpsz[ i ], "" );
	}
	int iIndex=InsertItem(GetItemCount(),"",image);
	VERIFY( SetTextArray( iIndex, arrpsz ) );
	return iIndex;
}
//设置排列方式
void CMyListCtrl::SetMyStyle(DWORD dwNewStyle)
{	
	if(itemX>=0&& itemY>=0)
	SetEditPos(FALSE,itemX,itemY,FALSE);
	DWORD oldStyle;
	oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
	if((oldStyle&LVS_TYPEMASK)!=dwNewStyle)
	{
		oldStyle&=~LVS_TYPEMASK;
		oldStyle|=dwNewStyle;
		SetWindowLong(GetSafeHwnd(),GWL_STYLE,oldStyle);
	}
}
//返回排列方式
DWORD CMyListCtrl::GetMyStyle()
{
	DWORD oldStyle,newStyle;
	oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
	newStyle=oldStyle&LVS_TYPEMASK;
	return newStyle;
}
void CMyListCtrl::OnMenuitemlist()
{
	SetMyStyle(LVS_LIST);
}
void CMyListCtrl::OnMenuitemicon()
{
	SetMyStyle(LVS_ICON);
}
void CMyListCtrl::OnMenuitemreport()
{
	SetMyStyle(LVS_REPORT);
}
void CMyListCtrl::OnMenuitemsmallicon()
{
	SetMyStyle(LVS_SMALLICON);
}
void CMyListCtrl::OnMenuClick ()
{
	m_EditStyle=ctr_Edit_Click;
	SetEditPos(FALSE,itemX,itemY,FALSE);
}
void CMyListCtrl::OnMenuDblClick()
{
	m_EditStyle=ctr_Edit_DblClick;
	SetEditPos(FALSE,itemX,itemY,FALSE);
}
void CMyListCtrl::OnMenuNo()
{
	if(m_EditStyle==ctr_Edit_No) return;
	m_EditStyle=ctr_Edit_No;
	if(!blnAllEdit) return;
	if(itemY<0) return;
	CString strText;
		switch(GetColumnStyle(itemY))
		{
		case ctr_Edit_CboDownList:
			ctl_EditComboDownList.ShowDropDown(FALSE);
			ctl_EditComboDownList.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditComboDownList.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_CboDown:
			ctl_EditComboDown.ShowDropDown(FALSE);
			ctl_EditComboDown.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditComboDown.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Text:
			ctl_EditText.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditText.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Time:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Date:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
		case ctr_Edit_DateTime:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Num:
			strText=ctl_EditNum.GetText();
			SetItemText(itemX,itemY,strText);
			ctl_EditNum.ShowWindow(SW_HIDE);
			break;
		default:
			ctl_EditText.ShowWindow(SW_HIDE);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			ctl_EditComboDown.ShowWindow(SW_HIDE);
			ctl_EditNum.ShowWindow(SW_HIDE);
			break;
		}
}
//右键单击显示菜单
void CMyListCtrl::OnLButtonDblClk( UINT nFlags, CPoint point )
{
	if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
	if(m_EditStyle==ctr_Edit_DblClick)
	{
		int i=itemY;
		BOOL bln;
		if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
		GetItemPos(point);
		bln=(i==itemY);
		SetEditPos(TRUE,itemX,itemY,bln);
	}
	CListCtrl::OnLButtonDblClk(nFlags,point);
}
void CMyListCtrl::OnLButtonDown( UINT nFlags, CPoint point )
{
	if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
	if(m_EditStyle==ctr_Edit_Click)
	{
		int i=itemY;
		BOOL bln;
		if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
		GetItemPos(point);
		bln=(i==itemY);
		SetEditPos(TRUE,itemX,itemY,bln);	}
	CListCtrl::OnLButtonDown(nFlags,point);
}
void CMyListCtrl::GetItemPos(CPoint point)
{
	LVHITTESTINFO lvhti;
    lvhti.pt = point;
	int nItem = CListCtrl::SubItemHitTest(&lvhti);
	if(nItem == -1)
	   return;
	int nSubItem = lvhti.iSubItem;
	itemX=nItem;
	itemY=nSubItem;	
}
void CMyListCtrl::SetEditPos(BOOL blnShow,int itemX,int itemY,BOOL blnCbo)
{
	if(!blnAllEdit) return;
	if(itemX<0||itemY<0) return;
	if(m_EditStyle==ctr_Edit_No) return;
	CString strText;
	int i;
	if(GetMyStyle()!=LVS_REPORT) return;
	if(!blnShow)
	{
		switch(GetColumnStyle(itemY))
		{
		case ctr_Edit_CboDownList:
			ctl_EditComboDownList.ShowDropDown(FALSE);
			ctl_EditComboDownList.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditComboDownList.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_CboDown:
			ctl_EditComboDown.ShowDropDown(FALSE);
			ctl_EditComboDown.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditComboDown.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Text:
			ctl_EditText.GetWindowText(strText);
			SetItemText(itemX,itemY,strText);
			ctl_EditText.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Time:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Date:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
		case ctr_Edit_DateTime:
			strText=ctl_EditDateTime.GetDetectText();
			SetItemText(itemX,itemY,strText);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			break;
		case ctr_Edit_Num:
			strText=ctl_EditNum.GetText();
			SetItemText(itemX,itemY,strText);
			ctl_EditNum.ShowWindow(SW_HIDE);
			break;
		default:
			ctl_EditText.ShowWindow(SW_HIDE);
			ctl_EditDateTime.ShowWindow(SW_HIDE);
			ctl_EditComboDown.ShowWindow(SW_HIDE);
			ctl_EditNum.ShowWindow(SW_HIDE);
			break;
		}
		//Invalidate(TRUE);
		return;
	}
	CRect rcCtrl;
	strText=GetItemText(itemX,itemY);
	CListCtrl::GetSubItemRect(itemX,itemY,LVIR_LABEL,rcCtrl);
	switch(GetColumnStyle(itemY))
	{
	case ctr_Edit_CboDownList:
		if(!blnCbo) FillCboData(itemY);
		rcCtrl.bottom=rcCtrl.top+150;
		i=ctl_EditComboDownList.FindString(0,strText);
		if(i>=0) 
			ctl_EditComboDownList.SetCurSel(i);
		else 
			ctl_EditComboDownList.SetCurSel(0);
		ctl_EditComboDownList.MoveWindow(rcCtrl,TRUE);
		ctl_EditComboDownList.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditComboDownList.m_hWnd);
		break;
	case ctr_Edit_CboDown:
		if(!blnCbo) FillCboData(itemY);
		rcCtrl.bottom=rcCtrl.top+150;
		i=ctl_EditComboDown.FindString(0,strText);
		if(i>=0) ctl_EditComboDown.SetCurSel(i);
		ctl_EditComboDown.SetWindowText(strText);
		ctl_EditComboDown.MoveWindow(rcCtrl,TRUE);
		ctl_EditComboDown.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditComboDown.m_hWnd);
		break;
	case ctr_Edit_Date:
		ctl_EditDateTime.SetClassType(edit_date);
		ctl_EditDateTime.SetDetectText(strText);
		ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
		ctl_EditDateTime.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditDateTime.m_hWnd);
		ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
		break;
	case ctr_Edit_DateTime:
		ctl_EditDateTime.SetClassType(edit_datetime);
		ctl_EditDateTime.SetDetectText(strText);
		ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
		ctl_EditDateTime.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditDateTime.m_hWnd);
		ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
		break;
	case ctr_Edit_Time:
		ctl_EditDateTime.SetClassType(edit_time);		
		ctl_EditDateTime.SetDetectText(strText);
		ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
		ctl_EditDateTime.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditDateTime.m_hWnd);
		ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
		break;
	case ctr_Edit_Text:
		ctl_EditText.SetWindowText(strText);
		ctl_EditText.MoveWindow(rcCtrl,TRUE);
		ctl_EditText.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditText.m_hWnd);
		ctl_EditText.SetSel(0,strText.GetLength(),TRUE);
		break;
	case ctr_Edit_Num:
		ctl_EditNum.blnAuto=GetNumEditAuto(itemY);
		ctl_EditNum.SetNumType(GetNumEditStyle(itemY)->x,GetNumEditStyle(itemY)->y);
		ctl_EditNum.SetText(strText);
		ctl_EditNum.MoveWindow(rcCtrl,TRUE);
		ctl_EditNum.ShowWindow(SW_SHOW);
		::SetFocus(ctl_EditNum.m_hWnd);
		ctl_EditNum.SetSel(0,strText.GetLength(),TRUE);
		break;
	default:
		break;
	}
}
void CMyListCtrl::SetItemFont(CFont ft)
{
	ctl_EditComboDown.SetFont(&ft,TRUE);
	ctl_EditText.SetFont(&ft,TRUE);
	ctl_EditDateTime.SetFont(&ft,TRUE);
	ctl_EditNum.SetFont(&ft,TRUE);
	ctl_EditComboDownList.SetFont(&ft,TRUE);	
}
void CMyListCtrl::OnRButtonDown( UINT nFlags, CPoint point )
{
	if(!blnMenu) return;
	CMenu m_MyRightMenu;
	m_MyRightMenu.CreatePopupMenu();
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_No,"无模式");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_Click,"单击模式");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_DblClick,"双击模式");
	m_MyRightMenu.AppendMenu(MF_SEPARATOR,ID_MENU_sep,"");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_icon,"大图标");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_smallicon,"小图标");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_list,"列表");
	m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_report,"详细信息");
	DWORD newStyle=GetMyStyle();
	switch(newStyle)
	{
	case LVS_ICON:
		m_MyRightMenu.CheckMenuItem(ID_MENU_icon,MF_CHECKED);
		break;
	case LVS_SMALLICON:
		m_MyRightMenu.CheckMenuItem(ID_MENU_smallicon,MF_CHECKED);
		break;
	case LVS_LIST:
		m_MyRightMenu.CheckMenuItem(ID_MENU_list,MF_CHECKED);
		break;
	case LVS_REPORT:
		m_MyRightMenu.CheckMenuItem(ID_MENU_report,MF_CHECKED);
		break;
	default:
		break;
	}
	ClientToScreen(&point);
	m_MyRightMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this,NULL);
	m_MyRightMenu.DestroyMenu();
	CListCtrl::OnRButtonDown(nFlags,point);
}
//添加单列
int CMyListCtrl::InsertColumnX(CString strName,int nFormat,int iWidth,int intEdit)
{
	int i;

⌨️ 快捷键说明

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