📄 listex.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 + -