FileListHead.cpp
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // FileListHead.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PFM.h"
  5. #include "FileListHead.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CFileListHead
  13. CFileListHead::CFileListHead()
  14. {
  15. m_nSortCol = -1;
  16. }
  17. CFileListHead::~CFileListHead()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CFileListHead, CHeaderCtrl)
  21. //{{AFX_MSG_MAP(CFileListHead)
  22. // NOTE - the ClassWizard will add and remove mapping macros here.
  23. //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CFileListHead message handlers
  27. int CFileListHead::SetSortImage( int nCol, BOOL bAsc )
  28. {
  29. int nPrevCol = m_nSortCol;
  30. m_nSortCol = nCol;
  31. m_bSortAsc = bAsc;
  32. // Change the item to ownder drawn
  33. HD_ITEM hditem;
  34. hditem.mask = HDI_FORMAT;
  35. GetItem( nCol, &hditem );
  36. hditem.fmt |= HDF_OWNERDRAW;
  37. SetItem( nCol, &hditem );
  38. // Invalidate header control so that it gets redrawn
  39. Invalidate();
  40. return nPrevCol;
  41. }
  42. void CFileListHead::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
  43. {
  44. CDC dc;
  45. dc.Attach( lpDrawItemStruct->hDC );
  46. // Get the column rect
  47. CRect rcLabel( lpDrawItemStruct->rcItem );
  48. // Save DC
  49. int nSavedDC = dc.SaveDC();
  50. // Set clipping region to limit drawing within column
  51. CRgn rgn;
  52. rgn.CreateRectRgnIndirect( &rcLabel );
  53. dc.SelectObject( &rgn );
  54. rgn.DeleteObject();
  55. // Draw the background
  56. dc.FillRect(rcLabel, &CBrush(::GetSysColor(COLOR_BTNFACE)));
  57. // Labels are offset by a certain amount  
  58. // This offset is related to the width of a space character
  59. int offset = dc.GetTextExtent(_T(" "), 1 ).cx/2;
  60. // Get the column text and format
  61. TCHAR buf[256];
  62. HD_ITEM hditem;
  63. hditem.mask = HDI_TEXT | HDI_FORMAT;
  64. hditem.pszText = buf;
  65. hditem.cchTextMax = 255;
  66. GetItem( lpDrawItemStruct->itemID, &hditem );
  67. // Determine format for drawing column label
  68. UINT uFormat = DT_SINGLELINE | DT_NOPREFIX// | DT_NOCLIP 
  69. | DT_VCENTER;// | DT_END_ELLIPSIS ;
  70. if( hditem.fmt & HDF_CENTER)
  71. uFormat |= DT_CENTER;
  72. else if( hditem.fmt & HDF_RIGHT)
  73. uFormat |= DT_RIGHT;
  74. else
  75. uFormat |= DT_LEFT;
  76. // Adjust the rect if the mouse button is pressed on it
  77. if( lpDrawItemStruct->itemState == ODS_SELECTED )
  78. {
  79. rcLabel.left++;
  80. rcLabel.top += 2;
  81. rcLabel.right++;
  82. }
  83. CRect rcIcon(rcLabel);
  84. rcIcon.top +=2;
  85. rcIcon.left +=2;
  86. // Adjust the rect further if Sort arrow is to be displayed
  87. if( lpDrawItemStruct->itemID == (UINT)m_nSortCol )
  88. {
  89. rcLabel.left += offset;
  90. }
  91. rcLabel.left += 2*offset;
  92. rcLabel.right -= offset;
  93. // Draw column label
  94. if( rcLabel.left < rcLabel.right )
  95. dc.DrawText(buf,-1,rcLabel, uFormat);
  96. // Draw the Sort arrow
  97. if( lpDrawItemStruct->itemID == (UINT)m_nSortCol )
  98. {
  99. //CRect rcIcon( lpDrawItemStruct->rcItem );
  100. // Set up pens to use for drawing the triangle
  101. CPen penLine(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT));
  102. CPen *pOldPen = dc.SelectObject( &penLine );
  103. if( m_bSortAsc )
  104. {
  105. // Draw triangle pointing upwards
  106. dc.MoveTo( rcIcon.left, rcIcon.top + 2*offset );
  107. dc.LineTo( rcIcon.left+offset, rcIcon.top);
  108. dc.LineTo( rcIcon.left+2*offset+1,rcIcon.top + 2*offset);
  109. dc.MoveTo( rcIcon.left+offset, rcIcon.top);
  110. dc.LineTo( rcIcon.left+offset, rcIcon.bottom);
  111. }
  112. else
  113. {
  114. // Draw triangle pointing downwords
  115. dc.MoveTo( rcIcon.left, rcIcon.bottom - 2*offset );
  116. dc.LineTo( rcIcon.left+offset, rcIcon.bottom);
  117. dc.LineTo( rcIcon.left+2*offset+1,rcIcon.bottom - 2*offset);
  118. dc.MoveTo( rcIcon.left+offset, rcIcon.bottom);
  119. dc.LineTo( rcIcon.left+offset, rcIcon.top);
  120. }
  121. // Restore the pen
  122. dc.SelectObject( pOldPen );
  123. }
  124. // Restore dc
  125. dc.RestoreDC( nSavedDC );
  126. // Detach the dc before returning
  127. dc.Detach();
  128. }