📄 tsyslistviewex.cpp
字号:
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 + -