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

📄 tsyslistviewex.cpp

📁 VC实现word 和ACCESS数据库的连接
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Function name	: CTsyslistviewex::DrawItemNoGrid
// Description	    : Draw item without grid lines.
// Return type		: void 
// Argument         : LPDRAWITEMSTRUCT lpDrawItemStruct
void CTsyslistviewex::DrawItemNoGrid(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(0,0,0));
	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);
		drawRect.OffsetRect(2,0);
		drawRect.InflateRect(-4,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);
	}
}

// Function name	: CTsyslistviewex::DrawItem
// Description	    : Draw one item. m_fctDrawItem is set in ViewGridLines(BOOL bEnable ).
// Return type		: void 
// Argument         : LPDRAWITEMSTRUCT lpDrawItemStruct
void CTsyslistviewex::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	(this->*m_fctDrawItem)(lpDrawItemStruct);
}

// Function name	: CTsyslistviewex::HitTestEx
// Description	    : Check if point is in on of list's cell. Return row(return value) an column (subItem)
// Return type		: int 
// Argument         : CPoint point
// Argument         : int& subItem
int CTsyslistviewex::HitTestEx(CPoint point, int& subItem)
{
	CRect rect;	int item = -1;
	subItem = -1;
	if (GetItemRect(0, rect, LVIR_LABEL))
	{
		CRect hRect = rect;
		hRect.OffsetRect((abs(hRect.left) - hRect.left)/2,0);
		item = HitTest(CPoint(int((hRect.left + hRect.right)/2), point.y));
	}
	if (item>=0)
	{
		int ccx = rect.left;
		LV_COLUMN lvc;lvc.mask = LVCF_WIDTH;
		for(int nColumn = 0; GetColumn(nColumn, &lvc); nColumn++, ccx += lvc.cx)
			if ((point.x >= ccx) && (point.x < ccx + lvc.cx))
			{
				subItem = nColumn;
				break;
			}
	}
	item = subItem >= 0 ? item : -1;
	return item;
}

// Function name	: CTsyslistviewex::GetSubItemRect
// Description	    : Return the rect of subitem subItem
// Return type		: BOOL ; TRUE if succeeded
// Argument         : int item ; item - row position
// Argument         : int subItem ; subItem - column position 
// Argument         : CRect & rect ; CRect to complete
BOOL CTsyslistviewex::GetSubItemRect(int item, int subItem, CRect & rect)
{
	if (subItem >= 0)
		if (GetItemRect(item, rect, LVIR_LABEL))
		{
			int ccx = rect.TopLeft().x;
			LV_COLUMN lvc;lvc.mask = LVCF_WIDTH;
			if (GetColumn(subItem, &lvc))
			{
				int dx = lvc.cx;
				for (int nColumn = 0; nColumn < subItem && GetColumn(nColumn, &lvc); nColumn++)
					ccx += lvc.cx;
				rect = CRect(CPoint(ccx,rect.TopLeft().y),CPoint(ccx + dx,rect.BottomRight().y));
				return TRUE;
			}
		}
	return FALSE;
}

// Function name	: CTsyslistviewex::MeasureItem
// Description	    : see contructor CTsyslistviewex(int nHeightRel)
// Return type		: void 
// Argument         : LPMEASUREITEMSTRUCT lpMeasureItem ; finds StructHeight of item needed to set m_nHeightRel
void CTsyslistviewex::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
	lpMeasureItemStruct->itemHeight += m_nHeightRel;
}

// Function name	: CTsyslistviewex::ViewGridLines
// Description	    : Enable or disable draw grid lines.
// Return type		: void 
// Argument         : BOOL bEnable ; TRUE to enable
void CTsyslistviewex::ViewGridLines(BOOL bEnable )
{

	m_fctDrawItem = bEnable ? CTsyslistviewex::DrawItemGrid : CTsyslistviewex::DrawItemNoGrid;
	Invalidate();

}

// Function name	: CTsyslistviewex::ExpandHeader
// Description	    : Try to put all columns from list control in client rect.
// Return type		: void 
void CTsyslistviewex::ExpandHeader()
{
	const offsetMarginHeader = 8;
	CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
	CRect rect; GetClientRect(rect);
	int dxRect = rect.Width() - 2;
	int dxHeader = 0, i = 0; BOOL bColumn = true;
	int nLastColumn = pHeader->GetItemCount() - 1;
	if (nLastColumn >= 0)
	{
		HD_ITEM item; item.mask = HDI_WIDTH;
		for (i = 0; i < nLastColumn && (pHeader->GetItem(i, &item)); i++)
			dxHeader += item.cxy ;
		BOOL bStop = false;
		do
		{
			pHeader->GetItem(nLastColumn, &item);
			int icx = dxRect - dxHeader;
			bStop = icx >=0;
			if (!bStop)
				icx = offsetMarginHeader / 2;
			item.cxy = icx;
			pHeader->SetItem(nLastColumn, &item);
			if (bStop)
				return;
			ASSERT (icx >= 0);
			nLastColumn--;
			pHeader->GetItem(nLastColumn, &item);
			dxHeader = dxHeader - item.cxy + icx;
		}
		while (nLastColumn>=0);

	}
}

// Function name	: CTsyslistviewex::AddSortCallBack
// Description	    : Attach to an column nColumn
//					  comparing function:
//						typedef int (*COLUMNCALLBACKCOMPARE) (const wchar_t *stringi, const wchar_t *stringj)
//					  return values:
//						-1 for stringi < stringj
//						 0 for stringi == stringj
//						+1 for stringi > stringj
// Return type		: void 
// Argument         : int nColumn
// Argument         : COLUMNCALLBACKCOMPARE pCallBack
void CTsyslistviewex::AddSortCallBack(int nColumn, COLUMNCALLBACKCOMPARE pCallBack)
{
	// Already u must call EnableSort...
	ASSERT (m_sortColumns.m_pListCtrl == this);
	// pCallBack must be nenul...
	ASSERT (pCallBack != NULL);
	m_sortColumns.Add(nColumn, pCallBack);
}

// Function name	: CTsyslistviewex::EnableSaveHeader
// Description	    : Enable or disable save widths of listctrl
//					  Must call it before attach this list control attach to record set
//					  (!)In InitInstance, u must call: SetRegistryKey(AfxGetAppName());
// Return type		: void 
// Argument         : BOOL bEnable ; TRUE to enable
void CTsyslistviewex::EnableSaveHeader(BOOL bEnable)
{
	// The control must already subclassed....
	ASSERT ((GetWindowLong(m_hWnd, GWL_USERDATA) & LIST_MASKCLASS) == LIST_SUBCLASSED);
	m_bSaveHeader = bEnable;
}

// Function name	: CTsyslistviewex::EnableSort
// Description	    : Enable or disable sort procedure.
// Return type		: void 
// Argument         : BOOL bEnable ; TRUE to enable
void CTsyslistviewex::EnableSort(BOOL bEnable)
{
	CWnd* pWnd = bEnable ? &m_wndSortHeaderEx : m_pOldHeaderCtrl;
	pWnd->SubclassDlgItem(0,this);
	m_bSorted = bEnable;

	m_sortColumns.AttachControl(bEnable ? this : NULL);
}

// Function name	: CTsyslistviewex::OnColumnclick
// Description	    : SortClick handler (if m_bSortWhenClickHeader is set)
// Return type		: void 
// Argument         : NMHDR* pNMHDR
// Argument         : LRESULT* pResult
void CTsyslistviewex::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	*pResult = 0;

	if (m_bSorted)
	{
		GetAsyncKeyState(VK_CONTROL);
		BOOL bControl = GetAsyncKeyState(VK_CONTROL);

		int iNewSortColumn = pNMListView->iSubItem;
		BOOL bAsc = true;
		int nPosition = 0;
		BOOL bSortedColumn = m_wndSortHeaderEx.GetColumnOrder(iNewSortColumn, bAsc, nPosition);
		if (!bControl && !bSortedColumn)
			m_wndSortHeaderEx.ResetSortColumns();
		if (bSortedColumn)
			if (!bAsc)
			{
				m_wndSortHeaderEx.DeleteColumnOrder(iNewSortColumn);
				iNewSortColumn = -1;
			}
			else
				bAsc = !bAsc;

		if (iNewSortColumn >= 0)
			m_wndSortHeaderEx.SetColumnOrder(iNewSortColumn, bAsc);

		if (m_bSortWhenClickHeader)
			SortAllItems();
	}

}

// Function name	: CTsyslistviewex::AttachBitmap
// Description	    : Attach a bitmap image to a column
// Return type		: BOOL 
// Argument         : int nColumn ; column to put immage into
// Argument         : UINT nIDBitmap ; bitmap identifier
// Argument         : int nImageWidth ; bitmap width
// Argument         : int nImageHeight ; bitmap height
// Argument         : int nRowImage ; sub-bitmap index (for multi-icon bitmaps)
BOOL CTsyslistviewex::AttachBitmap(int nColumn, UINT nIDBitmap, int nImageWidth, int nImageHeight, int nRowImage)
{
	CTColumnBitmap* pBitmap = NULL;
	if (pBitmap = new CTColumnBitmap(nIDBitmap, nImageWidth, nImageHeight, nRowImage))
	{
		ASSERT(pBitmap->IsLoad());
		if (CTColumnBitmap* pOldBitmap = GetBitmapColumn(nColumn))
			delete pOldBitmap;
		m_bmpColumns[nColumn] = pBitmap;
		return TRUE;
	}
	return FALSE;
}

// Function name	: CTHxgrid::ComposeKeyForCell
// Description	    : Return a key identifier for search in maps.
// Return type		: DWORD 
// Argument         : short nIDRow
// Argument         : short nColumn
DWORD CTsyslistviewex::ComposeKeyForCell(USHORT nIDRow, USHORT nColumn)
{
	return MAKELONG(nColumn,nIDRow);
}

// Function name	: CTsyslistviewex::AttachBitmapCell
// Description	    : Attach a bitmap to a cell.
// Return type		: BOOL 
// Argument         : USHORT nIDRow - cell is on item witch contain in userdata nIDRow
// Argument         : USHORT nColumn - cell is on column nColumn
// Argument         : UINT nIDBitmap - Resource identifier of bitmap.
// Argument         : int nImageWidth - Width of bitmap cell.
// Argument         : int nImageHeight - Height of bitmap cell
// Argument         : int nRowImage - sub-bitmap index (for multi-icon bitmaps)
BOOL CTsyslistviewex::AttachBitmapCell(USHORT nIDRow, USHORT nColumn, UINT nIDBitmap, int nImageWidth, int nImageHeight, int nRowImage)
{
	CTColumnBitmap* pBitmap = NULL;
	if (pBitmap = new CTColumnBitmap(nIDBitmap, nImageWidth, nImageHeight, nRowImage))
	{
		ASSERT(pBitmap->IsLoad());
		if (CTColumnBitmap* pOldBitmap = GetBitmapCell(nIDRow,nColumn))
			delete pOldBitmap;
		m_bmpCells[ComposeKeyForCell(nIDRow, nColumn)] = pBitmap;
		return TRUE;
	}
	return FALSE;
}

// Function name	: CTsyslistviewex::GetBitmapColumn
// Description	    : Return pointer to CTColumnBitmap object if nColumn is registered
// as column of bitmaps.
// Return type		: CTColumnBitmap* 
// Argument         : int nColumn
CTColumnBitmap* CTsyslistviewex::GetBitmapColumn(int nColumn)
{
	CTColumnBitmap* pOldBitmap = NULL;

⌨️ 快捷键说明

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