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