Advertisement
Guest User

QTS no. 21 - Primitive slider drawing class

a guest
Aug 16th, 2010
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.83 KB | None | 0 0
  1. /*
  2. -----------------------------------------
  3. * Game hacking QTS ( Quickie Tip Series )
  4. * no. 21 - Primitive slider drawing class
  5. -----------------------------------------
  6. * Author: SEGnosis  - GHAnon.net
  7. * Thanks to:
  8. * bitterbanana      - No known site
  9. * Drunken Cheetah   - No known site
  10. * fatboy88      - No known site
  11. * Geek4Ever         - No known site
  12. * learn_more        - www.uc-forum.com
  13. * Novocaine         - http://ilsken.net/blog/?page_id=64
  14. * Philly0494        - No known site
  15. * Roverturbo        - www.uc-forum.com
  16. * SilentKarma       - www.halocoders.com - offline
  17. * Strife        - www.uc-forum.com
  18. * Wieter20      - No known site
  19. */
  20.  
  21.  
  22. #ifndef H_SLIDER
  23. #define H_SLIDER
  24.  
  25.  
  26. //----------------------------------//
  27.  
  28.  
  29. #define NEG_SLIDER ( ULONG_MAX )
  30.  
  31. struct S_Slider
  32. {
  33.     RECT rtBar,
  34.          rtSlider,
  35.          rtLeftButton,
  36.          rtRightButton;
  37.  
  38.     DWORD dwMin,
  39.           dwMax,
  40.           dwWidth;
  41.  
  42.     bool bVisible;
  43. };
  44.  
  45.  
  46. //----------------------------------//
  47.  
  48.  
  49. class C_Slider
  50. {
  51.     public:
  52.         C_Slider();
  53.         ~C_Slider();
  54.  
  55.         void AllocSliderItem(); // allocate new S_Slider structures
  56.         void AppendSlider( int x, int y, DWORD dwWidth, DWORD dwHeight ); // fill the info for the new item
  57.  
  58.  
  59.         void DrawCursor();
  60.         void DrawSliders();
  61.  
  62.  
  63.         void Input();
  64.  
  65.  
  66.         __forceinline bool IsTargetValid( DWORD dwTarget )
  67.         {
  68.             if( dwTarget == NEG_SLIDER )
  69.                 return false;
  70.  
  71.             return true;
  72.         }
  73.  
  74.  
  75.     private:
  76.         void GetCursor()
  77.         {
  78.             GetCursorPos( &m_ptCursor );
  79.             ScreenToClient( GetFocus(), &m_ptCursor );
  80.         }
  81.  
  82.  
  83.         S_Slider* m_pSlider;
  84.  
  85.         DWORD m_dwSliderItemAmount;
  86.  
  87.         POINT m_ptCursor;
  88. }CSlider;
  89.  
  90.  
  91. //----------------------------------//
  92.  
  93.  
  94. C_Slider::C_Slider()
  95. {
  96.     m_pSlider = 0;
  97.     m_dwSliderItemAmount = 0;
  98. }
  99.  
  100. C_Slider::~C_Slider()
  101. {
  102.  
  103. }
  104.  
  105.  
  106. //----------------------------------//
  107.  
  108.  
  109. void C_Slider::AllocSliderItem()
  110. {
  111.     if( m_pSlider == 0 )
  112.         m_pSlider = new S_Slider; // if null just add one
  113.     else
  114.     {
  115.         S_Slider* siTemp = new S_Slider[ m_dwSliderItemAmount + 1 ]; // allocate new memory with current size + 1 slot
  116.         memcpy( siTemp, m_pSlider, sizeof( S_Slider ) *m_dwSliderItemAmount ); // move original data into newly allocated structure
  117.        
  118.         delete[] m_pSlider; // clear old data
  119.        
  120.         m_pSlider = siTemp; // pass new data
  121.        
  122.         ZeroMemory( &m_pSlider[ m_dwSliderItemAmount ], sizeof( S_Slider ) ); // clear new data slot
  123.     }
  124. }
  125.  
  126. void C_Slider::AppendSlider( int x, int y, DWORD dwWidth, DWORD dwHeight )
  127. {
  128.     AllocSliderItem(); // allocate new item to use
  129.  
  130.     m_pSlider[ m_dwSliderItemAmount ].bVisible = true;
  131.  
  132.     SetRect( &m_pSlider[ m_dwSliderItemAmount ].rtLeftButton, x, y, 10, dwHeight );
  133.  
  134.     SetRect(    &m_pSlider[ m_dwSliderItemAmount ].rtBar,
  135.                 m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.left + m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.right,
  136.                 y,
  137.                 dwWidth - m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.right,
  138.                 dwHeight );
  139.  
  140.     SetRect(    &m_pSlider[ m_dwSliderItemAmount ].rtRightButton,
  141.                 m_pSlider[ m_dwSliderItemAmount ].rtBar.left + m_pSlider[ m_dwSliderItemAmount ].rtBar.right,
  142.                 y,
  143.                 10,
  144.                 dwHeight );
  145.  
  146.     SetRect(    &m_pSlider[ m_dwSliderItemAmount ].rtSlider,
  147.                 m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.left + m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.right,
  148.                 y,
  149.                 10,
  150.                 dwHeight );
  151.  
  152.     m_pSlider[ m_dwSliderItemAmount ].dwWidth = dwWidth;
  153.     m_pSlider[ m_dwSliderItemAmount ].dwMin = m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.left + m_pSlider[ m_dwSliderItemAmount ].rtLeftButton.right;
  154.     m_pSlider[ m_dwSliderItemAmount ].dwMax = m_pSlider[ m_dwSliderItemAmount ].rtRightButton.left - m_pSlider[ m_dwSliderItemAmount ].rtSlider.right;
  155.  
  156.  
  157.     m_dwSliderItemAmount++;
  158.    
  159. }
  160.  
  161.  
  162. //----------------------------------//
  163.  
  164.  
  165. void C_Slider::DrawCursor()
  166. {
  167.     POINT pt;
  168.     GetCursorPos( &pt );
  169.     ScreenToClient( g_hWnd, &pt );
  170.  
  171.     CDraw.Line( pt.x, pt.y, pt.x, pt.y + 4, 1, CDraw.m_coRed );
  172.     CDraw.Line( pt.x, pt.y, pt.x + 4, pt.y, 1, CDraw.m_coRed );
  173. }
  174.  
  175. void C_Slider::DrawSliders()
  176. {
  177.     for( int i = 0; i < m_dwSliderItemAmount; i++ )
  178.     {
  179.         CDraw.Rect( m_pSlider[ i ].rtLeftButton.left, // solid color rectangle
  180.                     m_pSlider[ i ].rtLeftButton.top,
  181.                     m_pSlider[ i ].rtLeftButton.right,
  182.                     m_pSlider[ i ].rtLeftButton.bottom,
  183.                     CDraw.m_coOrange );
  184.  
  185.         CDraw.Rect( m_pSlider[ i ].rtBar.left,
  186.                     m_pSlider[ i ].rtBar.top,
  187.                     m_pSlider[ i ].rtBar.right,
  188.                     m_pSlider[ i ].rtBar.bottom,
  189.                     CDraw.m_coOrange );
  190.  
  191.         CDraw.Rect( m_pSlider[ i ].rtRightButton.left,
  192.                     m_pSlider[ i ].rtRightButton.top,
  193.                     m_pSlider[ i ].rtRightButton.right,
  194.                     m_pSlider[ i ].rtRightButton.bottom,
  195.                     CDraw.m_coOrange );
  196.  
  197.         CDraw.Rect( m_pSlider[ i ].rtSlider.left,
  198.                     m_pSlider[ i ].rtSlider.top,
  199.                     m_pSlider[ i ].rtSlider.right,
  200.                     m_pSlider[ i ].rtSlider.bottom,
  201.                     CDraw.m_coGreen );
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.         CDraw.LineRect( m_pSlider[ i ].rtLeftButton.left,// rectangle outline
  209.                     m_pSlider[ i ].rtLeftButton.top,
  210.                     m_pSlider[ i ].rtLeftButton.right,
  211.                     m_pSlider[ i ].rtLeftButton.bottom,
  212.                     CDraw.m_coBlack );
  213.  
  214.         CDraw.LineRect( m_pSlider[ i ].rtBar.left,
  215.                     m_pSlider[ i ].rtBar.top,
  216.                     m_pSlider[ i ].rtBar.right,
  217.                     m_pSlider[ i ].rtBar.bottom,
  218.                     CDraw.m_coBlack );
  219.  
  220.         CDraw.LineRect( m_pSlider[ i ].rtRightButton.left,
  221.                     m_pSlider[ i ].rtRightButton.top,
  222.                     m_pSlider[ i ].rtRightButton.right,
  223.                     m_pSlider[ i ].rtRightButton.bottom,
  224.                     CDraw.m_coBlack );
  225.  
  226.         CDraw.LineRect( m_pSlider[ i ].rtSlider.left,
  227.                     m_pSlider[ i ].rtSlider.top,
  228.                     m_pSlider[ i ].rtSlider.right,
  229.                     m_pSlider[ i ].rtSlider.bottom,
  230.                     CDraw.m_coBlack );
  231.  
  232.         // calculate percentage
  233.         float fCurrent = ( m_pSlider[ i ].rtSlider.left - m_pSlider[ i ].rtBar.left ) + 0.000001f;//m_pSlider[ i ].rtBar.left - m_pSlider[ i ].rtSlider.right
  234.         float fMax = ( m_pSlider[ i ].rtBar.right - m_pSlider[ i ].rtSlider.right );
  235.         float fPercentage = ( fCurrent / fMax ) * 100.0f;
  236.  
  237.  
  238.         // display percent
  239.         CDraw.String( m_pSlider[ i ].rtRightButton.left + m_pSlider[ i ].rtRightButton.right + 5, m_pSlider[ i ].rtLeftButton.top, CDraw.m_coGreen, FF_DEFAULT, "%d,%.0f%%",
  240.             m_pSlider[ i ].rtSlider.left - m_pSlider[ i ].rtBar.left,
  241.             fPercentage );
  242.     }
  243. }
  244.  
  245.  
  246. //----------------------------------//
  247.  
  248.  
  249. void C_Slider::Input()
  250. {
  251.     static DWORD dwTargetSlider = NEG_SLIDER;
  252.  
  253.     DWORD dwLButtonState = GetAsyncKeyState( VK_LBUTTON );
  254.  
  255.  
  256.     if( !dwLButtonState )
  257.         dwTargetSlider = NEG_SLIDER;
  258.  
  259.  
  260.     if( dwLButtonState && !IsTargetValid( dwTargetSlider ) )
  261.     {
  262.         GetCursor();
  263.  
  264.         if( dwLButtonState&1 )
  265.             for( int i = 0; i < m_dwSliderItemAmount; i++ )
  266.                 if( m_pSlider[ i ].bVisible )
  267.                 {
  268.                     if( CDraw.IsPointInRect( m_ptCursor, m_pSlider[ i ].rtLeftButton, true ) )
  269.                     {
  270.                         m_pSlider[ i ].rtSlider.left = max( m_pSlider[ i ].dwMin, m_pSlider[ i ].rtSlider.left - 1 );
  271.                         break;
  272.                     }
  273.                     else if( CDraw.IsPointInRect( m_ptCursor, m_pSlider[ i ].rtRightButton, true ) )
  274.                     {
  275.                         m_pSlider[ i ].rtSlider.left = min( m_pSlider[ i ].dwMax, m_pSlider[ i ].rtSlider.left + 1 );
  276.                         break;
  277.                     }
  278.  
  279.                     if( CDraw.IsPointInRect( m_ptCursor, m_pSlider[ i ].rtBar, true ) )
  280.                     {
  281.                         dwTargetSlider = i;
  282.                         break;
  283.                     }
  284.                 }
  285.     }
  286.  
  287.     if( IsTargetValid( dwTargetSlider ) )
  288.     {
  289.         GetCursor();
  290.  
  291.         m_pSlider[ dwTargetSlider ].rtSlider.left = m_ptCursor.x - m_pSlider[ dwTargetSlider ].rtSlider.right/2;
  292.  
  293.         while( m_pSlider[ dwTargetSlider ].rtSlider.left < m_pSlider[ dwTargetSlider ].dwMin )
  294.             m_pSlider[ dwTargetSlider ].rtSlider.left++;
  295.  
  296.         while( m_pSlider[ dwTargetSlider ].rtSlider.left > m_pSlider[ dwTargetSlider ].dwMax )
  297.             m_pSlider[ dwTargetSlider ].rtSlider.left--;
  298.     }
  299. }
  300.  
  301.  
  302. //----------------------------------//
  303.  
  304.  
  305. #endif
  306.  
  307.  
  308.  
  309. How to use
  310.  
  311. // Do not append sliders without stop
  312.     CSlider.AppendSlider( 10, 10, 100, 10 );
  313.  
  314. // Drawing sliders
  315.     CSlider.DrawSliders();
  316.  
  317. // Drawing line cursor
  318.     CSlider.DrawCursor();
  319.  
  320. // Control sliders
  321.     CSlider.Input();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement