DropArrows.h
上传用户:sztopon
上传日期:2014-01-21
资源大小:55k
文件大小:3k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. #pragma once
  2. class CDropArrows : public CWindowImpl< CDropArrows >
  3. {
  4. public:
  5. CDropArrows()
  6. {
  7. m_bVertical = FALSE;
  8. m_nSpanLength = 0;
  9. }
  10. ~CDropArrows()
  11. {
  12. }
  13. DECLARE_WND_CLASS( _T( "DropArrows" ) )
  14. protected:
  15. CBrush m_bshArrowBrush;
  16. CRgn m_rgnArrowRegion;
  17. BOOL m_bVertical;
  18. int m_nSpanLength;
  19. public:
  20. BOOL Create( HWND hWndParent, int nSpanLength, BOOL bVertical )
  21. {
  22. if ( !m_bshArrowBrush.CreateSolidBrush( RGB( 255, 0, 0 ) ) )
  23. return FALSE;
  24. m_bVertical = bVertical;
  25. m_nSpanLength = nSpanLength + 20;
  26. if ( CWindowImpl< CDropArrows >::Create( hWndParent, CRect( 0, 0, m_bVertical ? 12 : m_nSpanLength, m_bVertical ? m_nSpanLength : 12 ), NULL, WS_POPUP | WS_DISABLED, WS_EX_TOOLWINDOW ) == NULL )
  27. return FALSE;
  28. POINT ptArrow[ 7 ];
  29. ptArrow[0].x = bVertical ? 8 : 0; ptArrow[0].y = bVertical ? 0 : 9;
  30. ptArrow[1].x = bVertical ? 8 : 4; ptArrow[1].y = bVertical ? 4 : 9;
  31. ptArrow[2].x = bVertical ? 11 : 4; ptArrow[2].y = bVertical ? 4 : 12;
  32. ptArrow[3].x = bVertical ? 6 : 10; ptArrow[3].y = bVertical ? 9 : 6;
  33. ptArrow[4].x = bVertical ? 1 : 4; ptArrow[4].y = bVertical ? 4 : 0;
  34. ptArrow[5].x = bVertical ? 4 : 4; ptArrow[5].y = bVertical ? 4 : 4;
  35. ptArrow[6].x = bVertical ? 4 : 0; ptArrow[6].y = bVertical ? 0 : 4;
  36. CRgn rgnFirstArrow;
  37. if ( !rgnFirstArrow.CreatePolygonRgn( ptArrow, 7, ALTERNATE ) )
  38. return FALSE;
  39. ptArrow[0].x = bVertical ? 4 : m_nSpanLength; ptArrow[0].y = bVertical ? m_nSpanLength : 4;
  40. ptArrow[1].x = bVertical ? 4 : m_nSpanLength - 4; ptArrow[1].y = bVertical ? m_nSpanLength - 4 : 4;
  41. ptArrow[2].x = bVertical ? 0 : m_nSpanLength - 4; ptArrow[2].y = bVertical ? m_nSpanLength - 4 : 0;
  42. ptArrow[3].x = bVertical ? 6 : m_nSpanLength - 10; ptArrow[3].y = bVertical ? m_nSpanLength - 10 : 6;
  43. ptArrow[4].x = bVertical ? 12 : m_nSpanLength - 4; ptArrow[4].y = bVertical ? m_nSpanLength - 4 : 12;
  44. ptArrow[5].x = bVertical ? 8 : m_nSpanLength - 4; ptArrow[5].y = bVertical ? m_nSpanLength - 4 : 9;
  45. ptArrow[6].x = bVertical ? 8 : m_nSpanLength; ptArrow[6].y = bVertical ? m_nSpanLength : 9;
  46. CRgn rgnSecondArrow;
  47. if ( !rgnSecondArrow.CreatePolygonRgn( ptArrow, 7, ALTERNATE ) )
  48. return FALSE;
  49. if ( !m_rgnArrowRegion.CreateRectRgn( 0, 0, bVertical ? 12 : nSpanLength, bVertical ? nSpanLength : 12 ) )
  50. return FALSE;
  51. m_rgnArrowRegion.CombineRgn( rgnFirstArrow, rgnSecondArrow, RGN_OR );
  52. SetWindowRgn( m_rgnArrowRegion, FALSE );
  53. return TRUE;
  54. }
  55. BOOL Show( CPoint point )
  56. {
  57. return IsWindow() ? SetWindowPos( NULL, m_bVertical ? point.x - 7 : point.x - ( m_nSpanLength / 2 ), m_bVertical ? point.y - ( m_nSpanLength / 2 ) : point.y - 5, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE ) : FALSE;
  58. }
  59. BOOL Hide()
  60. {
  61. return IsWindow() ? ShowWindow( SW_HIDE ) : FALSE;
  62. }
  63. BEGIN_MSG_MAP_EX(CDropArrows)
  64. MSG_WM_DESTROY(OnDestroy)
  65. MSG_WM_ERASEBKGND(OnEraseBkgnd)
  66. END_MSG_MAP_EX()
  67. void OnDestroy()
  68. {
  69. m_bshArrowBrush.DeleteObject();
  70. m_rgnArrowRegion.DeleteObject();
  71. }
  72. BOOL OnEraseBkgnd( HDC dc ) 
  73. {
  74. CDCHandle dcErase( dc );
  75. dcErase.FillRect( CRect( 0, 0, m_bVertical ? 12 : m_nSpanLength, m_bVertical ? m_nSpanLength : 12 ), m_bshArrowBrush );
  76. return TRUE;
  77. }
  78. };