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