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

📄 splistviewctrl.cpp

📁 Smartphone手机阅读软件
💻 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<CSPListViewCtrl, CListViewCtrl>::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<CSPListViewCtrl, CListViewCtrl>::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<int>( 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;
}

⌨️ 快捷键说明

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