//{{afx_insert_location}}
// microsoft visual c++ will insert additional declarations immediately before the previous line.
#endif // !defined(afx_sortlist_h__6ace2f6f_aefe_11d3_bde9_f4145aa4f676__included_)
b. softlist.cpp
// sortlist.cpp : implementation file
//
#include "stdafx.h"
#include "sortlist.h"
#ifdef _debug
#define new debug_new
#undef this_file
static char this_file[] = __file__;
#endif
/////////////////////////////////////////////////////////////////////////////
// csortlist
csortlist::csortlist()
{
m_basc=true;
//this->m_nsortedcol = -1;
createsorticons();
//getheaderctrl()->setimagelist(&m_imglstsorticons);
}
csortlist::~csortlist()
{
m_imglstsorticons.deleteimagelist();
m_bmpuparrow.deleteobject();
m_bmpdownarrow.deleteobject();
}
begin_message_map(csortlist, clistctrl)
//{{afx_msg_map(csortlist)
//}}afx_msg_map
on_notify_reflect(lvn_columnclick, onlvncolumnclick)
end_message_map()
/////////////////////////////////////////////////////////////////////////////
// csortlist message handlers
void csortlist::onlvncolumnclick(nmhdr *pnmhdr, lresult *presult)
{
lpnmlistview pnmlistview = reinterpret_cast<lpnmlistview>(pnmhdr);
// todo: add your control notification handler code here
//nm_listview* pnmlistview = (nm_listview*)pnmhdr;
if( pnmlistview->isubitem == m_nsortedcol )
m_basc = !m_basc;
else
{
m_basc = true;
m_nsortedcol = pnmlistview->isubitem;
}
sortitems( listcompare, (dword)this );
setsorticon();
*presult = 0;
}
void csortlist::createsorticons()
{
if (!m_imglstsorticons.m_himagelist)
{
colormap cm = {rgb(0, 0, 0), getsyscolor(color_graytext)};
m_imglstsorticons.create (9, 5, ilc_color24 | ilc_mask, 2, 0);
m_bmpuparrow.loadmappedbitmap(idb_hdrup, 0, &cm, 1);
m_nuparrow = m_imglstsorticons.add(&m_bmpuparrow, rgb(255, 255, 255));
m_bmpdownarrow.loadmappedbitmap(idb_hdrdown, 0, &cm, 1);
m_ndownarrow = m_imglstsorticons.add(&m_bmpdownarrow, rgb(255, 255, 255));
}
}
void csortlist::setsorticon()
{
cheaderctrl* pheaderctrl = this->getheaderctrl();
assert(pheaderctrl);
pheaderctrl->setimagelist(&m_imglstsorticons);
for( int col = 0; col< getheaderctrl()->getitemcount(); col++ )
{
hditem hdritem = { 0,};
hdritem.mask = hdi_format | hdi_image;
bool ret = pheaderctrl->getitem(col-1, &hdritem);
ret = pheaderctrl->getitem(col+1, &hdritem);
ret = pheaderctrl->getitem(col, &hdritem);
if ( m_nsortedcol == col)
{
hdritem.fmt = hdritem.fmt & hdf_justifymask | hdf_image | hdf_string | hdf_bitmap_on_right;
if( m_basc )
hdritem.iimage = m_nuparrow;
else
hdritem.iimage = m_ndownarrow;
}
else
{
hdritem.fmt = hdritem.fmt & hdf_justifymask | hdf_string;
}
pheaderctrl->setitem(col, &hdritem);
}
}
bool csortlist::getfullrowselect()
{
return ( getextendedstyle()&lvs_ex_fullrowselect) == lvs_ex_fullrowselect;
}
void csortlist::setfullrowselect( bool bfullrowselect )
{
if( bfullrowselect )
setextendedstyle( getextendedstyle()|lvs_ex_fullrowselect );
else
setextendedstyle( getextendedstyle()&(~lvs_ex_fullrowselect) );
}
bool csortlist::getgridlines()
{
return ( getextendedstyle() & lvs_ex_gridlines ) == lvs_ex_gridlines;
}
void csortlist::setgridlines( bool bgridlines )
{
if( bgridlines )
setextendedstyle( getextendedstyle()|lvs_ex_gridlines );
else
setextendedstyle( getextendedstyle()&(~lvs_ex_gridlines) );
}