www.pudn.com > PhoneReaderSrc.rar > SPListViewCtrl.cpp


////////////////////////////////////////////////////////////////////// 
// Filename:	SPListViewCtrl.cpp 
// Description:	The list view control a-la "Programs" list 
// Created:		July, 2002 
// Author:		Yaroslav Goncharov, yaroslav@softspb.com 
// Comments:	See www.smartphonedn.com for description 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "SPListViewCtrl.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CSPListViewCtrl::CSPListViewCtrl() 
{ 
	m_hFont = NULL; 
	m_nFontSize = 11; 
	m_ImageTypeFlag = TRUE; 
	m_MoreFlag = FALSE; 
} 
 
CSPListViewCtrl::~CSPListViewCtrl() 
{ 
 
} 
 
HWND CSPListViewCtrl::Create(HWND hParent, _U_RECT rc) 
{ 
	RECT rect = *rc.m_lpRect; 
	HWND hWnd = CWindowImpl::Create(hParent, rect, NULL,  
		WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SINGLESEL | WS_TABSTOP | LVS_NOSCROLL | WS_BORDER , LVS_EX_FULLROWSELECT ); 
 
	InitControl(); 
 
	return hWnd;	 
} 
 
void CSPListViewCtrl::CreateItemFont() 
{ 
	LOGFONT lf; 
	memset(&lf, 0, sizeof(LOGFONT)); 
	HDC hdc = ::GetDC(NULL); 
	lf.lfHeight = -m_nFontSize * ::GetDeviceCaps(hdc, LOGPIXELSY) / 72; 
	::ReleaseDC(NULL, hdc); 
	lf.lfWeight = FW_SEMIBOLD; 
	m_hFont = ::CreateFontIndirect(&lf); 
} 
 
void CSPListViewCtrl::AddItem(LPCTSTR lpszText, int nIcon) 
{ 
	int nPos = InsertItem(GetItemCount(), L" ", -1); 
	int nCount = GetItemCount(); 
 
	CString strPos = _T("."); 
	if (nPos < 7) { 
		strPos.Format(_T("%d"), nPos+1); 
	} 
 
	SetItemText(nPos, 1, strPos); 
	SetItemText(nPos, 2, lpszText); 
 
	LVITEM item; 
	memset(&item, 0, sizeof(item)); 
	item.mask = LVIF_IMAGE; 
	item.iImage = nIcon; 
	item.iItem = nPos; 
	item.iSubItem = 2; 
	SetItem(&item); 
} 
 
void CSPListViewCtrl::DeleteItem(int nIndex) 
{ 
	if (nIndex >= 0 && nIndex < GetItemCount()) { 
		CWindowImpl::DeleteItem(nIndex); 
		UpdateNumeration(); 
	} 
} 
 
void CSPListViewCtrl::UpdateNumeration() 
{ 
	CString strPos; 
	int nCount = GetItemCount(); 
	for (int i = 0; i < nCount; i++) { 
		if (i < 9) { 
			strPos.Format(_T("%d"), i+1); 
		} else { 
			strPos = _T("."); 
		} 
		SetItemText(i, 1, strPos); 
	} 
} 
 
void CSPListViewCtrl::InitControl() 
{ 
	ATLASSERT(m_hFont == NULL);	// should be called only once 
 
	CreateItemFont(); 
	SetFont(m_hFont); 
 
	SetExtendedListViewStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT); 
 
	InsertColumn(0, L"NoIcon", LVCFMT_LEFT, 0, -1);	// invisible column with default icon 
	InsertColumn(1, L"No", LVCFMT_LEFT, 20, -1);	// line number 
	InsertColumn(2, L"Item", LVCFMT_LEFT, 156, -1);	// item text 
 
} 
void CSPListViewCtrl::SetFontSize(int nFontSize) 
{ 
	m_nFontSize = nFontSize; 
} 
 
 
void CSPListViewCtrl::SetBkImage(UINT nID) 
{ 
	m_nImage = nID; 
	m_crSelected   = GetSysColor (COLOR_HIGHLIGHTTEXT); 
	m_crUnSelected = GetSysColor (COLOR_BTNTEXT); 
} 
 
void CSPListViewCtrl::SetFontColor(COLORREF crSelected, COLORREF crUnSelected) 
{ 
	m_crSelected   = crSelected; 
	m_crUnSelected = crUnSelected; 
} 
LRESULT CSPListViewCtrl::OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
	// TODO : Add Code for message handler. Call DefWindowProc if necessary. 
	HDC hDC = (HDC)wParam; 
	 
	CRect rect; 
	GetClientRect(&rect); 
	 
	CDC dcMem ;CBitmap bmp; 
	 
	dcMem.CreateCompatibleDC(hDC); 
	bmp.LoadBitmap(m_nImage); 
	HBITMAP hOldBmp = dcMem.SelectBitmap(bmp); 
	 
	BITMAP bm; 
	bmp.GetBitmap(&bm); 
	 
	StretchBlt(hDC,rect.left,rect.top,rect.Width(),rect.Height(),dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
	 
	dcMem.SelectBitmap(hOldBmp); 
	dcMem.DeleteDC(); 
	return 0; 
} 
LRESULT CSPListViewCtrl::OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) 
{ 
	NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW *)pnmh; 
	 
	LRESULT pResult = 0; 
	 
	if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) 
		pResult = CDRF_NOTIFYITEMDRAW; 
	else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) 
		pResult = CDRF_NOTIFYSUBITEMDRAW; 
	else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM)  == pLVCD->nmcd.dwDrawStage) 
	{ 
		int  nItem = static_cast( pLVCD->nmcd.dwItemSpec ); 
		int  nSubItem = pLVCD->iSubItem; 
		UINT nState = pLVCD->nmcd.uItemState;  
		 
		CDC  pDC; 
		pDC.Attach ( pLVCD->nmcd.hdc ); 
		pDC.SetBkMode ( TRANSPARENT ); 
		 
		CRect    rcItem; 
		GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcItem); 
		if ( nState & CDIS_SELECTED ) 
		{ 
			pDC.SetTextColor (m_crSelected);	 
		} 
		else 
		{ 
			HBRUSH hBrush = (HBRUSH)GetStockObject(NULL_BRUSH); 
			pDC.SetTextColor(m_crUnSelected); 
			pDC.FillRect(rcItem,hBrush); 
		} 
 
		CString szText; 
		GetItemText(nItem , nSubItem , szText); 
		 
		LVITEM ItemImage; 
		ZeroMemory(&ItemImage,sizeof(ItemImage)); 
		ItemImage.mask =  LVIF_IMAGE; 
		ItemImage.iItem = nItem; 
		ItemImage.iImage = -1; 
		ItemImage.iSubItem = nSubItem; 
		GetItem(&ItemImage); 
		 
		UINT imageID = IDI_TXT; 
		if (!m_ImageTypeFlag) 
			imageID = IDI_TXT_LINK; 
		if (ItemImage.iImage != -1) 
		{ 
			if ((!m_MoreFlag) || (nItem != 6)) 
			{ 
				HICON icon = LoadIcon(_Module.GetResourceInstance(),MAKEINTRESOURCE(imageID + ItemImage.iImage )); 
				pDC.DrawIcon(rcItem.left,rcItem.top, icon);	 
				rcItem.left += 18; 
			} 
		} 
 
		CSize strSize;		 
		pDC.GetTextExtent(szText,szText.GetLength(),&strSize); 
		if (strSize.cx > rcItem.Width()) 
		{ 
			for (int t = szText.GetLength() - 3; t > 0; t--) 
			{ 
				szText = szText.Left(t) + L"..."; 
				pDC.GetTextExtent(szText, szText.GetLength(),&strSize); 
				if (strSize.cx < rcItem.Width()) 
					break; 
			} 
		} 
 
		if (nSubItem == 1) 
			pDC.DrawText ( szText, -1,rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); 
		else 
			pDC.DrawText ( szText , -1,rcItem, DT_VCENTER | DT_SINGLELINE | DT_LEFT); 
		 
		 
		pResult = CDRF_SKIPDEFAULT;     
	} 
	return pResult; 
}