IconListBox.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:6k
源码类别:

界面编程

开发平台:

Visual C++

  1. #if !defined(AFX_ICONLISTBOX_H__05529A1B_C832_44F4_9CA3_7194AC7EA611__INCLUDED_)
  2. #define AFX_ICONLISTBOX_H__05529A1B_C832_44F4_9CA3_7194AC7EA611__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6. // IconListBox.h : header file
  7. //
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CListBoxMenuLike window
  10. #if !defined(__EXT_MEMORY_DC_H)
  11. #include <../Src/ExtMemoryDC.h>
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CListBoxCustomPainted window
  15. class CListBoxCustomPainted : public CListBox, public CExtPmBridge
  16. {
  17. public:
  18. DECLARE_DYNCREATE( CListBoxCustomPainted );
  19. IMPLEMENT_CExtPmBridge_MEMBERS( CListBoxCustomPainted );
  20. bool m_bShowSelAlways:1, m_bCaseSensitiveSort:1, m_bAutoDestroyListBox:1;
  21. CListBoxCustomPainted();
  22. virtual ~CListBoxCustomPainted();
  23. //{{AFX_VIRTUAL(CListBoxCustomPainted)
  24. public:
  25. virtual void DrawItem( LPDRAWITEMSTRUCT pDIS );
  26. virtual void MeasureItem( LPMEASUREITEMSTRUCT pMIS );
  27. virtual int CompareItem( LPCOMPAREITEMSTRUCT pCIS );
  28. virtual void DeleteItem( LPDELETEITEMSTRUCT pDIS );
  29. virtual int VKeyToItem( UINT nKey, UINT nIndex );
  30. virtual int CharToItem( UINT nKey, UINT nIndex );
  31. protected:
  32. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
  33. virtual void PreSubclassWindow();
  34. virtual void PostNcDestroy();
  35. //}}AFX_VIRTUAL
  36. protected:
  37. //{{AFX_MSG(CListBoxCustomPainted)
  38. //}}AFX_MSG
  39. afx_msg void OnLbnReflectSelCancel();
  40. afx_msg void OnLbnReflectKillFocus();
  41. afx_msg void OnLbnReflectSetFocus();
  42. DECLARE_MESSAGE_MAP()
  43. protected:
  44. virtual void _RedrawLB();
  45. public:
  46. virtual void PmBridge_OnPaintManagerChanged( CExtPaintManager * pGlobalPM );
  47. virtual HFONT OnLbQueryItemFont( INT nItemIndex );
  48. virtual CSize OnLbQueryItemExtraSize( INT nItemIndex );
  49. virtual bool OnLbQueryWindowFocusedState();
  50. virtual bool OnLbEraseEntire( CDC & dc, CRect rcClient );
  51. };
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CListBoxMenuLike window
  54. class CListBoxMenuLike : public CExtNCSB < CListBoxCustomPainted >
  55. {
  56. // Construction
  57. public:
  58. CListBoxMenuLike();
  59. // Attributes
  60. public:
  61. private:
  62. void _Invalidate()
  63. {
  64. ASSERT_VALID( this );
  65. Invalidate();
  66. UpdateWindow();
  67. }
  68. public:
  69. class ITEM_DATA
  70. {
  71. public:
  72. CString m_strText;
  73. CExtCmdIcon m_icon;
  74. HWND m_hWndPage;
  75. ITEM_DATA(
  76. CExtCmdIcon & icon,
  77. LPCTSTR strText,
  78. HWND hWnd
  79. )
  80. : m_icon( icon )
  81. , m_strText( strText )
  82. , m_hWndPage( hWnd )
  83. {
  84. }
  85. ~ITEM_DATA()
  86. {
  87. }
  88. CSize GetSize() const
  89. {
  90. ASSERT( m_icon.GetSize().cx > 0 );
  91. ASSERT( m_icon.GetSize().cy > 0 );
  92. return m_icon.GetSize();
  93. }
  94. CExtCmdIcon * GetIconPtr()
  95. {
  96. ASSERT( !m_icon.IsEmpty() );
  97. return (&m_icon);
  98. }
  99. private:
  100. static CRect CalcFillItemRect( const RECT & rcItem, const SIZE & sizeIcon )
  101. {
  102. CRect rcFillItem( rcItem );
  103. rcFillItem.left += sizeIcon.cx + 8;
  104. rcFillItem.DeflateRect( 0, 2, 2, 2 );
  105. return rcFillItem;
  106. }
  107. static CRect CalcTextRect( const RECT & rcItem, const SIZE & sizeIcon )
  108. {
  109. CRect rcText = CalcFillItemRect( rcItem, sizeIcon );
  110. rcText.DeflateRect( 4, 2, 2, 2 );
  111. return rcText;
  112. }
  113. static CSize CalcColorCellSize()
  114. {
  115. return CSize( 6, 6 );
  116. }
  117. static CRect CalcEraseRect(
  118. const RECT & rcItem,
  119. HWND hWnd,
  120. INT nItemID
  121. )
  122. {
  123. ASSERT( hWnd != NULL && ::IsWindow(hWnd) );
  124. ASSERT( nItemID >= 0 );
  125. CListBox * pLB = (CListBox *)
  126. CWnd::FromHandlePermanent( hWnd );
  127. ASSERT_VALID( pLB );
  128. INT nCount = pLB->GetCount();
  129. ASSERT( nCount > 0 );
  130. ASSERT( nItemID < nCount );
  131. CRect rcErase = rcItem;
  132. if( nItemID == (nCount-1) )
  133. {
  134. CRect rcClient;
  135. pLB->GetClientRect( &rcClient );
  136. if( rcErase.bottom < rcClient.bottom )
  137. rcErase.bottom = rcClient.bottom;
  138. } // if( nItemID == (nCount-1) )
  139. return rcErase;
  140. }
  141. public:
  142. void DrawItem(
  143. INT nIconAreaWidth,
  144. LPDRAWITEMSTRUCT pDIS
  145. );
  146. void MeasureItem(
  147. LPMEASUREITEMSTRUCT pMIS,
  148. CSize _sizeClientArea
  149. );
  150. }; // class ITEM_DATA
  151. CArray < ITEM_DATA*, ITEM_DATA* > m_arrItems;
  152. // Operations
  153. public:
  154. void AddIcon(
  155. CExtCmdIcon & icon,
  156. LPCTSTR strComment,
  157. HWND hWnd
  158. )
  159. {
  160. ASSERT_VALID( this );
  161. ASSERT( !icon.IsEmpty() );
  162. m_arrItems.Add(
  163. new ITEM_DATA(
  164. icon,
  165. strComment,
  166. hWnd
  167. )
  168. );
  169. CExtNCSB < CListBoxCustomPainted > :: AddString(
  170. LPCTSTR(strComment) // _T("")
  171. );
  172. }
  173. void RemoveAllIcons()
  174. {
  175. ASSERT_VALID( this );
  176. if( GetSafeHwnd() != NULL
  177. && ::IsWindow( GetSafeHwnd() )
  178. )
  179. CExtNCSB < CListBoxCustomPainted > :: ResetContent();
  180. for( INT i = 0; i < m_arrItems.GetSize(); i++ )
  181. delete m_arrItems[i];
  182. m_arrItems.RemoveAll();
  183. }
  184. CExtCmdIcon * GetIconPtr( INT nPos )
  185. {
  186. ASSERT_VALID( this );
  187. ASSERT( 0 <= nPos && nPos < m_arrItems.GetSize() );
  188. ITEM_DATA * pData = m_arrItems[nPos];
  189. ASSERT( pData != NULL );
  190. return pData->GetIconPtr();
  191. }
  192. virtual bool OnLbEraseEntire( CDC & dc, CRect rcClient );
  193. protected:
  194. INT GetIconAreaWidth()
  195. {
  196. INT nIconAreaWidth = 0;
  197. for( INT nIndex = 0; nIndex < m_arrItems.GetSize(); nIndex++ ){
  198. ITEM_DATA *pItemData = m_arrItems[ nIndex ];
  199. if( nIconAreaWidth < pItemData->GetSize().cx ){
  200. nIconAreaWidth = pItemData->GetSize().cx;
  201. }
  202. }
  203. nIconAreaWidth += (5+5);
  204. return nIconAreaWidth;
  205. }
  206. // Overrides
  207. // ClassWizard generated virtual function overrides
  208. //{{AFX_VIRTUAL(CListBoxMenuLike)
  209. public:
  210. virtual void DrawItem( LPDRAWITEMSTRUCT pDIS );
  211. virtual void MeasureItem( LPMEASUREITEMSTRUCT pMIS );
  212. //}}AFX_VIRTUAL
  213. // Implementation
  214. public:
  215. virtual ~CListBoxMenuLike();
  216. // Generated message map functions
  217. protected:
  218. //{{AFX_MSG(CListBoxMenuLike)
  219. afx_msg void OnSelcancel();
  220. afx_msg void OnKillfocus();
  221. afx_msg void OnSetfocus();
  222. //}}AFX_MSG
  223. DECLARE_MESSAGE_MAP()
  224. };
  225. /////////////////////////////////////////////////////////////////////////////
  226. //{{AFX_INSERT_LOCATION}}
  227. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  228. #endif // !defined(AFX_ICONLISTBOX_H__05529A1B_C832_44F4_9CA3_7194AC7EA611__INCLUDED_)