创建CListCtrl中的排序小图标
for(int i = 0; i < GetHeaderCtrl()->GetItemCount(); ++i)
{
HDITEM hditem = {0};
hditem.mask = HDI_BITMAP | HDI_FORMAT;
VERIFY( GetHeaderCtrl()->GetItem( i, &hditem ) );
if (hditem.fmt & HDF_BITMAP && hditem.fmt & HDF_BITMAP_ON_RIGHT)
{
if (hditem.hbm)
{
VERIFY( DeleteObject(hditem.hbm) );
hditem.hbm = NULL;
}
hditem.fmt &= ~(HDF_BITMAP|HDF_BITMAP_ON_RIGHT);
VERIFY( CListCtrl::GetHeaderCtrl()->SetItem( i, &hditem ) );
}
if (i == nCol)
{
hditem.fmt |= HDF_BITMAP|HDF_BITMAP_ON_RIGHT;
//UINT bitmapID = m_Ascending ? IDB_DOWNARROW : IDB_UPARROW;
//hditem.hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(bitmapID), IMAGE_BITMAP, 0,0, LR_LOADMAP3DCOLORS);
hditem.hbm = CreateSortBitmap(bAscending);
VERIFY( hditem.hbm!=NULL );
VERIFY( CListCtrl::GetHeaderCtrl()->SetItem( i, &hditem ) );
}
HBITMAP CreateSortBitmap(bool bAscending)
{
// Aquire the Display DC
CDC* pDC = CDC::FromHandle(::GetDC(::GetDesktopWindow()));
//create a memory dc
CDC memDC;
memDC.CreateCompatibleDC(pDC);
//Create a memory bitmap
CBitmap newbmp;
CRect iconRect(0, 0, 16, 16);
newbmp.CreateCompatibleBitmap(pDC, iconRect.Height(), iconRect.Width());
//create a black brush
CBrush brush;
brush.CreateSolidBrush(RGB(0, 0, 0));
//select the bitmap in the memory dc
CBitmap *pOldBitmap = memDC.SelectObject(&newbmp);
//make the bitmap white to begin with
memDC.FillSolidRect(iconRect.top,iconRect.left,iconRect.bottom,iconRect.right,::GetSysColor(COLOR_3DFACE));
//draw a rectangle using the brush
CBrush *pOldBrush = memDC.SelectObject(&brush);
if (bAscending)
{
// Arrow pointing up
CPoint Pt[3];
Pt[0] = CPoint(7, 5); // Top
Pt[1] = CPoint(4, 8); // Left
Pt[2] = CPoint(10, 8); // Right
memDC.Polygon(Pt, 3);
}
else
{
// Arrow pointing down
CPoint Pt[3];
Pt[0] = CPoint(10, 6); // Right
Pt[1] = CPoint(4, 6); // Left
Pt[2] = CPoint(7, 9); // Bottom
memDC.Polygon(Pt, 3);
}
memDC.SelectObject(pOldBrush);
//select old bitmap back into the memory dc
memDC.SelectObject(pOldBitmap);
return (HBITMAP)newbmp.Detach();
}