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

📄 listex.cpp

📁 此为LIST控件的扩展功能
💻 CPP
字号:
// ListEx.cpp : implementation file
//

#include "stdafx.h"
#include "ListTest.h"
#include "ListEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CListEx

CListEx::CListEx()
{
	m_iOpenList[0] = -1;
	m_iOpenList[1] = -1;
	m_iImage = -1;
//	m_memVScroll = -1;
	m_iId = -1;

//	m_memlvi.mask =  LVIF_IMAGE;
//	m_memlvi.iSubItem = 0;
}

CListEx::~CListEx()
{
	m_ListInfo.RemoveAll();
}


BEGIN_MESSAGE_MAP(CListEx, CListCtrl)
	//{{AFX_MSG_MAP(CListEx)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_WM_VSCROLL()
	ON_WM_MOUSEWHEEL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListEx message handlers
BOOL CListEx::PreTranslateMessage(MSG* pMsg) 
{
	if( pMsg->message == WM_KEYDOWN )
	{
		if( pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN || pMsg->wParam == VK_TAB )
		{
		}
		else return TRUE;
	}
	else;

	m_ItemDlg.CheckButton( pMsg );

	return CListCtrl::PreTranslateMessage(pMsg);
}

void CListEx::OnLButtonDown(UINT nFlags, CPoint point) 
{
	point.x = 10;
	int iSelect = this->HitTest( point );
	if( -1 != iSelect )
	{
		if( (iSelect != m_iOpenList[0]) && IsClose( iSelect ) )
		{
			CloseList( iSelect );

			DWORD dwData = this->GetItemData( iSelect );
			LIST_INFO ListInfo;
			if( FindInfo( dwData, ListInfo ) )
			{
				m_ItemDlg.SetListInfo( &ListInfo );
				OpenList( iSelect, GetiHeight( iSelect ) );
			}
			else;
		}
		else;
	}
	else;
	this->SetFocus();
//	CListCtrl::OnLButtonDown(nFlags, point);
}

void CListEx::OnRButtonDown(UINT nFlags, CPoint point) 
{
	this->SetFocus();
//	CListCtrl::OnRButtonDown(nFlags, point);
}

void CListEx::OnSetFocus(CWnd* pOldWnd) 
{
	CListCtrl::OnSetFocus(pOldWnd);
	m_ItemDlg.RedrawWindow_Focus( TRUE );
}

void CListEx::OnKillFocus(CWnd* pNewWnd) 
{
	CListCtrl::OnKillFocus(pNewWnd);
	m_ItemDlg.RedrawWindow_Focus( FALSE );
}

void CListEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
	if( nSBCode == SB_THUMBTRACK || 
		nSBCode == SB_PAGEUP || 
		nSBCode == SB_PAGEDOWN ||
		nSBCode == SB_LINEDOWN ||
		nSBCode == SB_LINEUP )
	{
		RedrawItemDlg();
	}
	else;
}

BOOL CListEx::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	BOOL bRet = CListCtrl::OnMouseWheel(nFlags, zDelta, pt);
//	int iVScroll = this->GetScrollPos( SB_VERT );
//	if( iVScroll != m_memVScroll )
//	{
//		m_memVScroll = iVScroll;
		RedrawItemDlg();
//	}
//	else;
	return bRet;
}

///////////////////////////////////////////////////////
void CListEx::OpenList( int iSelect, int iHeight )
{
	if( -1 == iSelect ) return;
	if( -1 == iHeight) return;

	SetOpenClose( iSelect, LIST_OPEN );//设置打开属性
//	memItem( iSelect, FALSE );

	LVITEM lvi;
	lvi.mask =  LVIF_IMAGE | LVIF_TEXT;
	lvi.iSubItem = 0;
	lvi.pszText = "";
	lvi.iImage = -1;

	for( int i = 1; i <= iHeight ; i++ )
	{
		lvi.iItem = iSelect+i;
		this->InsertItem( &lvi );
		SetOpenClose( iSelect + i, LIST_OPEN );
	}

	m_iOpenList[0] = iSelect;
	m_iOpenList[1] = iHeight;
	///////////////////////////////////

	CRect rect;
	if( this->GetItemRectEx( iSelect, iHeight, &rect ) )
	{
		m_ItemDlg.RedrawWindowEx( &rect, &m_rect );
	}
	else;

}

void CListEx::CloseList( int &iSelect )
{
	if( -1 == m_iOpenList[0] ) return;

	m_ItemDlg.ShowWindow( SW_HIDE );
	m_ItemDlg.ClearmemRect();

	SetOpenClose( m_iOpenList[0], LIST_CLOSE );
//	memItem( m_iOpenList[0], TRUE );
	for( int i = 1; i <= m_iOpenList[1]; i++ )
	{
		this->DeleteItem( m_iOpenList[0] + 1 );
	}

	if( iSelect > m_iOpenList[0] ) iSelect -= m_iOpenList[1];

	m_iOpenList[0] = -1;
	m_iOpenList[1] = -1;
	return;
}

int CListEx::AddImage( UINT nIDResource )
{
	CBitmap cBmp;
	cBmp.LoadBitmap( nIDResource );
	
	m_SmallImage.Add( &cBmp, RGB( 255, 255, 255) );
	cBmp.DeleteObject();

	m_iImage++;
	return m_iImage;
}

BOOL CListEx::GetItemRectEx( int iSelect, int iHeight, LPRECT pRect )
{
	if( -1 == m_iOpenList[0] ) FALSE;
	BOOL bRet;

	bRet = this->GetItemRect( iSelect, pRect, LVIR_BOUNDS );
	if( bRet )
	{
		ChangeRect_Item( pRect, iHeight );
	}
	else;

	return bRet;
}

void CListEx::ChangeRect_Item( LPRECT pRect, const int iHeight )
{
	int Height = pRect->bottom - pRect->top;
	pRect->bottom += Height * iHeight;
	///////////////////////////
	pRect->top += m_rect.top;
	pRect->left += m_rect.left;
	pRect->right += m_rect.left;
	pRect->bottom += m_rect.top;
}

void CListEx::ChangeRect_List( CWnd* pWnd, LPRECT pRect )
{
	RECT re;
	pWnd->GetWindowRect( &re );
	int CaptionHigh = re.top; 
	pWnd->ClientToScreen( &re );
	CaptionHigh = re.top - CaptionHigh - 2;

	pRect->top -= CaptionHigh;
	pRect->left -= 1;
	pRect->right -= 1;
	pRect->bottom -= CaptionHigh;
}

void CListEx::RedrawItemDlg()
{
	CRect rect;
	if( this->GetItemRectEx( m_iOpenList[0], m_iOpenList[1], &rect ) )
	{
		m_ItemDlg.RedrawWindowEx( &rect, &m_rect, TRUE );
	}
	else;
}

BOOL CListEx::IsClose( int iSelect )
{
	TCHAR strData[10] = {'\0'};
	this->GetItemText( iSelect, 3, strData, 10 );
	if( 0 == _tcscmp( strData, LIST_CLOSE ) )
	{
		return TRUE;
	}
	else return FALSE;
}

#if FALSE
void CListEx::memItem( int iSelect, BOOL bIN /*= TRUE*/ )
{
	m_memlvi.iItem = iSelect;

	if( bIN )
	{
		this->SetItem( &m_memlvi );
		this->SetItemText( iSelect, 0 , m_memstr[0] );
		this->SetItemText( iSelect, 1 , m_memstr[1] );
		this->SetItemText( iSelect, 2 , m_memstr[2] );
	}
	else
	{
		this->GetItem( &m_memlvi );
		m_memstr[0] = this->GetItemText( iSelect, 0 );
		m_memstr[1] = this->GetItemText( iSelect, 1 );
		m_memstr[2] = this->GetItemText( iSelect, 2 );

		///////////////////////////////////////
		LVITEM lvi;
		lvi.mask =  LVIF_IMAGE | LVIF_TEXT;
		lvi.iItem = iSelect;
		lvi.iSubItem = 0;
		lvi.pszText = "" ;
		lvi.iImage = -1;

		this->SetItem( &lvi );
		this->SetItemText( iSelect, 0 , _T("") );
		this->SetItemText( iSelect, 1 , _T("") );
		this->SetItemText( iSelect, 2 , _T("") );
	}
}
#endif

BOOL CListEx::FindInfo( DWORD dwId, LIST_INFO& ListInfo )
{
	POSITION Pos = m_ListInfo.GetHeadPosition();
	while( Pos )
	{
		ListInfo = m_ListInfo.GetAt( Pos );

		if( ListInfo.dwId == dwId )
		{
			return TRUE;
		}
		else;

		m_ListInfo.GetNext( Pos );
	}

	return FALSE;
}

int CListEx::GetiHeight( int iSelect )
{
	int iHeight = -1;
	DWORD dwData = this->GetItemData( iSelect );

	LIST_INFO ListInfo;
	if( FindInfo( dwData, ListInfo ) )
	{
		iHeight = ListInfo.iHeight;
	}
	else;

	return iHeight;
}

////////////////////////////////////////////////////
DWORD CListEx::Start( CWnd* pWnd, int cx, int cy, int nInitial )
{
	do
	{
		//设置窗口类型
		LONG lStyle;
		lStyle = GetWindowLong( this->m_hWnd, GWL_STYLE );
		if( 0 == lStyle ) break;
		lStyle &= ~LVS_TYPEMASK; 
		lStyle |= LVS_REPORT;
		lStyle = SetWindowLong( this->m_hWnd ,GWL_STYLE,lStyle );
		if( 0 == lStyle ) break;

		//设置窗口列
		this->GetWindowRect( &m_rect );
		ChangeRect_List( pWnd, &m_rect );

		LVCOLUMN lvcol;
		lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
		
		lvcol.pszText = "";
		lvcol.iSubItem = 1;
		lvcol.cx = (m_rect.Width()/3*2)-20;
		this->InsertColumn( 0, &lvcol );
		lvcol.pszText = "";
		lvcol.cx = m_rect.Width()/6;
		this->InsertColumn( 1, &lvcol );
		lvcol.pszText = "";
		lvcol.cx = m_rect.Width()/6;
		this->InsertColumn( 2, &lvcol );
		lvcol.pszText = "";
		lvcol.cx = 0;
		this->InsertColumn( 3, &lvcol );

		//设置图表ImageList
		if( !m_SmallImage.Create( cx, cy, ILC_COLOR8 | ILC_MASK, nInitial, 1 ) ) break;
		this->SetImageList( &m_SmallImage, LVSIL_SMALL );
		
		//创建子对话框
		if( !m_ItemDlg.Create( IDD_DIALOG_ITEM, GetDlgItem( IDC_LIST ) ) ) break;
		m_ItemDlg.m_pListWnd = (CWnd*)this;//得到List句柄
		m_ItemDlg.m_pFont = this->GetFont();//得到字体

		return 0;
	}
	while( 0 );

	return GetLastError();
}

int CListEx::InsertItemEx( LPSTR str1, LPCTSTR str2, LPCTSTR str3, UINT nIDResource, CString* pStrList, int iList, LPCTSTR strEnd/*= _T("")*/, LPCTSTR strBT /*= _T("")*/, BUTTON_CALLBACK lpOnButton /*= NULL*/ )
{
	int iImage = AddImage( nIDResource );

	LVITEM lvi;
	//设置第一列
	lvi.mask =  LVIF_IMAGE | LVIF_TEXT;
	lvi.iItem = 0;
	lvi.iSubItem = 0;
	lvi.pszText = str1 ;
	lvi.iImage = iImage;

	do
	{
		if( -1 == this->InsertItem( &lvi ) )	break;

		if( !this->SetItemText( 0, 1, str2 ) )	break;
		if( !this->SetItemText( 0, 2, str3 ) )	break;
		if( !SetOpenClose( 0, LIST_CLOSE ) )	break;

		m_iId++;
		if( !this->SetItemData( 0, m_iId ) )
		{
			m_iId--;
			break;
		}
		else;

		LIST_INFO ListInfo;
		ListInfo.dwId = m_iId;
		_tcscpy( ListInfo.str1, str1 );
		_tcscpy( ListInfo.str2, str2 );
		_tcscpy( ListInfo.str3, str3 );
		ListInfo.nIDResource = nIDResource;
		ListInfo.pStrList = pStrList;
		ListInfo.iList = iList;
		_tcscpy( ListInfo.strEnd, strEnd );
		_tcscpy( ListInfo.strBT, strBT );
		ListInfo.lpOnButton = lpOnButton;

		if( NULL == lpOnButton )
		{
			 ListInfo.iHeight = iList + 1;
		}
		else ListInfo.iHeight = iList + 2;

		/////
		if( m_ListInfo.IsEmpty() )
		{
			m_ListInfo.AddHead( ListInfo );
		}
		else m_ListInfo.AddTail( ListInfo );

		return m_iId;
	}
	while( 0 );

	return -1;
}

BOOL CListEx::DeleteItemEx( int nItem/* = -1*/ )
{
	if( nItem == -1)
	{
		nItem = m_iOpenList[0];
	}
	else;

	if( m_iOpenList[0] == nItem )
	{
		CloseList( nItem );
	}
	else;

	return this->DeleteItem( nItem );
}


///////////////////////////////////////////////////

⌨️ 快捷键说明

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