⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listviewctrlex.h

📁 beereader source code
💻 H
字号:
/******************************************************************************

$Author$
  
$Modtime$
$Revision$

Description: Interfaces of the classes "CListCtrlEx" and "CListViewEx"
             (list control and list view with sort icons and
              colored sort column)

$Log$

******************************************************************************/
/***定义item辅助类CItemData***************************************************/
#include <afxcoll.h>

class CItemData : public CObject
{
    public:
		CItemData():m_bBold(true),m_dwData(0) {m_iIndex=-1;m_bBold=TRUE;m_bRedFlag=FALSE;};
	    virtual ~CItemData(){};
	private:
		BOOL  m_bBold;
		BOOL  m_bRedFlag;
	    //COLORREF  m_crBkColor,m_crTextColor;
	    DWORD m_dwData;
		int   m_iIndex;
	public:
		void SetBold(BOOL bEnable=TRUE){ m_bBold = bEnable; };
	    BOOL GetBold() { return m_bBold; };
        
		void SetRedFlag( BOOL bRedFlag=TRUE){ m_bRedFlag = bRedFlag; };
		BOOL GetRedFlag() { return m_bRedFlag; };

		void SetData( DWORD dwData ) { m_dwData = dwData; };
		DWORD GetData() { return m_dwData; };

		void SetIndex( int index ) { m_iIndex = index; };
		int  GetIndex() { return m_iIndex; };
      
};

/*** Declaration of "workhorse" class "CListBase" ****************************/
class CListBase
{
  public:
  CListBase(): m_pListCtrl       (0),
               m_bSortIconEnabled(false),
               m_bColorSortColumn(false),
               m_nSortColumn     (1),
               m_bKeepLabelLeft  (false),
               m_bLocked         (false),
               m_bControl        (false)
  {
    CreateSortIcons();
	m_ItemDatas.RemoveAll();
  }
  virtual ~CListBase(){ 
      CItemData* pData = NULL;
	  for( int i=0;i<m_ItemDatas.GetSize(); i++ )
	  {
	      pData = (CItemData*)m_ItemDatas.GetAt(i);
		  if( pData ) delete(pData);
	  }
  };

  void         ColorSortColumn(bool bEnable = true);
  void         DrawItem       (LPDRAWITEMSTRUCT lpDrawItemStruct);
  virtual void DrawSmallIcon  (CDC* pDC, LVITEM* pItem, LPRECT pRect);
  virtual void DrawStateIcon  (CDC* pDC, LVITEM* pItem, LPRECT pRect);
  virtual void DrawSubItemText(CDC* pDC, LVITEM* pItem, LVCOLUMN* pColumn,
                               LPRECT pRect);
  void         EnableSortIcon (bool bEnable = true, int nSortColumn = 1);
  int          IndexToOrder   (int nIndex);
  bool         KeepLabelLeft  (bool bKeepLeft = true);
  void         SetSortIcon    ();

  void        SetBoldItem( int nItem, BOOL bBold = TRUE );
  BOOL        GetBoldItem( int nItem );

  void        SetRedFlagItem(int nItem,BOOL bRedFlag = TRUE );
  BOOL        GetRedFlagItem( int nItem );
private:
  friend class CListCtrlEx;
  friend class CListViewEx;

  void        CreateSortIcons      ();
  int         GetLabelWidth        (CDC* pDC, LVITEM* pItem, int nMaxWidth)
    const;
  LVITEM*     GetLVITEM            (int nItem, int nSubItem = 0) const;
  bool        GetRealSubItemRect   (int iItem, int iSubItem, int nArea,
                                    CRect& ref);
  bool        GetStateIconRect     (int nItem, LPRECT pRect);
  int         HitTest              (CPoint pt, UINT* pFlags = 0);
  int         InsertColumn         (int nCol, const LVCOLUMN* pColumn);
  int         InsertColumn         (int nCol, LPCTSTR lpszColumnHeading,
                                    int nFormat, int nWidth, int nSubItem);
  int		  InsertItem(  const LVITEM* pItem );
  int		  InsertItem( int nItem, LPCTSTR lpszItem );
  int		  InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
  int         InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam );

  BOOL		  DeleteItem(  int nItem );
  BOOL		  DeleteAllItems( );
  
  BOOL        RemoveItemData( CItemData* pData ); 

  DWORD       GetItemData( int nItem ) const;  
  BOOL        SetItemData( int nItem, DWORD dwData );
  
  void        InvalidateNonItemArea();
  void        JustifyFirstColumn   (int nFormat);
  void        MakeShortString      (CDC* pDC, CString& strText, int nColumnLen)
    const;
	BOOL        OnColumnclick        (NMHDR* pNMHDR, LRESULT* pResult);
	void        OnCustomDraw         (NMHDR* pNMHDR, LRESULT* pResult);
	bool        OnEraseBkgnd         (CDC* pDC);
	bool        OnKeyDown            (UINT nChar);
	void        OnKeyUp              (UINT nChar);
	void        OnKillFocus          ();
	bool        OnLButtonDblClk      (CPoint point);
	bool        OnLButtonDown        (CPoint point);
	bool        OnNotify             (LPARAM lParam);
	void        OnSetFocus           ();
	void        OnSysColorChange     ();
  int         OrderToIndex         (int nOrder);
  CImageList* SetImageList         (CImageList* pImageList, int nImageList);

  static const int m_nFirstColXOff;
  static const int m_nNextColXOff;
  static const int m_nIconXOff;
  CListCtrlEx*     m_pListCtrl;
  bool             m_bSortIconEnabled;
  bool             m_bColorSortColumn;
  CImageList       m_imglstSortIcons;
  CBitmap          m_bmpUpArrow;
  CBitmap          m_bmpDownArrow;
  int              m_nUpArrow;
  int              m_nDownArrow;
  DWORD            m_dwColSortColor;
  int              m_nSortColumn;
  int              m_nFormatOfSubItem0;
  bool             m_bKeepLabelLeft;
  bool             m_bLocked;
  bool             m_bControl;

  CObArray       m_ItemDatas;
};


/*** Declaration of class "CListCtrlEx" **************************************/
class CListCtrlEx: public CListCtrl, public CListBase
{
  DECLARE_DYNCREATE(CListCtrlEx);

  public:
  CListCtrlEx() {m_pListCtrl = this;}
  
  virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
    CListBase::DrawItem(lpDrawItemStruct);
  }

  int HitTest(CPoint pt, UINT* pFlags = 0)
  {
    return CListBase::HitTest(pt, pFlags);
  }

  int HitTest(LVHITTESTINFO* pHitTestInfo)
  {
    return CListBase::HitTest(pHitTestInfo->pt, &pHitTestInfo->flags);
  }

  int InsertColumn(int nCol, const LVCOLUMN* pColumn)
  {
    return CListBase::InsertColumn(nCol, pColumn);
  }

  int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
                   int nFormat = LVCFMT_LEFT, int nWidth = -1,
                   int nSubItem = -1)
  {
    return CListBase::InsertColumn(nCol, lpszColumnHeading, nFormat, nWidth,
                                   nSubItem);
  }

  /**** 重载InsertItem函数,添加项辅助类 ***/
  int InsertItem(  const LVITEM* pItem )
  {
	  return CListBase::InsertItem( pItem );
  }

  int InsertItem( int nItem, LPCTSTR lpszItem )
  {
      return CListBase::InsertItem( nItem,lpszItem);	
  }

  int InsertItem( int nItem, LPCTSTR lpszItem, int nImage )
  {
      return CListBase::InsertItem( nItem,lpszItem,nImage);
  }
  int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam )
  {
      return CListBase::InsertItem( nMask,nItem,lpszItem,nState,nStateMask,nImage,lParam); 
  }
  /*** 重载删除项函数DeleteItem、DeleteAllItems,释放辅助类对象 ***/
  BOOL DeleteItem(  int nItem )
  {
      return  CListBase::DeleteItem( nItem );
  }

  BOOL DeleteAllItems( )
  {
      return CListBase::DeleteAllItems();
  }

  /*** 重载GetItemData、SetItemData函数,处理外部项关联数据 ***/
  DWORD  GetItemData( int nItem ) const
  {
      return CListBase::GetItemData( nItem );	
  }

  BOOL SetItemData( int nItem, DWORD dwData )
  {
      return CListBase::SetItemData( nItem,dwData );
  }

  CImageList* SetImageList(CImageList* pImageList, int nImageList)
  {
    return CListBase::SetImageList(pImageList, nImageList);
  }

  // Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CListViewCtrl)
	protected:
	virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
	//}}AFX_VIRTUAL

	// Generated message map functions
  protected:
	//{{AFX_MSG(CListCtrlEx)
	afx_msg void OnSysColorChange();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
	//}}AFX_MSG
	afx_msg BOOL OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnCustomDraw (NMHDR* pNMHDR, LRESULT* pResult);

	DECLARE_MESSAGE_MAP()
};


/*** Declaration of class "CListViewEx" **************************************/
class CListViewEx: public CListView, public CListBase
{
  DECLARE_DYNCREATE(CListViewEx);

  public:
  CListViewEx() {m_pListCtrl = static_cast<CListCtrlEx*>(&GetListCtrl());}

  virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
    CListBase::DrawItem(lpDrawItemStruct);
  }

  int HitTest(CPoint pt, UINT* pFlags = 0)
  {
    return CListBase::HitTest(pt, pFlags);
  }

  int HitTest(LVHITTESTINFO* pHitTestInfo)
  {
    return CListBase::HitTest(pHitTestInfo->pt, &pHitTestInfo->flags);
  }

  int InsertColumn(int nCol, const LVCOLUMN* pColumn)
  {
    return CListBase::InsertColumn(nCol, pColumn);
  }

  int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
                   int nFormat = LVCFMT_LEFT, int nWidth = -1,
                   int nSubItem = -1)
  {
    return CListBase::InsertColumn(nCol, lpszColumnHeading, nFormat, nWidth,
                                   nSubItem);
  }

   /**** 重载InsertItem函数,添加项辅助类 ***/
  int InsertItem(  const LVITEM* pItem )
  {
	  return CListBase::InsertItem( pItem );
  }

  int InsertItem( int nItem, LPCTSTR lpszItem )
  {
      return CListBase::InsertItem( nItem,lpszItem);	
  }

  int InsertItem( int nItem, LPCTSTR lpszItem, int nImage )
  {
      return CListBase::InsertItem( nItem,lpszItem,nImage);
  }
  int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam )
  {
      return CListBase::InsertItem( nMask,nItem,lpszItem,nState,nStateMask,nImage,lParam); 
  }
  /*** 重载删除项函数DeleteItem、DeleteAllItems,释放辅助类对象 ***/
  BOOL DeleteItem(  int nItem )
  {
      return  CListBase::DeleteItem( nItem );
  }

  BOOL DeleteAllItems( )
  {
      return CListBase::DeleteAllItems();
  }

  /*** 重载GetItemData、SetItemData函数,处理外部项关联数据 ***/
  DWORD  GetItemData( int nItem ) const
  {
      return CListBase::GetItemData( nItem );	
  }

  BOOL SetItemData( int nItem, DWORD dwData )
  {
      return CListBase::SetItemData( nItem,dwData );
  }
  CImageList* SetImageList(CImageList* pImageList, int nImageList)
  {
    return CListBase::SetImageList(pImageList, nImageList);
  }

  // Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CListViewCtrl)
	protected:
	virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
	//}}AFX_VIRTUAL

	// Generated message map functions
  protected:
	//{{AFX_MSG(CListCtrlEx)
	afx_msg void OnSysColorChange();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
	//}}AFX_MSG
	afx_msg BOOL OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnCustomDraw (NMHDR* pNMHDR, LRESULT* pResult);

	DECLARE_MESSAGE_MAP()
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -