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

📄 tsyslistviewex.cpp

📁 VC实现word 和ACCESS数据库的连接
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_bmpColumns.Lookup(nColumn, pOldBitmap);
	return pOldBitmap;
}

// Function name	: CTsyslistviewex::GetBitmapCell
// Description	    : Return pointer to CTColumnBitmap object if cell from (Item with nIDRow userdata,nColumn) is registered
// as bitmap cell.
// Return type		: CTColumnBitmap* 
// Argument         : DWORD nIDRow
// Argument         : int nColumn
CTColumnBitmap* CTsyslistviewex::GetBitmapCell(DWORD nIDRow, int nColumn)
{
	CTColumnBitmap* pOldBitmap = GetBitmapColumn(nColumn);
	if (pOldBitmap == NULL)
		m_bmpCells.Lookup(ComposeKeyForCell((USHORT)nIDRow,(USHORT)nColumn), pOldBitmap);
	return pOldBitmap;
}

// Function name	: CTsyslistviewex::SortAllItems
// Description	    : Call sort items specified by lpszColumnsSort. lpszColumnsSort can be: _T("0,2D,1A"),
//					  and this means that order of sort is column 0 ascending, the next, 2 descending
//					  This procedure take all column for order from lpszColumnsSort, and reset old
//					  columns sort.
//					  (!) Stop relay event in all recordsets in SortAllItems().
// Return type		: void 
// Argument         : LPCTSTR lpszColumnsSort
void CTsyslistviewex::SortAllItems(LPCTSTR lpszColumnsSort)
{
	// Already call EnableSort...
	ASSERT ( m_bSorted );
	LPCTSTR lpszCurrentColumnsSort = lpszColumnsSort;
	CString sRegisterColumnsSort; sRegisterColumnsSort.Empty();
	if (GetRegisteredSort(sRegisterColumnsSort))
		lpszCurrentColumnsSort = (LPCTSTR)sRegisterColumnsSort;
	CString column; int i = 0;
	m_wndSortHeaderEx.ResetSortColumns();
	do 
	{
		AfxExtractSubString(column, lpszCurrentColumnsSort, i++, ',');	
		if (!column.IsEmpty())
		{
			TCHAR cAsc = column[column.GetLength()-1];
			BOOL bAsc = true;
			if (!iswdigit(cAsc))
			{
				ASSERT (cAsc == 'A' || cAsc == 'D');
				if (cAsc == 'D')
					bAsc = !bAsc;
				column = column.Left(column.GetLength()-1);
			}
			int nColumn = atoi((LPCTSTR)column);
			m_wndSortHeaderEx.SetColumnOrder(nColumn, bAsc);
		}
	}
	while (!column.IsEmpty());
	SortAllItems();
}

// Function name	: CTsyslistviewex::SortAllItems
// Description	    : sort all items according to header flags
//					  (!) Stop relay event in all recordsets.
// Return type		: void 
void CTsyslistviewex::SortAllItems()
{
	ASSERT ( m_bSorted );
	m_sortColumns.ResetOrderColumn();
	int column = 0;
	BOOL bAsc = true;
	for (int iPosition = 1; m_wndSortHeaderEx.GetPositionColumn(iPosition, bAsc, column); iPosition++ )
		m_sortColumns.AddOrderColumn(column,bAsc ? 1 : -1);
	if (m_sortColumns.GetCountOrderColumn())
	{
		AfxGetApp()->DoWaitCursor(1);
		m_sortColumns.Sort();
		AfxGetApp()->DoWaitCursor(-1);
	}
	SaveHeader();
}

// Function name	: CTsyslistviewex::GetCountColumn
// Description	    : Return number of columns from control.
// Return type		: int ; columns count
int CTsyslistviewex::GetCountColumn()
{
	return ((CHeaderCtrl*)GetDlgItem(0))->GetItemCount();
}

// Function name	: CTsyslistviewex::Progress
// Description	    : displays the progress bar
// Return type		: void 
// Argument         : int nPercent ; 0 - progress bar set top middle, 100 progress bar is off
void CTsyslistviewex::Progress(int nPercent)
{
	if (!m_wndProgress.GetSafeHwnd())
	{
		const int dyProgress = 20;
		CRect rect; GetWindowRect(rect);
		ScreenToClient(rect);
		int dxProgress = rect.Width() * 3 / 4;
		rect.top += (rect.Height() - dyProgress) / 2;
		rect.bottom = rect.top + dyProgress ;
		rect.left += (rect.Width() - dxProgress) / 2;
		rect.right = rect.left + dxProgress;
		m_wndProgress.Create(WS_CHILD | WS_BORDER | WS_VISIBLE, rect, this, GetDlgCtrlID());
	}
	m_wndProgress.SetPos(nPercent);
	if (nPercent == 100)
		m_wndProgress.DestroyWindow();
}

// Function name	: CTsyslistviewex::ResetBoldLines
// Description	    : reset all bold lines
// Return type		: void 
void CTsyslistviewex::ResetBoldLines()
{
	m_mapRowsBold.RemoveAll();
}

// Function name	: CTsyslistviewex::SetBoldRow
// Description	    : If lParam == NULL then set bold for focused line.
// Return type		: void 
// Argument         : LPARAM lParam
// Argument         : BOOL bBold
// Argument         : BOOL bInvalidate
void CTsyslistviewex::SetBoldRow(LPARAM lParam, BOOL bBold, BOOL bInvalidate)
{
	if (m_boldFont.GetSafeHandle())
	{
		if (!lParam)
			lParam = GetItemData(GetNextItem(-1, LVNI_FOCUSED));
		if (bBold)
			m_mapRowsBold[lParam] = 1;
		else
			m_mapRowsBold.RemoveKey(lParam);
		
		if (bInvalidate)
			Invalidate(false);
	}
}

// Function name	: CTsyslistviewex::SetItalicRow
// Description	    : If lParam == NULL then set italic for focused line.
// Return type		: void 
// Argument         : LPARAM lParam
// Argument         : BOOL bItalic
// Argument         : BOOL bInvalidate
void CTsyslistviewex::SetItalicRow(LPARAM lParam, BOOL bItalic, BOOL bInvalidate)
{
	if (m_italicFont.GetSafeHandle())
	{
		if (!lParam)
			lParam = GetItemData(GetNextItem(-1, LVNI_FOCUSED));
		if (bItalic)
			m_mapRowsItalic[lParam] = 1;
		else
			m_mapRowsItalic.RemoveKey(lParam);
		
		if (bInvalidate)
			Invalidate(false);
	}
}

// Function name	: CTsyslistviewex::DeselectAll
// Description	    : Deselect all items from control
// Return type		: void 
void CTsyslistviewex::DeselectAll()
{
	int iCurrent = GetNextItem(-1, LVIS_SELECTED);
	while (iCurrent >= 0)
	{
		SetItemState(iCurrent, ~LVIS_SELECTED, LVIS_SELECTED);
		iCurrent = GetNextItem(iCurrent, LVIS_SELECTED);
	}
}

// Function name	: CTsyslistviewex::SelectItem
// Description	    : Deselect all items, and select one item.
// Return type		: void 
// Argument         : int i ; item index
void CTsyslistviewex::SelectItem(int i)
{
	DeselectAll();
	SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
	EnsureVisible(i,false);
}

// Function name	: CTsyslistviewex::GetHeaderSortString
// Description	    : Called in SaveAllItems(), returns header format string
// Return type		: CString ; sort header as string, for save it in the registry
CString CTsyslistviewex::GetHeaderSortString()
{
	CString result; result.Empty();
	if (m_bSorted)
	{
		int nPosition = 1;
		int nColumn = NULL;
		BOOL bAsc = true;
		while (m_wndSortHeaderEx.GetPositionColumn(nPosition++, bAsc, nColumn))
		{
			CString sColumn; sColumn.Format(_T("%i%s,"),nColumn, (bAsc ? _T("") : _T("D")));
			result += sColumn;
		}
		if (!result.IsEmpty())
			result = result.Left(result.GetLength() - 1);
	}
	return result;
}

// Function name	: CTsyslistviewex::GetHeaderString
// Description	    : Return the header format string
// Return type		: CString ; header formated as: ColumnName1:FormatColumn1:WidthColumn1,...
CString CTsyslistviewex::GetHeaderString()
{
	CString result; result.Empty();
	LV_COLUMN column; 
 	 TCHAR pszText[MAX_PATH];
	 column.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH;
	 column.pszText = pszText;
	 column.cchTextMax = MAX_PATH;
	for (int i = 0; GetColumn(i, &column); i++)
	{
		TCHAR f = TCHAR('L');
		switch (column.fmt & LVCFMT_JUSTIFYMASK)
		{
			case LVCFMT_RIGHT:
				f = TCHAR('R');
				break;
			case LVCFMT_CENTER:
				f = TCHAR('C');
				break;
		}
		CString w; w.Format(_T("%i"), column.cx);
		result = result + column.pszText + TCHAR(':') + w + TCHAR(':') + f + TCHAR(',');
		column.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH;
	}
	return result.Left(result.GetLength() - (result.IsEmpty() ? 0 : 1)); // last ,
}

// Function name	: CTsyslistviewex::OnNotify
// Description	    : Called when item width changed. If necessarly the widths are saved in registry.
// Return type		: BOOL 
// Argument         : WPARAM wParam
// Argument         : LPARAM lParam
// Argument         : LRESULT* pResult
BOOL CTsyslistviewex::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	if ((int)wParam == 0)
		if (GetDlgItem(0)->IsWindowVisible())
		{
			switch (((HD_NOTIFY*)lParam)->hdr.code)
			{
				case HDN_ITEMCHANGEDA:
				case HDN_ITEMCHANGEDW:
						SaveHeader();
					break;
			}
		}
	
	return CListCtrl::OnNotify(wParam, lParam, pResult);
}

// Function name	: CTsyslistviewex::NeedCX
// Description	    : Calc total width of listctrl
// Return type		: int ; listctrl width
int CTsyslistviewex::NeedCX()
{
	int result = 0;
	LV_COLUMN lvc; lvc.mask = LVCF_WIDTH;
	for (int i = 0; GetColumn(i, &lvc); i++)
		result += lvc.cx;
	return result;
}

// Function name	: CTsyslistviewex::NeedCY
// Description	    : Calc partial visible height of listctrl
// Return type		: int ; visible height of listctrl
int CTsyslistviewex::NeedCY()
{
	CRect rect; GetClientRect(rect); int hRect = rect.Height();
	CRect rcItem;
	int result = 0;
	for (int i = GetTopIndex(); GetItemRect(i, rcItem,LVIR_LABEL) && result + rcItem.Height() < hRect; i++ )
		result += rcItem.Height();
	return result;
}

// Function name	: CTsyslistviewex::OnChar
// Description	    : Treat specialy CTRL+S for sorting, if m_bSortWhenClickHeader is FALSE
// Return type		: void 
// Argument         : UINT nChar
// Argument         : UINT nRepCnt
// Argument         : UINT nFlags
void CTsyslistviewex::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (!m_bSortWhenClickHeader)
		if (GetKeyState(VK_CONTROL) < 0)
			if (nChar == scanCodeS)
				SortAllItems();
	
	CListCtrl::OnChar(nChar, nRepCnt, nFlags);
}

// Function name	: CTsyslistviewex::GetCountRowsBold
// Description	    : Return count of bold rows
// Return type		: int 
int CTsyslistviewex::GetCountRowsBold()
{
	return m_mapRowsBold.GetCount();
}

// Function name	: CTsyslistviewex::GetCountRowsItalic
// Description	    : Return count of italic rows
// Return type		: int 
int CTsyslistviewex::GetCountRowsItalic()
{
	return m_mapRowsItalic.GetCount();
}

// Function name	: CTsyslistview32::SetHeader
// Description	    : 
// Return type		: BOOL 
// Argument         : CListCtrl * pList
// Argument         : CString newHeader
BOOL CTsyslistviewex::SetHeader(CListCtrl * pList, CString newHeader)
{
	CHeaderCtrl* pHeader = (CHeaderCtrl*)pList->GetDlgItem(0);
	if (pHeader)
	{
		while (pHeader->GetItemCount()) pHeader->DeleteItem(0);
		int i = 0; CString rString; rString.Empty();
		CMap<TCHAR,TCHAR,int,int> justifyMap;
		justifyMap['L'] = LVCFMT_LEFT;
		justifyMap['C'] = LVCFMT_CENTER;
		justifyMap['R'] = LVCFMT_RIGHT;

		do
		{
			AfxExtractSubString(rString, newHeader, i, ',');
			if (!rString.IsEmpty())
			{
				CString columnName;
				AfxExtractSubString(columnName, rString, 0, ':');

				CString columnWidth;
				AfxExtractSubString(columnWidth, rString, 1, ':');
				if (columnWidth.IsEmpty()) columnWidth = _T("128"); // default value

				CString columnJustify;
				AfxExtractSubString(columnJustify, rString, 2, ':');
				int justify = LVCFMT_LEFT;
				if (!columnJustify.IsEmpty())
					justifyMap.Lookup(columnJustify[0], justify);
				pList->InsertColumn(i,columnName, justify, _wtoi((const wchar_t*)columnWidth.GetBuffer(0)));
				i++;
			}
		} while (!rString.IsEmpty());
	}
	return (pHeader != NULL);
}

⌨️ 快捷键说明

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