Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cScrollBar.h 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #pragma once
  2. #include "WindowLib/cWindow.h"
  3. class cScrollBar : public CWindow, private MouseEventsAbstractor< cScrollBar >, private ResizeEventAbstractor< cScrollBar >
  4. {
  5. public:
  6. cScrollBar()
  7. {
  8. m_pbBG.SetPosition(0, 0);
  9. m_pbBG.SetSize(GetWidth(), GetHeight());
  10. m_pbBG.SetPicture(0x060011D0);
  11. m_pbBG.SetVisible(true);
  12. m_pbBG.SetAnchorBottom(true);
  13. m_pbBG.SetAnchorRight(true);
  14. AddChild(m_pbBG);
  15. m_pbLess.SetVisible(true);
  16. m_pbLess.SetPicture(0x060012B2);
  17. m_pbBG.AddChild(m_pbLess);
  18. m_pbMore.SetVisible(true);
  19. m_pbMore.SetPicture(0x060012B1);
  20. m_pbBG.AddChild(m_pbMore);
  21. m_pbBar.SetPicture(0x060011CE);
  22. m_pbBar.SetVisible(true);
  23. m_pbBG.AddChild(m_pbBar);
  24. m_fMin = 0.0f;
  25. m_fMax = 100.0f;
  26. m_fValue = 0.0f;
  27. m_fSmallStep = 1.0f;
  28. m_fBigStep = 10.0f;
  29. m_bMovingBar = false;
  30. SetHorizontal(false);
  31. AddMouseEventHandler( *(MouseEventsAbstractor< cScrollBar > *)this );
  32. AddResizeEventHandler( *(ResizeEventAbstractor< cScrollBar > *)this );
  33. m_pbBG.AddMouseEventHandler( *(MouseEventsAbstractor< cScrollBar > *)this );
  34. m_pbLess.AddMouseEventHandler( *(MouseEventsAbstractor< cScrollBar > *)this );
  35. m_pbMore.AddMouseEventHandler( *(MouseEventsAbstractor< cScrollBar > *)this );
  36. m_pbBar.AddMouseEventHandler( *(MouseEventsAbstractor< cScrollBar > *)this );
  37. }
  38. ~cScrollBar()
  39. {
  40. m_pbBG.RemoveChild(m_pbLess);
  41. m_pbBG.RemoveChild(m_pbMore);
  42. m_pbBG.RemoveChild(m_pbBar);
  43. RemoveChild(m_pbBG);
  44. }
  45. void SetMin(float Min)
  46. {
  47. m_fMin = Min;
  48. if (m_fMin > m_fMax)
  49. m_fMin = m_fMax;
  50. if (m_fValue < m_fMin)
  51. m_fValue = m_fMin;
  52. UpdatePositions();
  53. }
  54. float GetMin()
  55. {
  56. return m_fMin;
  57. }
  58. void SetMax(float Max)
  59. {
  60. m_fMax = Max;
  61. if (m_fMax < m_fMin)
  62. m_fMax = m_fMin;
  63. if (m_fValue > m_fMax)
  64. m_fValue = m_fMax;
  65. UpdatePositions();
  66. }
  67. float GetMax()
  68. {
  69. return m_fMax;
  70. }
  71. void SetValue(float Value)
  72. {
  73. m_fValue = Value;
  74. UpdatePositions();
  75. }
  76. float GetValue() const
  77. {
  78. return m_fValue;
  79. }
  80. void SetSteps(float SmallStep, float BigStep)
  81. {
  82. m_fSmallStep = SmallStep;
  83. m_fBigStep = BigStep;
  84. }
  85. void SetHorizontal(bool Hor)
  86. {
  87. m_bHorizontal = Hor;
  88. if (m_bHorizontal)
  89. {
  90. if (GetWidth() < 48) SetWidth(48);
  91. m_pbLess.SetSize(16, GetHeight());
  92. m_pbLess.SetPosition(0, 0);
  93. m_pbLess.SetAnchorRight(false);
  94. m_pbLess.SetAnchorBottom(true);
  95. m_pbLess.SetRotNum(1);
  96. m_pbMore.SetSize(16, GetHeight());
  97. m_pbMore.SetPosition(GetWidth()-16, 0);
  98. m_pbMore.SetAnchorTop(true);
  99. m_pbMore.SetAnchorBottom(true);
  100. m_pbMore.SetAnchorLeft(false);
  101. m_pbMore.SetAnchorRight(true);
  102. m_pbMore.SetRotNum(1);
  103. m_pbBar.SetSize(16, GetHeight());
  104. m_pbBar.SetPosition(16, 0);
  105. m_pbBar.SetAnchorRight(false);
  106. m_pbBar.SetAnchorBottom(true);
  107. }
  108. else
  109. {
  110. if (GetHeight() < 48) SetHeight(48);
  111. m_pbLess.SetSize(GetWidth(), 16);
  112. m_pbLess.SetPosition(0, 0);
  113. m_pbLess.SetAnchorRight(true);
  114. m_pbLess.SetAnchorBottom(false);
  115. m_pbLess.SetRotNum(0);
  116. m_pbMore.SetSize(GetWidth(), 16);
  117. m_pbMore.SetPosition(0, GetHeight()-16);
  118. m_pbMore.SetAnchorTop(false);
  119. m_pbMore.SetAnchorBottom(true);
  120. m_pbMore.SetAnchorLeft(true);
  121. m_pbMore.SetAnchorRight(true);
  122. m_pbMore.SetRotNum(0);
  123. m_pbBar.SetSize(GetWidth(), 16);
  124. m_pbBar.SetPosition(0, 16);
  125. m_pbBar.SetAnchorRight(true);
  126. m_pbBar.SetAnchorBottom(false);
  127. }
  128. UpdatePositions();
  129. }
  130. private:
  131. bool ResizeEventAbstractor< cScrollBar >::OnResize( IWindow &Window, float NewWidth, float NewHeight )
  132. {
  133. return true;
  134. }
  135. bool ResizeEventAbstractor< cScrollBar >::OnResized( IWindow & Window )
  136. {
  137. UpdatePositions();
  138. return true;
  139. }
  140. bool MouseEventsAbstractor< cScrollBar >::OnMouseDown( IWindow &Window, float X, float Y, unsigned long Button )
  141. {
  142. if (&Window == &m_pbLess)
  143. {
  144. m_fValue -= m_fSmallStep;
  145. if (m_fValue < m_fMin)
  146. m_fValue = m_fMin;
  147. UpdatePositions();
  148. }
  149. if (&Window == &m_pbMore)
  150. {
  151. m_fValue += m_fSmallStep;
  152. if (m_fValue > m_fMax)
  153. m_fValue = m_fMax;
  154. UpdatePositions();
  155. }
  156. if (&Window == &m_pbBG)
  157. {
  158. if (
  159. ((!m_bHorizontal) && (Y <= m_pbBar.GetTop()))
  160. ||
  161. ((m_bHorizontal) && (X <= m_pbBar.GetLeft()))
  162. )
  163. {
  164. //Up
  165. m_fValue -= m_fBigStep;
  166. if (m_fValue < m_fMin)
  167. m_fValue = m_fMin;
  168. UpdatePositions();
  169. }
  170. else
  171. {
  172. //Down
  173. m_fValue += m_fBigStep;
  174. if (m_fValue > m_fMax)
  175. m_fValue = m_fMax;
  176. UpdatePositions();
  177. }
  178. }
  179. if (&Window == &m_pbBar)
  180. {
  181. m_bMovingBar = true;
  182. if (m_bHorizontal)
  183. m_fMovingBase = Window.GetAbsoluteLeft() + X - m_pbBar.GetLeft();
  184. else
  185. m_fMovingBase = Window.GetAbsoluteTop() + Y - m_pbBar.GetTop();
  186. }
  187. return true;
  188. }
  189. bool MouseEventsAbstractor< cScrollBar >::OnMouseMove( IWindow &Window, float X, float Y, unsigned long Button )
  190. {
  191. if (m_bMovingBar)
  192. {
  193. if( &Window == &m_pbBar )
  194. {
  195. if (m_bHorizontal)
  196. {
  197. float fNewPos = Window.GetAbsoluteLeft() + X - 16 - m_fMovingBase;
  198. if (fNewPos < 0)
  199. fNewPos = 0;
  200. if (fNewPos > GetWidth() - 48)
  201. fNewPos = GetWidth() - 48;
  202. float DistPoss = GetWidth()-48;
  203. m_fValue = (fNewPos/DistPoss)*(m_fMax-m_fMin)+m_fMin;
  204. }
  205. else
  206. {
  207. float fNewPos = Window.GetAbsoluteTop() + Y - 16 - m_fMovingBase;
  208. if (fNewPos < 0)
  209. fNewPos = 0;
  210. if (fNewPos > GetHeight() - 48)
  211. fNewPos = GetHeight() - 48;
  212. float DistPoss = GetHeight()-48;
  213. m_fValue = (fNewPos/DistPoss)*(m_fMax-m_fMin)+m_fMin;
  214. }
  215. UpdatePositions();
  216. }
  217. }
  218. return true;
  219. }
  220. bool MouseEventsAbstractor< cScrollBar >::OnMouseUp( IWindow & Window, float X, float Y, unsigned long Button )
  221. {
  222. m_bMovingBar = false;
  223. return true;
  224. }
  225. bool MouseEventsAbstractor< cScrollBar >::OnClick( IWindow &Window, float X, float Y, unsigned long Button )
  226. {
  227. return false;
  228. }
  229. bool MouseEventsAbstractor< cScrollBar >::OnDoubleClick( IWindow &Window, float X, float Y, unsigned long Button )
  230. {
  231. return false;
  232. }
  233. bool MouseEventsAbstractor< cScrollBar >::OnMouseWheel( IWindow &Window, float X, float Y, unsigned long Button )
  234. {
  235. return false;
  236. }
  237. bool MouseEventsAbstractor< cScrollBar >::OnMouseEnter( IWindow &Window, float X, float Y, unsigned long Button )
  238. {
  239. return false;
  240. }
  241. bool MouseEventsAbstractor< cScrollBar >::OnMouseExit( IWindow &Window, float X, float Y, unsigned long Button )
  242. {
  243. return false;
  244. }
  245. private:
  246. void UpdatePositions()
  247. {
  248. if (m_bHorizontal)
  249. {
  250. float DistPoss = GetWidth()-48;
  251. if (DistPoss <= 0)
  252. {
  253. m_pbBar.SetPosition(16,0);
  254. return;
  255. }
  256. float NewPos = ((m_fValue-m_fMin)/(m_fMax-m_fMin))*DistPoss;
  257. if (m_fMax - m_fMin <= 0) NewPos = 0;
  258. m_pbBar.SetPosition(16+NewPos, 0);
  259. }
  260. else
  261. {
  262. float DistPoss = GetHeight()-48;
  263. if (DistPoss <= 0)
  264. {
  265. m_pbBar.SetPosition(0,16);
  266. return;
  267. }
  268. float NewPos = ((m_fValue-m_fMin)/(m_fMax-m_fMin))*DistPoss;
  269. if (m_fMax - m_fMin <= 0) NewPos = 0;
  270. m_pbBar.SetPosition(0, 16+NewPos);
  271. }
  272. }
  273. cPictureBox m_pbLess, m_pbMore, m_pbBG, m_pbBar;
  274. float m_fMin, m_fMax, m_fValue, m_fSmallStep, m_fBigStep;
  275. bool m_bMovingBar;
  276. float m_fMovingBase;
  277. bool m_bHorizontal;
  278. };