MyHeaderCtrl.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:5k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MyHeaderCtrl.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. CMyHeaderCtrl::CMyHeaderCtrl()
  9. : m_iSortColumn( -1 )
  10. , m_bSortAscending( TRUE )
  11. {
  12. m_clrBack=RGB(161,192,245);
  13. m_blnDefault=FALSE;
  14. m_clrLeft=RGB(97,244,78);
  15. m_clrRight=RGB(52,148,39);
  16. }
  17. CMyHeaderCtrl::~CMyHeaderCtrl()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CMyHeaderCtrl, CHeaderCtrl)
  21. //{{AFX_MSG_MAP(CMyHeaderCtrl)
  22. // NOTE - the ClassWizard will add and remove mapping macros here.
  23. //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CMyHeaderCtrl message handlers
  27. void CMyHeaderCtrl::SetSortArrow( const int iSortColumn, const BOOL bSortAscending )
  28. {
  29. m_iSortColumn = iSortColumn;
  30. m_bSortAscending = bSortAscending;
  31. m_blnDefault=FALSE;
  32. HD_ITEM hditem;
  33. hditem.mask = HDI_FORMAT;
  34. VERIFY( GetItem( iSortColumn, &hditem ) );
  35. hditem.fmt |= HDF_OWNERDRAW;
  36. VERIFY( SetItem( iSortColumn, &hditem ) );
  37. Invalidate();
  38. }
  39. void CMyHeaderCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
  40. {
  41. CDC dc;
  42. VERIFY( dc.Attach( lpDrawItemStruct->hDC ) );
  43. const int iSavedDC = dc.SaveDC();
  44. CRect rc( lpDrawItemStruct->rcItem );
  45. CRgn rgn;
  46. VERIFY( rgn.CreateRectRgnIndirect( &rc ) );
  47. (void)dc.SelectObject( &rgn );
  48. VERIFY( rgn.DeleteObject() );
  49. CBrush brush( GetSysColor( COLOR_3DFACE ) );
  50. dc.SetBkMode(TRANSPARENT);
  51. int r1=GetRValue(m_clrBack);
  52. int g1=GetGValue(m_clrBack);
  53. int b1=GetBValue(m_clrBack);
  54. for(int i=rc.Height()/2;i>0;i--)
  55. {
  56. r1=(r1+5)>255?255:(r1+5);
  57. g1=(g1+5)>255?255:(g1+5);
  58. b1=(b1+5)>255?255:(b1+5);
  59. CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
  60. CPen *old = dc.SelectObject(&pen);
  61. dc.MoveTo(rc.left,rc.top+i);
  62. dc.LineTo(rc.right,rc.top+i);
  63. dc.MoveTo(rc.left,rc.bottom-i);
  64. dc.LineTo(rc.right,rc.bottom-i);
  65. dc.SelectObject(old);
  66. }
  67. TCHAR szText[ 256 ];
  68. HD_ITEM hditem;
  69. hditem.mask = HDI_TEXT | HDI_FORMAT;
  70. hditem.pszText = szText;
  71. hditem.cchTextMax = 255;
  72. VERIFY( GetItem( lpDrawItemStruct->itemID, &hditem ) );
  73. UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS ;
  74. if( hditem.fmt & HDF_CENTER)
  75. uFormat |= DT_CENTER;
  76. else if( hditem.fmt & HDF_RIGHT)
  77. uFormat |= DT_RIGHT;
  78. else
  79. uFormat |= DT_LEFT;
  80. if( lpDrawItemStruct->itemState == ODS_SELECTED )
  81. {
  82. rc.left++;
  83. rc.top += 2;
  84. rc.right++;
  85. }
  86. CRect rcIcon( lpDrawItemStruct->rcItem );
  87. const int iOffset = ( rcIcon.bottom - rcIcon.top ) / 4;
  88. if( lpDrawItemStruct->itemID == (UINT)m_iSortColumn )
  89. rc.right -= 3 * iOffset;
  90. rc.left += iOffset;
  91. rc.right -= iOffset;
  92. if( rc.left < rc.right )
  93. (void)dc.DrawText( szText, -1, rc, uFormat );
  94. if( lpDrawItemStruct->itemID == (UINT)m_iSortColumn )
  95. {
  96. CPen penLight( PS_SOLID, 1,m_clrLeft);
  97. CPen penShadow( PS_SOLID, 1,m_clrRight);
  98. CPen* pOldPen = dc.SelectObject( &penLight );
  99. if( m_bSortAscending )
  100. {
  101. dc.MoveTo( rcIcon.right - 2 * iOffset, iOffset);
  102. dc.LineTo( rcIcon.right - iOffset, rcIcon.bottom - iOffset - 1 );
  103. dc.LineTo( rcIcon.right - 3 * iOffset - 2, rcIcon.bottom - iOffset - 1 );
  104. (void)dc.SelectObject( &penShadow );
  105. dc.MoveTo( rcIcon.right - 3 * iOffset - 1, rcIcon.bottom - iOffset - 1 );
  106. dc.LineTo( rcIcon.right - 2 * iOffset, iOffset - 1);
  107. }
  108. else
  109. {
  110. dc.MoveTo( rcIcon.right - iOffset - 1, iOffset );
  111. dc.LineTo( rcIcon.right - 2 * iOffset - 1, rcIcon.bottom - iOffset );
  112. (void)dc.SelectObject( &penShadow );
  113. dc.MoveTo( rcIcon.right - 2 * iOffset - 2, rcIcon.bottom - iOffset );
  114. dc.LineTo( rcIcon.right - 3 * iOffset - 1, iOffset );
  115. dc.LineTo( rcIcon.right - iOffset - 1, iOffset );
  116. }
  117. (void)dc.SelectObject( pOldPen );
  118. }
  119. VERIFY( dc.RestoreDC( iSavedDC ) );
  120. (void)dc.Detach();
  121. }
  122. void CMyHeaderCtrl::Serialize( CArchive& ar )
  123. {
  124. if( ar.IsStoring() )
  125. {
  126. const int iItemCount = GetItemCount();
  127. if( iItemCount != -1 )
  128. {
  129. ar << iItemCount;
  130. HD_ITEM hdItem = { 0 };
  131. hdItem.mask = HDI_WIDTH;
  132. for( int i = 0; i < iItemCount; i++ )
  133. {
  134. VERIFY( GetItem( i, &hdItem ) );
  135. ar << hdItem.cxy;
  136. }
  137. }
  138. }
  139. else
  140. {
  141. int iItemCount;
  142. ar >> iItemCount;
  143. if( GetItemCount() != iItemCount )
  144. TRACE0( _T("Different number of columns in registry.") );
  145. else
  146. {
  147. HD_ITEM hdItem = { 0 };
  148. hdItem.mask = HDI_WIDTH;
  149. for( int i = 0; i < iItemCount; i++ )
  150. {
  151. ar >> hdItem.cxy;
  152. VERIFY( SetItem( i, &hdItem ) );
  153. }
  154. }
  155. }
  156. }
  157. void CMyHeaderCtrl::SetDefault()
  158. {
  159. for(int i=0;i<GetItemCount();i++)
  160. {
  161. HD_ITEM hditem;
  162. hditem.mask = HDI_FORMAT;
  163. VERIFY( GetItem( i, &hditem ) );
  164. hditem.fmt |= HDF_OWNERDRAW;
  165. VERIFY( SetItem( i, &hditem ) );
  166. Invalidate();
  167. }
  168. }