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

📄 tsyslistviewex.cpp

📁 VC实现word 和ACCESS数据库的连接
💻 CPP
📖 第 1 页 / 共 3 页
字号:

/************************************
  REVISION LOG ENTRY
  Revision By: Mihai Filimon
  Revised on 5/22/98 9:23:23 AM
  Comments: Tsyslistviewex.cpp : implementation file
 ************************************/

#include "stdafx.h"
#include "Tsyslistviewex.h"
#include "resource.h"

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

#define scanCodeS 0x13

/////////////////////////////////////////////////////////////////////////////
// CTsyslistviewex

TCHAR CTsyslistviewex::m_cImageTextSeparator = TCHAR(':');


// Function name	: CTsyslistviewex::CTsyslistviewex
// Description	    : constructor
//					In contructor u must set the height of item list. (MeasureItem is called before
//					PreSubclassWindow!). U can not modify item height at runtime, therefore.
// Return type		: void
// Argument         : int nHeightRel ; set item height
CTsyslistviewex::CTsyslistviewex(int nHeightRel)
{
	m_fctDrawItem = CTsyslistviewex::DrawItemNoGrid;
	m_nHeightRel = nHeightRel;
	m_bSorted = false;
	m_bSortWhenClickHeader = TRUE;
	m_nSortItems = 0;
	m_nIProgress = 0;
	m_bSaveHeader = false;
	ResetBoldLines();
}

// Function name	: CTsyslistviewex::~CTsyslistviewex
// Description	    : destructor
// Return type		: void
CTsyslistviewex::~CTsyslistviewex()
{
	// Remove the CTColumnBitmap from m_bmpColumns
	POSITION posBmp = m_bmpColumns.GetStartPosition( );
	while (posBmp)
	{
		CTColumnBitmap* pBitmap = NULL;
		int nColumn = 0;
		m_bmpColumns.GetNextAssoc( posBmp , nColumn,  pBitmap );
		if (pBitmap)
			delete pBitmap;
	}
	m_bmpColumns.RemoveAll();
	
	// Remove the CTColumnBitmap from m_bmpCells
	posBmp = m_bmpCells.GetStartPosition( );
	while (posBmp)
	{
		CTColumnBitmap* pBitmap = NULL;
		DWORD nKey = 0;
		m_bmpCells.GetNextAssoc( posBmp , nKey,  pBitmap );
		if (pBitmap)
			delete pBitmap;
	}
	m_bmpCells.RemoveAll();
}

// Function name	: CTsyslistviewex::IsHeaderSaved
// Description	    : accessor: header saved
// Return type		: BOOL ;Return TRUE if EnableSaveHeader was called
BOOL CTsyslistviewex::IsHeaderSaved()
{
	return m_bSaveHeader;
}

// Function name	: CTsyslistviewex::GetRegisteredSort
// Description	    : Read form registry in dest for Sort:ID. 
// Return type		: BOOL ; Return TRUE if key exist.
// Argument         : CString & dest ; string to put value into
BOOL CTsyslistviewex::GetRegisteredSort(CString & dest)
{
	BOOL bResult = false;
	if (IsHeaderSaved())
	{
		CString secid; secid.Format(_T("Sort:%08X"), GetDlgCtrlID());
		CString result = AfxGetApp()->GetProfileString(LIST_SECTION, secid, _T("Default"));
		if (result != _T("Default"))
		{
			dest = result;
			bResult = true;
		}
	}
	return bResult;
}

// Function name	: CTsyslistviewex::SaveHeader
// Description	    : Save widths and sort columns in registry in fromat:
//							Header:ID = Column1:C:126, ...
//							Sort:ID = 1D,2,3 ...
// Return type		: void 
void CTsyslistviewex::SaveHeader()
{
	if (IsHeaderSaved())
	{
		CString secid; secid.Format(_T("Header:%08X"), GetDlgCtrlID());
		AfxGetApp()->WriteProfileString(LIST_SECTION, secid, (LPCTSTR)GetHeaderString());
		secid.Format(_T("Sort:%08X"), GetDlgCtrlID());
		AfxGetApp()->WriteProfileString(LIST_SECTION, secid, (LPCTSTR)GetHeaderSortString());
	}
}

BEGIN_MESSAGE_MAP(CTsyslistviewex, CListCtrl)
	//{{AFX_MSG_MAP(CTsyslistviewex)
	ON_WM_LBUTTONDOWN()
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_WM_CHAR()
	//}}AFX_MSG_MAP
	ON_WM_MEASUREITEM_REFLECT()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTsyslistviewex message handlers

// Function name	: CTsyslistviewex::PreSubclassWindow
// Description	    : Called when user subclass list control form resource
// Return type		: void 
void CTsyslistviewex::PreSubclassWindow( )
{
	// Must be owner draw and report mode....
	ModifyStyle(LVS_SMALLICON | LVS_LIST | LVS_ICON , LVS_OWNERDRAWFIXED | LVS_REPORT);

	m_pOldHeaderCtrl = GetDlgItem(0);

	// Create different fonts..
	if (CFont* pFont = GetFont())
	{
		LOGFONT lf;
		pFont->GetLogFont(&lf);
		lf.lfWeight = FW_BOLD;
		m_boldFont.CreateFontIndirect(&lf);
		lf.lfWeight = FW_NORMAL;
		lf.lfItalic = TRUE;
		m_italicFont.CreateFontIndirect(&lf);
		lf.lfWeight = FW_BOLD;
		lf.lfItalic = TRUE;
		m_italicBoldFont.CreateFontIndirect(&lf);
	}

	SetWindowLong(m_hWnd, GWL_USERDATA , LIST_SUBCLASSED);
}

// Function name	: CTsyslistviewex::OnLButtonDown
// Description	    : If user click in list ctrl, test item, subItem
// Return type		: void 
// Argument         : UINT nFlags
// Argument         : CPoint point
void CTsyslistviewex::OnLButtonDown(UINT nFlags, CPoint point)
{
	SetFocus();
	int item = -1, subItem = -1 ;
	item = HitTestEx(point, subItem);
	CListCtrl::OnLButtonDown(nFlags, point);
}

// Function name	: CTsyslistviewex::MakeShortString
// Description	    : Return shorted string lpszLong in device pDC
// Return type		: LPCTSTR 
// Argument         : CDC* pDC
// Argument         : LPCTSTR lpszLong
// Argument         : int nColumnLen
// Argument         : int nOffset
LPCTSTR CTsyslistviewex::MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen, int nOffset)
{
	static const TCHAR szThreeDots[] = _T("...\0");
	static TCHAR szShort[MAX_PATH];

	int nStringLen = strlen(lpszLong);

	if(nStringLen == 0 ||
		(pDC->GetTextExtent(lpszLong, nStringLen).cx + nOffset) <= nColumnLen)
	{
		return(lpszLong);
	}

	strcpy(szShort,lpszLong);
	int nAddLen = pDC->GetTextExtent(szThreeDots,strlen(szThreeDots)).cx;

	for(int i = nStringLen-1; i > 0; i--)
	{
		szShort[i] = '\0';
		if((pDC->GetTextExtent(szShort, i).cx + nOffset + nAddLen)
			<= nColumnLen)
		{
			break;
		}
	}

	strcat(szShort, szThreeDots);
	return(szShort);
}

// Function name	: CTsyslistviewex::DrawCell
// Description	    : Draw at pDC in drawRect cell(nItem,nColumn) with format
// Return type		: void 
// Argument         : CDC* pDC
// Argument         : CRect& drawRect
// Argument         : int nItem
// Argument         : int nColumn
void CTsyslistviewex::DrawCell(CDC* pDC, CRect& drawRect, DWORD format, int nItem, int nColumn)
{
	static TCHAR szBuff[MAX_PATH];
	LPCTSTR pszText;
	GetItemText(nItem, nColumn, szBuff, sizeof(szBuff));
	{
		CTColumnBitmap* pBitmap = GetBitmapCell(GetItemData(nItem),nColumn);
		int dxBitmap = 0;
		CString sImageBitmap, sText(szBuff);
		if (pBitmap)
		{
			dxBitmap = min(pBitmap->GetWidth(),drawRect.Width());
			int p = sText.Find(m_cImageTextSeparator);
			sImageBitmap = sText.Left(max(0,p));
			sText = sText.Mid(p + 1);
			if (p < 0)
			{
				sImageBitmap = sText;
				sText.Empty();
			}
		}


		pszText = MakeShortString(pDC, (LPCTSTR)sText, (drawRect.right - (drawRect.left + dxBitmap + OFFSET)), OFFSET);
		if (*pszText != TCHAR('\0'))
		{
			UINT nJustify = DT_LEFT;														   
			if(pszText == sText)
			{
				switch(format & LVCFMT_JUSTIFYMASK)
				{
				case LVCFMT_RIGHT:
					nJustify = DT_RIGHT;
					break;
				case LVCFMT_CENTER:
					nJustify = DT_CENTER;
					break;
				default:
					break;
				}
			}
			drawRect.left = drawRect.left + dxBitmap + OFFSET;
			pDC->DrawText(pszText, -1, drawRect, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER);
			drawRect.left = drawRect.left -(dxBitmap + OFFSET);
		}

		if (dxBitmap)
		{
			int nImageColumn = atoi(sImageBitmap);
			int x = drawRect.left;
			CRect rectImage = pBitmap->GetRectImage(nImageColumn);
			pBitmap->Put(nImageColumn, pDC, x , drawRect.top + (drawRect.Height() - rectImage.Height())/2, dxBitmap);
		}
	}

}

// Function name	: CTsyslistviewex::DrawItemGrid
// Description	    : Draw item with grid lines
// Return type		: void 
// Argument         : LPDRAWITEMSTRUCT lpDrawItemStruct
void CTsyslistviewex::DrawItemGrid(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// device contextul itemului
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	
	// dreptunghiul corespunzator itemului
	CRect rcItem(lpDrawItemStruct->rcItem);

	// identificatorul itemului
	int nItem = lpDrawItemStruct->itemID;
	

	BYTE value = 0;
	CFont* pOldFont = NULL;
	if (m_mapRowsBold.Lookup(lpDrawItemStruct->itemData, value))
		pOldFont = (CFont*)pDC->SelectObject(&m_boldFont);
	if (m_mapRowsItalic.Lookup(lpDrawItemStruct->itemData, value))
	{
		CFont* pF = (CFont*)pDC->SelectObject(&m_italicFont);
		if (pOldFont)
			pF = (CFont*)pDC->SelectObject(&m_italicBoldFont);
		else
			pOldFont = pF;
	}
		
	// culori
	COLORREF clrTextSave, clrBkSave;
	// get item data
	LV_ITEM lvi;
	lvi.mask = LVIF_STATE;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.stateMask = 0xFFFF;		// get all state flags
	GetItem(&lvi);

	BOOL bFocus = ((lvi.state & LVIS_FOCUSED) == LVIS_FOCUSED);
	BOOL bSelected = (GetStyle() & LVS_SHOWSELALWAYS) && (lvi.state & LVIS_SELECTED);
	bSelected = bSelected || (lvi.state & LVIS_DROPHILITED);

	// set colors if item is selected
	CRect rcAllLabels;
	GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);

	if (bSelected)
	{
		clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
	}

	pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW)));

	// draw item
	CBrush brush(RGB(128,128,128));
	GetItemRect(nItem, rcItem, LVIR_LABEL);
	LV_COLUMN lvc;
	 lvc.mask = LVCF_FMT | LVCF_WIDTH;
	rcItem.OffsetRect(-OFFSET,0);
	for(int nColumn = 0; GetColumn(nColumn, &lvc); nColumn++)
	{
		rcItem.right = rcItem.left + lvc.cx;

		CRect drawRect(rcItem);
		drawRect.InflateRect(-1,-1);
		pDC->FrameRect(drawRect, &brush);
		drawRect.OffsetRect(1,0);
		drawRect.InflateRect(-2,0);

		DrawCell(pDC,drawRect,lvc.fmt, nItem,nColumn);

		rcItem.left = rcItem.right;
	}

	pDC->SelectObject(pOldFont);

	// draw focus rectangle if item has focus
	if (bFocus)
		pDC->DrawFocusRect(rcAllLabels);

	// set original colors if item was selected
	if (bSelected)
	{
		pDC->SetTextColor(clrTextSave);
		pDC->SetBkColor(clrBkSave);
	}
}

⌨️ 快捷键说明

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