自身支持排序的ListCtrl[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 coldcrane 的 blog

//{{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) ); 
}

本文关键:自身支持排序的ListCtrl
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top