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

📄 imagelistbox2.h

📁 WTL框架实现的ImageListBox
💻 H
📖 第 1 页 / 共 2 页
字号:
   {
      ATLASSERT(::IsWindow(m_hWnd));
      HFONT hOldFont = m_hMainFont;
      m_hMainFont = hFont;
      Invalidate();
      return hOldFont;
   }
   HFONT SetSmallFont(HFONT hFont)
   {
      ATLASSERT(::IsWindow(m_hWnd));
      HFONT hOldFont = m_hSubFont;
      m_hSubFont = hFont;
      Invalidate();
      return hOldFont;
   }
   void GetPreferences(PILBSETTINGS pPrefs) const
   {
      ATLASSERT(pPrefs);
      *pPrefs = m_st;
   }
   void SetPreferences(ILBSETTINGS Prefs)
   {
      ATLASSERT(::IsWindow(m_hWnd));
      m_st = Prefs;
      SetBkColor(m_st.clrBackground);
   }

   // Implementation

   void _Init()
   {
      ATLASSERT(::IsWindow(m_hWnd));

      ATLASSERT((GetStyle() & LVS_REPORT)!=0);
      ATLASSERT((GetStyle() & LVS_SINGLESEL)!=0);
      ATLASSERT((GetStyle() & LVS_SHOWSELALWAYS)!=0);
      ATLASSERT((GetStyle() & LVS_OWNERDRAWFIXED)!=0);
      ATLASSERT((GetStyle() & LVS_SHAREIMAGELISTS)!=0);

      SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);

      T* pT = static_cast<T*>(this);
      pT->_InitSettings();

      // Add dummy column for text to actually get displayed!
      AddColumn(_T(""), 0);
   }
   void _InitSettings()
   {
      m_st.clrText = ::GetSysColor(COLOR_WINDOWTEXT);
      m_st.clrBackground = ::GetSysColor(COLOR_WINDOW);
      m_st.clrHighliteText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
      m_st.clrHighlite = 
      m_st.clrHighliteBorder = ::GetSysColor(COLOR_HIGHLIGHT);
   }

   // Message map and handlers
   
   BEGIN_MSG_MAP(CImageListBoxImpl)
      MESSAGE_HANDLER(WM_CREATE, OnCreate)
      MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
      MESSAGE_HANDLER(WM_SIZE, OnSize)
      REFLECTED_NOTIFY_CODE_HANDLER(LVN_DELETEITEM, OnDeleteItem)
      CHAIN_MSG_MAP_ALT( CCustomDraw<CImageListBoxImpl>, 1 )
   END_MSG_MAP()
  
   LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
   {
      LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);
      _Init();
      return lRes;
   }
   LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
   {
      DeleteAllItems(); // Make sure to delete item-data memory
      bHandled = FALSE;
      return 0;
   }
   LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
   {
      SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
      bHandled = FALSE;
      return 0;
   }

   LRESULT OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
   {
      LPNMLISTVIEW pnmlv = (LPNMLISTVIEW) pnmh;
      PILBITEM pItem = reinterpret_cast<PILBITEM>( TBase::GetItemData(pnmlv->iItem) );
      if( pItem->mask & ILBIF_TEXT ) delete [] pItem->pszText;
      if( pItem->mask & ILBIF_SUBTEXT ) delete [] pItem->pszSubText;
      delete pItem;
      return 0;
   }

   // Custom painting

   DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
   {
      return CDRF_NOTIFYITEMDRAW;   // We need per-item notifications
   }
   DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
   {
      LPNMLVCUSTOMDRAW lpNMLVCD = (LPNMLVCUSTOMDRAW) lpNMCustomDraw;
     
      CDCHandle dc = lpNMLVCD->nmcd.hdc;
      
      PILBITEM pItem = (PILBITEM) lpNMLVCD->nmcd.lItemlParam;
      ATLASSERT(pItem);

      RECT rcItem;
      GetItemRect(lpNMLVCD->nmcd.dwItemSpec, &rcItem, LVIR_BOUNDS);

      rcItem.right -= 1;

      bool bSelected = lpNMLVCD->nmcd.uItemState & CDIS_SELECTED;
      
      UINT style = (pItem->mask & ILBIF_STYLE) != 0 ? pItem->style : ILBS_IMGLEFT | ILBS_SELNORMAL;

      COLORREF clrFront = bSelected ? m_st.clrHighliteText : m_st.clrText;
      COLORREF clrBack = bSelected ? m_st.clrHighlite : m_st.clrBackground;

      if( bSelected && (style & ILBS_SELROUND) ) {
         // Draw round-rect selection
         dc.FillSolidRect(&rcItem, m_st.clrBackground);
         ::InflateRect(&rcItem, -m_st.sizeMargin.cx, -m_st.sizeMargin.cy);
         CPen pen;
         pen.CreatePen(PS_SOLID, 1, m_st.clrHighliteBorder);
         CBrush brush;
         brush.CreateSolidBrush(m_st.clrHighlite);
         HPEN hOldPen = dc.SelectPen(pen);
         HBRUSH hOldBrush = dc.SelectBrush(brush);
         dc.RoundRect(&rcItem, m_st.ptArc);
         dc.SelectBrush(hOldBrush);
         dc.SelectPen(hOldPen);
      }
      else {
         // Fill background
         dc.FillSolidRect(&rcItem, clrBack);
         ::InflateRect(&rcItem, -m_st.sizeMargin.cx, -m_st.sizeMargin.cy);
      }
      if( style & ILBS_SELROUND ) ::InflateRect(&rcItem, -m_st.ptArc.x, -m_st.ptArc.y);

      // Get image information
      int iImageWidth = 0, iImageHeight = 0;
      if( pItem->mask & ILBIF_IMAGE ) m_imgNormal.GetIconSize(iImageWidth, iImageHeight);

      // Prepare draw
      HFONT hOldFont = dc.SelectFont(GetFont());
      dc.SetBkMode(TRANSPARENT);
      dc.SetBkColor(clrBack);
      dc.SetTextColor(clrFront);

      // Draw image (may be aligned left/right/top)
      if( pItem->mask & ILBIF_IMAGE ) {
         if( (style & ILBS_IMGRIGHT) == 0 ) {
            // Left- or top-aligned image
            POINT pt;
            if( style & ILBS_IMGTOP ) {
               pt.x = rcItem.left + ((rcItem.right - rcItem.left) / 2) - (iImageWidth / 2);
               pt.y = rcItem.top;
            }
            else {
               pt.x = rcItem.left;
               pt.y = rcItem.top + ((rcItem.bottom - rcItem.top) / 2) - (iImageHeight / 2);
            }
            if( bSelected && (pItem->mask & ILBIF_SELIMAGE) ) {
               m_imgSelected.Draw(dc, pItem->iSelImage, pt, ILD_NORMAL);
            }
            else {
               m_imgNormal.Draw(dc, pItem->iImage, pt, ILD_NORMAL);
            }
            if( style & ILBS_IMGTOP ) {
               rcItem.top += iImageHeight;
            }
            else {
               rcItem.left += iImageWidth;
            }
         }
         else {
            // Right-aligned image
            int x = rcItem.right - iImageWidth;
            int y = rcItem.top + ((rcItem.bottom - rcItem.top) / 2) - (iImageHeight / 2);
            if( bSelected && (pItem->mask & ILBIF_SELIMAGE) ) {
               m_imgSelected.Draw(dc, pItem->iSelImage, x,y, ILD_NORMAL);
            }
            else {
               m_imgNormal.Draw(dc, pItem->iImage, x,y, ILD_NORMAL);
            }
            rcItem.right -= iImageWidth;
         }
      }

      // Prepare text drawing
      UINT format = DT_LEFT | DT_NOPREFIX;
      if( pItem->mask & ILBIF_FORMAT ) format = pItem->format;

      // Draw text
      if( pItem->mask & ILBIF_TEXT ) {
         if( m_hMainFont != NULL ) dc.SelectFont(m_hMainFont);
         ::InflateRect(&rcItem, -m_st.sizeIndent.cx, -m_st.sizeIndent.cy);
         RECT rcText = { 0 };
         dc.DrawText(pItem->pszText, -1, &rcText, format | DT_CALCRECT);
         dc.DrawText(pItem->pszText, -1, &rcItem, format);
         rcItem.top += rcText.bottom-rcText.top;
      }
      // Draw subtext
      if( pItem->mask & ILBIF_SUBTEXT ) {
         if( m_hSubFont != NULL ) dc.SelectFont(m_hSubFont);
         ::InflateRect(&rcItem, -m_st.sizeSubIndent.cx, 0);
         rcItem.top += m_st.sizeSubIndent.cy;
         RECT rcText = { 0 };
         dc.DrawText(pItem->pszSubText, -1, &rcText, format | DT_CALCRECT);
         dc.DrawText(pItem->pszSubText, -1, &rcItem, format);
         rcItem.top += rcText.bottom-rcText.top;
      }

      dc.SelectFont(hOldFont);

      return CDRF_SKIPDEFAULT;
   }
};

class CImageListBoxCtrl : public CImageListBoxImpl<CImageListBoxCtrl>
{
public:
   DECLARE_WND_SUPERCLASS(_T("WTL_ImageListBox"), GetWndClassName())  
};


#endif // !defined(AFX_IMAGELISTBOX_H__20040606_AF04_B15C_D1F1_0080AD509054__INCLUDED_)

⌨️ 快捷键说明

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