Scroll.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include "Scroll.h"
  2. #include "Bild.h"
  3. #include "MausEreignis.h"
  4. using namespace Framework;
  5. // Inhalt der VScrollBar Klasse aus Scroll.h
  6. // Konstruktor
  7. VScrollBar::VScrollBar()
  8. : data(new VScrollData()),
  9. knopfdruck( 0 ),
  10. farbe( 0xFF808080),
  11. bgFarbe( 0xFF000000 ),
  12. bg( 0 ),
  13. klickScroll( 10 ),
  14. mx( -1 ),
  15. my( -1 ),
  16. mp( 0 ),
  17. rend( 0 ),
  18. ref( 1 )
  19. {
  20. }
  21. // Destruktor
  22. VScrollBar::~VScrollBar()
  23. {
  24. delete data;
  25. }
  26. // nicht constant
  27. void VScrollBar::setFarbe( int fc )
  28. {
  29. farbe = fc;
  30. rend = 1;
  31. }
  32. void VScrollBar::setBgFarbe( int fc, bool bgF )
  33. {
  34. bgFarbe = fc;
  35. bg = bgF;
  36. rend = 1;
  37. }
  38. void VScrollBar::update( int maxHöhe, int anzeigeHöhe )
  39. {
  40. if( data->maxHöhe != maxHöhe || data->anzeigeHöhe != anzeigeHöhe )
  41. {
  42. data->maxHöhe = maxHöhe, data->anzeigeHöhe = anzeigeHöhe;
  43. rend = 1;
  44. }
  45. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe && data->maxHöhe - data->anzeigeHöhe >= 0 )
  46. {
  47. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  48. rend = 1;
  49. }
  50. if( data->anzeigeBeginn < 0 )
  51. {
  52. data->anzeigeBeginn = 0;
  53. rend = 1;
  54. }
  55. }
  56. void VScrollBar::setKlickScroll( int ks )
  57. {
  58. klickScroll = ks;
  59. rend = 1;
  60. }
  61. void VScrollBar::scroll( int höhe )
  62. {
  63. data->anzeigeBeginn = höhe;
  64. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  65. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  66. if( data->anzeigeBeginn < 0 )
  67. data->anzeigeBeginn = 0;
  68. rend = 1;
  69. }
  70. bool VScrollBar::doMausMessage( int x, int y, int br, int hö, MausEreignis &me )
  71. {
  72. bool ret = me.mx >= x && me.mx <= x + br && me.my >= y && me.my <= y + hö;
  73. knopfdruck = 0;
  74. if( me.verarbeitet )
  75. {
  76. mx = -1, my = -1;
  77. mp = 0;
  78. return ret;
  79. }
  80. if( me.id == ME_UScroll )
  81. {
  82. data->anzeigeBeginn -= klickScroll;
  83. if( data->anzeigeBeginn < 0 )
  84. data->anzeigeBeginn = 0;
  85. rend = 1;
  86. return ret;
  87. }
  88. if( me.id == ME_DScroll )
  89. {
  90. data->anzeigeBeginn += klickScroll;
  91. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  92. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  93. if( data->anzeigeBeginn < 0 )
  94. data->anzeigeBeginn = 0;
  95. rend = 1;
  96. return ret;
  97. }
  98. if( ret )
  99. mx = me.mx - x, my = me.my - y;
  100. else
  101. mx = -1, my = -1;
  102. if( me.id == ME_PLinks )
  103. mp = 1;
  104. if( me.id == ME_RLinks )
  105. mp = 0;
  106. if( mp )
  107. {
  108. if( mx >= 0 && my >= 0 )
  109. {
  110. if( my < br )
  111. {
  112. knopfdruck = 1;
  113. data->anzeigeBeginn -= klickScroll;
  114. }
  115. else if( my > hö - br )
  116. {
  117. knopfdruck = 2;
  118. data->anzeigeBeginn += klickScroll;
  119. }
  120. else
  121. data->anzeigeBeginn = (int)( ( data->maxHöhe / ( hö - 2.0 * br ) ) * ( my - br ) ) - data->anzeigeHöhe / 2;
  122. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  123. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  124. if( data->anzeigeBeginn < 0 )
  125. data->anzeigeBeginn = 0;
  126. rend = 1;
  127. }
  128. }
  129. return ret;
  130. }
  131. bool VScrollBar::getRend()
  132. {
  133. if( knopfdruck == 1 )
  134. {
  135. int tmp = data->anzeigeBeginn;
  136. data->anzeigeBeginn -= klickScroll;
  137. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  138. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  139. if( data->anzeigeBeginn < 0 )
  140. data->anzeigeBeginn = 0;
  141. if( tmp != data->anzeigeBeginn )
  142. rend = 1;
  143. }
  144. if( knopfdruck == 2 )
  145. {
  146. int tmp = data->anzeigeBeginn;
  147. data->anzeigeBeginn += klickScroll;
  148. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  149. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  150. if( data->anzeigeBeginn < 0 )
  151. data->anzeigeBeginn = 0;
  152. if( tmp != data->anzeigeBeginn )
  153. rend = 1;
  154. }
  155. bool ret = rend;
  156. rend = 0;
  157. return ret;
  158. }
  159. // const
  160. void VScrollBar::render( int x, int y, int br, int hö, Bild &zRObj ) const
  161. {
  162. if( bg )
  163. zRObj.alphaRegion( x, y, br, hö, bgFarbe );
  164. --br;
  165. --hö;
  166. zRObj.drawLinieH( x, y, br + 1, farbe );
  167. zRObj.drawLinieH( x, y + hö, br + 1, farbe );
  168. zRObj.drawLinieV( x, y + 1, hö - 1, farbe );
  169. zRObj.drawLinieV( x + br, y + 1, hö - 1, farbe );
  170. zRObj.drawLinieH( x + 1, y + br, br - 1, farbe );
  171. zRObj.drawLinieH( x + 1, y + hö - br, br - 1, farbe );
  172. ++br;
  173. ++hö;
  174. int st = (int)( data->anzeigeBeginn / ( data->maxHöhe / ( hö - br * 2.0 ) ) );
  175. int end = (int)( ( hö - 2.0 * br ) / ( (double)data->maxHöhe / data->anzeigeHöhe ) );
  176. if( data->anzeigeBeginn > data->maxHöhe - data->anzeigeHöhe )
  177. data->anzeigeBeginn = data->maxHöhe - data->anzeigeHöhe;
  178. if( data->anzeigeBeginn < 0 )
  179. {
  180. data->anzeigeBeginn = 0;
  181. end = hö - br * 2;
  182. }
  183. zRObj.füllRegion( x + 1, y + br + st, br - 1, end, farbe );
  184. }
  185. VScrollData *VScrollBar::getScrollData() const
  186. {
  187. return data;
  188. }
  189. int VScrollBar::getKlickScroll() const
  190. {
  191. return klickScroll;
  192. }
  193. int VScrollBar::getFarbe() const
  194. {
  195. return farbe;
  196. }
  197. int VScrollBar::getBgFarbe() const
  198. {
  199. return bg ? bgFarbe : 0;
  200. }
  201. int VScrollBar::getScroll() const
  202. {
  203. return data->anzeigeBeginn;
  204. }
  205. // Reference Counting
  206. VScrollBar *VScrollBar::getThis()
  207. {
  208. ++ref;
  209. return this;
  210. }
  211. VScrollBar *VScrollBar::release()
  212. {
  213. --ref;
  214. if( ref == 0 )
  215. delete this;
  216. return 0;
  217. }
  218. // Inhalt der HScrollBar Klasse aus Scroll.h
  219. // Konstruktor
  220. HScrollBar::HScrollBar()
  221. : data( new HScrollData() ),
  222. knopfdruck( 0 ),
  223. farbe( 0xFF808080),
  224. bgFarbe( 0 ),
  225. bg( 0 ),
  226. klickScroll( 10 ),
  227. mx( -1 ),
  228. my( -1 ),
  229. mp( 0 ),
  230. rend( 0 ),
  231. ref( 1 )
  232. {
  233. }
  234. // Destruktor
  235. HScrollBar::~HScrollBar()
  236. {
  237. delete data;
  238. }
  239. // nicht constant
  240. void HScrollBar::setFarbe( int fc )
  241. {
  242. farbe = fc;
  243. rend = 1;
  244. }
  245. void HScrollBar::setBgFarbe( int fc, bool bgF )
  246. {
  247. bgFarbe = fc;
  248. bg = bgF;
  249. rend = 1;
  250. }
  251. void HScrollBar::update( int maxBreite, int anzeigeBreite )
  252. {
  253. if( data->maxBreite != maxBreite || data->anzeigeBreite != anzeigeBreite )
  254. {
  255. data->maxBreite = maxBreite, data->anzeigeBreite = anzeigeBreite;
  256. rend = 1;
  257. }
  258. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite && data->maxBreite - data->anzeigeBreite >= 0 )
  259. {
  260. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  261. rend = 1;
  262. }
  263. if( data->anzeigeBeginn < 0 )
  264. {
  265. data->anzeigeBeginn = 0;
  266. rend = 1;
  267. }
  268. }
  269. void HScrollBar::setKlickScroll( int ks )
  270. {
  271. klickScroll = ks;
  272. rend = 1;
  273. }
  274. void HScrollBar::scroll( int breite )
  275. {
  276. data->anzeigeBeginn = breite;
  277. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  278. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  279. if( data->anzeigeBeginn < 0 )
  280. data->anzeigeBeginn = 0;
  281. rend = 1;
  282. }
  283. bool HScrollBar::doMausMessage( int x, int y, int br, int hö, MausEreignis &me )
  284. {
  285. bool ret = me.mx >= x && me.mx <= x + br && me.my >= y && me.my <= y + hö;
  286. knopfdruck = 0;
  287. if( me.verarbeitet )
  288. {
  289. mx = -1, my = -1;
  290. mp = 0;
  291. return ret;
  292. }
  293. if( me.id == ME_LScroll )
  294. {
  295. data->anzeigeBeginn -= klickScroll;
  296. if( data->anzeigeBeginn < 0 )
  297. data->anzeigeBeginn = 0;
  298. rend = 1;
  299. return ret;
  300. }
  301. if( me.id == ME_RScroll )
  302. {
  303. data->anzeigeBeginn += klickScroll;
  304. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  305. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  306. if( data->anzeigeBeginn < 0 )
  307. data->anzeigeBeginn = 0;
  308. rend = 1;
  309. return ret;
  310. }
  311. if( ret )
  312. mx = me.mx - x, my = me.my - y;
  313. else
  314. mx = -1, my = -1;
  315. if( me.id == ME_PLinks )
  316. mp = 1;
  317. if( me.id == ME_RLinks )
  318. mp = 0;
  319. if( mp )
  320. {
  321. if( mx >= 0 && my >= 0 )
  322. {
  323. if( mx < hö )
  324. {
  325. knopfdruck = 1;
  326. data->anzeigeBeginn -= klickScroll;
  327. }
  328. else if( mx > br - hö )
  329. {
  330. knopfdruck = 2;
  331. data->anzeigeBeginn += klickScroll;
  332. }
  333. else
  334. data->anzeigeBeginn = (int)( ( data->maxBreite / ( br - 2.0 * hö ) ) * ( mx - hö ) ) - data->anzeigeBreite / 2;
  335. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  336. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  337. if( data->anzeigeBeginn < 0 )
  338. data->anzeigeBeginn = 0;
  339. rend = 1;
  340. }
  341. }
  342. return ret;
  343. }
  344. bool HScrollBar::getRend()
  345. {
  346. if( knopfdruck == 1 )
  347. {
  348. int tmp = data->anzeigeBeginn;
  349. data->anzeigeBeginn -= klickScroll;
  350. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  351. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  352. if( data->anzeigeBeginn < 0 )
  353. data->anzeigeBeginn = 0;
  354. if( tmp != data->anzeigeBeginn )
  355. rend = 1;
  356. }
  357. if( knopfdruck == 2 )
  358. {
  359. int tmp = data->anzeigeBeginn;
  360. data->anzeigeBeginn += klickScroll;
  361. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  362. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  363. if( data->anzeigeBeginn < 0 )
  364. data->anzeigeBeginn = 0;
  365. if( tmp != data->anzeigeBeginn )
  366. rend = 1;
  367. }
  368. bool ret = rend;
  369. rend = 0;
  370. return ret;
  371. }
  372. // const
  373. void HScrollBar::render( int x, int y, int br, int hö, Bild &zRObj ) const
  374. {
  375. if( bg )
  376. zRObj.alphaRegion( x, y, br, hö, bgFarbe );
  377. --br;
  378. --hö;
  379. zRObj.drawLinieV( x, y, hö + 1, farbe );
  380. zRObj.drawLinieV( x + br, y, hö + 1, farbe );
  381. zRObj.drawLinieH( x + 1, y, br - 1, farbe );
  382. zRObj.drawLinieH( x + 1, y + hö, br - 1, farbe );
  383. zRObj.drawLinieV( x + hö, y + 1, hö - 1, farbe );
  384. zRObj.drawLinieV( x + br - hö, y + 1, hö - 1, farbe );
  385. ++br;
  386. ++hö;
  387. int st = (int)( data->anzeigeBeginn / ( data->maxBreite / ( br - hö * 2.0 ) ) );
  388. int end = (int)( ( br - 2.0 * hö ) / ( (double)data->maxBreite / data->anzeigeBreite ) );
  389. if( data->anzeigeBeginn > data->maxBreite - data->anzeigeBreite )
  390. data->anzeigeBeginn = data->maxBreite - data->anzeigeBreite;
  391. if( data->anzeigeBeginn < 0 )
  392. {
  393. data->anzeigeBeginn = 0;
  394. end = br - hö * 2;
  395. }
  396. zRObj.füllRegion( x + hö + st, y + 1, end, hö - 1, farbe );
  397. }
  398. HScrollData *HScrollBar::getScrollData() const
  399. {
  400. return data;
  401. }
  402. int HScrollBar::getKlickScroll() const
  403. {
  404. return klickScroll;
  405. }
  406. int HScrollBar::getFarbe() const
  407. {
  408. return farbe;
  409. }
  410. int HScrollBar::getBgFarbe() const
  411. {
  412. return bg ? bgFarbe : 0;
  413. }
  414. int HScrollBar::getScroll() const
  415. {
  416. return data->anzeigeBeginn;
  417. }
  418. // Reference Counting
  419. HScrollBar *HScrollBar::getThis()
  420. {
  421. ++ref;
  422. return this;
  423. }
  424. HScrollBar *HScrollBar::release()
  425. {
  426. --ref;
  427. if( ref == 0 )
  428. delete this;
  429. return 0;
  430. }