void CReportCtrl::SortRows(int SortCol, int SortDir) { if (m_Style & SORT_ARROWS) DrawSortArrow(m_SortCol, -1); // erase previous column's arrow if (m_Style & SORT_ARROWS) DrawSortArrow(SortCol, SortDir < 0); // draw new arrow m_SortDir = SortDir; m_SortCol = SortCol; SortRows(); }
void CXTPHeaderCtrlThemeResource::OnDrawItemSortArrow(LPDRAWITEMSTRUCT lpDIS, BOOL bAscending) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); CRect rcItem = lpDIS->rcItem; CPoint point; point.x = rcItem.right + m_iArrowPadding; point.y = (rcItem.top - 1) + (rcItem.Height() - m_sizeArrow.cy) / 2; if (point.x < rcItem.left) return; CRect rcArrow; rcArrow.left = point.x; rcArrow.top = point.y; rcArrow.right = point.x + m_sizeArrow.cx; rcArrow.bottom = point.y + m_sizeArrow.cy; int x = point.x + (m_sizeArrow.cx/2); POINT ptsArrow[3]; ptsArrow[0].x = x-m_sizeArrow.cx/2; ptsArrow[0].y = bAscending ? rcArrow.bottom : rcArrow.top; ptsArrow[1].x = x+m_sizeArrow.cx/2; ptsArrow[1].y = bAscending ? rcArrow.bottom : rcArrow.top; ptsArrow[2].x = x; ptsArrow[2].y = bAscending ? rcArrow.top : rcArrow.bottom; DrawSortArrow(pDC, ptsArrow, bAscending); }
void CFileBrowserListCtrl::SetSort(int Col, int Dir) { if (Col == m_SortCol && Dir == m_SortDir) // if same column and direction return; // nothing to do if (Col != m_SortCol && m_SortCol >= 0) // if different column has arrow DrawSortArrow(m_SortCol, -1); // remove arrow from previous column if (Col >= 0) { // if valid sort column int items = m_DirList.GetCount(); int selcnt = GetSelectedCount(); int selmark = GetSelectionMark(); if (selcnt || selmark >= 0) { // if there's a selection // save item states and selection mark in list user data for (int i = 0; i < items; i++) { CDirItem& item = m_DirList.GetItem(i); item.SetData(GetItemState(i, LVIS_SELECTED | LVIS_FOCUSED)); } if (selmark >= 0) { CDirItem& item = m_DirList.GetItem(selmark); // repurpose an item state bit to indicate selection mark item.SetData(item.GetData() | LVIS_ACTIVATING); } } DrawSortArrow(Col, Dir); // draw appropriate arrow on new column m_DirList.Sort(Col, Dir); // sort directory list if (selcnt || selmark >= 0) { // if there's a selection // restore item states and selection mark from list user data for (int i = 0; i < items; i++) { const CDirItem& item = m_DirList.GetItem(i); DWORD state = item.GetData(); SetItemState(i, state, LVIS_SELECTED | LVIS_FOCUSED); if (state & LVIS_ACTIVATING) // if item has selection mark SetSelectionMark(i); } } Invalidate(); } m_SortCol = Col; m_SortDir = Dir; }
void CFileBrowserListCtrl::Init() { for (int i = 0; i < COLUMNS; i++) { // make columns const COL_INFO& info = m_ColInfo[i]; InsertColumn(i, LDS(info.Title), info.Align, info.Width); } SetImageList(&m_FileInfoCache.GetImageList(ICON_SMALL), LVSIL_SMALL); SetImageList(&m_FileInfoCache.GetImageList(ICON_BIG), LVSIL_NORMAL); // create header image list containing sort arrows m_HdrImgList.Create(8, 8, ILC_MASK, 1, 1); m_HdrImgList.Add(AfxGetApp()->LoadIcon(IDI_SORT_UP)); m_HdrImgList.Add(AfxGetApp()->LoadIcon(IDI_SORT_DOWN)); GetHeaderCtrl()->SetImageList(&m_HdrImgList); DrawSortArrow(DEFAULT_SORT_COL, DEFAULT_SORT_DIR); m_ViewType = GetStyle() & LVS_TYPEMASK; }