Zeichnung.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. #include "Zeichnung.h"
  2. #include "AlphaFeld.h"
  3. #include "Bild.h"
  4. #include "Bildschirm.h"
  5. #include "Globals.h"
  6. #include "MausEreignis.h"
  7. #include "Rahmen.h"
  8. #include "Schrift.h"
  9. #include "Scroll.h"
  10. #include "TastaturEreignis.h"
  11. #include "Text.h"
  12. #include "TextFeld.h"
  13. #include "ToolTip.h"
  14. #include "UIInitialization.h"
  15. #ifdef WIN32
  16. # include <Windows.h>
  17. #endif
  18. using namespace Framework;
  19. // Inhalt der Zeichnung Klasse aus Zeichnung.h
  20. // Konstruktor
  21. Zeichnung::Zeichnung()
  22. : ReferenceCounter(),
  23. pos(0, 0),
  24. gr(0, 0),
  25. makParam(0),
  26. takParam(0),
  27. mak(0),
  28. tak(0),
  29. nmakParam(0),
  30. ntakParam(0),
  31. nMak(0),
  32. nTak(0),
  33. mausIn(0),
  34. toolTip(0),
  35. style(0),
  36. rend(0),
  37. onNeedToolTip(0),
  38. toolTipRequested(0)
  39. {}
  40. // Destruktor
  41. Zeichnung::~Zeichnung()
  42. {
  43. if (toolTip) toolTip->release();
  44. }
  45. void Zeichnung::doMausEreignis(MausEreignis& me, bool userRet)
  46. {
  47. me.verarbeitet = userRet;
  48. }
  49. // Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom
  50. // Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
  51. void Zeichnung::postAction(std::function<void()> action)
  52. {
  53. actions.push(action);
  54. }
  55. // nicht constant
  56. void Zeichnung::setRender()
  57. {
  58. rend = 1;
  59. }
  60. void Zeichnung::setToolTipText(
  61. const char* txt, Bildschirm* zScreen, Schrift* zSchrift)
  62. {
  63. if (!txt)
  64. toolTip = (ToolTip*)toolTip->release();
  65. else
  66. {
  67. if (!toolTip)
  68. {
  69. toolTip = new ToolTip(zScreen);
  70. toolTip->addStyle(ZeichnungHintergrund::Style::Hintergrund
  71. | ZeichnungHintergrund::Style::HAlpha
  72. | ZeichnungHintergrund::Style::Rahmen
  73. | ZeichnungHintergrund::Style::Sichtbar);
  74. toolTip->setHintergrundFarbe(0xA0000000);
  75. toolTip->setRahmenFarbe(0xFFFFFFFF);
  76. toolTip->setRahmenBreite(1);
  77. if (mausIn && toolTip) toolTip->setMausIn(1);
  78. }
  79. UIInit init = defaultUI(zSchrift, zScreen);
  80. TextFeld* t = init.createTextFeld(init.initParam);
  81. t->setText(txt);
  82. t->setSize(t->zTextRenderer()->getTextBreite(txt),
  83. t->zTextRenderer()->getTextHeight(txt));
  84. toolTip->addMember(t);
  85. }
  86. toolTipRequested = 0;
  87. }
  88. // setzt eine Funktion, die beim erstmaligen gebrauch des tooltips einen tooltip
  89. // erstellt, falls es noch keinen gibt
  90. // initToolTip: die Funktion
  91. void Zeichnung::setNeedToolTipEvent(
  92. std::function<bool(Zeichnung*, Punkt localPos)> onNeedToolTip)
  93. {
  94. this->onNeedToolTip = onNeedToolTip;
  95. }
  96. // legt den tooltip fest
  97. // tt: der tooltip
  98. void Zeichnung::setToolTipZ(ToolTip* tt)
  99. {
  100. if (toolTip) toolTip->release();
  101. toolTip = tt;
  102. if (mausIn && toolTip) toolTip->setMausIn(1);
  103. toolTipRequested = 0;
  104. }
  105. void Zeichnung::lockZeichnung()
  106. {
  107. cs.lock();
  108. }
  109. void Zeichnung::unlockZeichnung()
  110. {
  111. cs.unlock();
  112. }
  113. void Zeichnung::setMausEreignisParameter(
  114. void* p) // setzt den Parameter vom Maus Ereignis
  115. {
  116. makParam = p;
  117. }
  118. void Zeichnung::setTastaturEreignisParameter(
  119. void* p) // setzt den Parameter vom Tastatur Ereignis
  120. {
  121. takParam = p;
  122. }
  123. void Zeichnung::setMausEreignis(MausAktion ak) // setzt das Maus Ereignis
  124. {
  125. mak = ak;
  126. }
  127. void Zeichnung::setTastaturEreignis(
  128. TastaturAktion ak) // setzt das TastaturEreignis
  129. {
  130. tak = ak;
  131. }
  132. void Zeichnung::setNMausEreignisParameter(
  133. void* p) // setzt den Parameter vom Maus Ereignis
  134. {
  135. nmakParam = p;
  136. }
  137. void Zeichnung::setNTastaturEreignisParameter(
  138. void* p) // setzt den Parameter vom Tastatur Ereignis
  139. {
  140. ntakParam = p;
  141. }
  142. void Zeichnung::setNMausEreignis(MausAktion ak) // setzt das Maus Ereignis
  143. {
  144. nMak = ak;
  145. }
  146. void Zeichnung::setNTastaturEreignis(
  147. TastaturAktion ak) // setzt das TastaturEreignis
  148. {
  149. nTak = ak;
  150. }
  151. void Zeichnung::doPublicMausEreignis(MausEreignis& me) // ruft Mak auf
  152. {
  153. bool lock = hatStyle(Style::MELockZeichnung);
  154. if (lock) lockZeichnung();
  155. bool inside = istPunktInnen(me.mx, me.my);
  156. if (!me.insideParent || me.verarbeitet || !inside)
  157. {
  158. if (mausIn)
  159. {
  160. mausIn = 0;
  161. if (toolTip) toolTip->setMausIn(0);
  162. MausEreignis me2;
  163. me2.id = ME_Leaves;
  164. me2.mx = me.mx - pos.x;
  165. me2.my = me.my - pos.y;
  166. me2.verarbeitet = 0;
  167. me2.insideParent = me.insideParent;
  168. bool userRet = mak && mak(makParam, this, me2);
  169. doMausEreignis(me2, userRet);
  170. }
  171. }
  172. if (!inside && me.id == ME_PLinks) removeStyle(Style::Fokus);
  173. if ((me.verarbeitet && hatStyleNicht(Style::MEIgnoreVerarbeitet))
  174. || (!inside && hatStyleNicht(Style::MEIgnoreInside))
  175. || (hatStyleNicht(Style::Sichtbar)
  176. && hatStyleNicht(Style::MEIgnoreSichtbar)))
  177. {
  178. if (lock) unlockZeichnung();
  179. return;
  180. }
  181. if (inside && me.id == ME_PLinks) addStyle(Style::Fokus);
  182. if (me.insideParent && !mausIn && me.id != ME_Leaves && inside
  183. && !me.verarbeitet && hatStyle(Style::Sichtbar))
  184. {
  185. mausIn = 1;
  186. if (toolTip)
  187. toolTip->setMausIn(1);
  188. else if (onNeedToolTip && !toolTipRequested)
  189. {
  190. toolTipRequested
  191. = onNeedToolTip(this, Punkt(me.mx - pos.x, me.my - pos.y));
  192. }
  193. MausEreignis me2;
  194. me2.id = ME_Betritt;
  195. me2.mx = me.mx - pos.x;
  196. me2.my = me.my - pos.y;
  197. me2.verarbeitet = 0;
  198. me2.insideParent = 1;
  199. bool userRet = mak && mak(makParam, this, me2);
  200. doMausEreignis(me2, userRet);
  201. }
  202. else if (me.insideParent && mausIn && me.id != ME_Leaves && inside
  203. && !me.verarbeitet && hatStyle(Style::Sichtbar) && !toolTip
  204. && onNeedToolTip && !toolTipRequested)
  205. {
  206. toolTipRequested
  207. = onNeedToolTip(this, Punkt(me.mx - pos.x, me.my - pos.y));
  208. }
  209. Punkt old = Punkt(me.mx, me.my);
  210. me.mx -= pos.x, me.my -= pos.y;
  211. if (me.insideParent || hatStyle(Style::MEIgnoreParentInside))
  212. {
  213. bool userRet = hatStyle(Style::Erlaubt)
  214. && (me.verarbeitet || !me.insideParent
  215. || (inside && mak && mak(makParam, this, me)));
  216. bool vera = me.verarbeitet;
  217. doMausEreignis(me, userRet);
  218. if (nMak && me.verarbeitet && !vera && hatStyle(Style::Erlaubt)
  219. && me.insideParent && inside)
  220. me.verarbeitet = nMak(nmakParam, this, me);
  221. }
  222. me.mx = old.x, me.my = old.y;
  223. if (lock) unlockZeichnung();
  224. }
  225. void Zeichnung::doTastaturEreignis(TastaturEreignis& te) // ruft Tak auf
  226. {
  227. if (te.verarbeitet) return;
  228. if (tak) te.verarbeitet |= tak(takParam, this, te);
  229. if (nTak && te.verarbeitet) te.verarbeitet = nTak(ntakParam, this, te);
  230. }
  231. void Zeichnung::setPosition(const Punkt& pos) // setzt die position
  232. {
  233. lockZeichnung();
  234. if (this->pos != pos) rend = 1;
  235. this->pos = pos;
  236. unlockZeichnung();
  237. }
  238. void Zeichnung::setX(int xPos)
  239. {
  240. lockZeichnung();
  241. if (pos.x != xPos)
  242. {
  243. rend = 1;
  244. pos.x = xPos;
  245. }
  246. unlockZeichnung();
  247. }
  248. void Zeichnung::setY(int yPos)
  249. {
  250. lockZeichnung();
  251. if (pos.y != yPos)
  252. {
  253. rend = 1;
  254. pos.y = yPos;
  255. }
  256. unlockZeichnung();
  257. }
  258. void Zeichnung::setSize(const Punkt& gr) // setzt die Größe
  259. {
  260. lockZeichnung();
  261. if (this->gr != gr) rend = 1;
  262. this->gr = gr;
  263. unlockZeichnung();
  264. }
  265. void Zeichnung::setPosition(int x, int y) // setzt die position
  266. {
  267. setPosition(Punkt(x, y));
  268. }
  269. void Zeichnung::setSize(int x, int y) // setzt die Größe
  270. {
  271. setSize(Punkt(x, y));
  272. }
  273. void Zeichnung::setWidth(int width)
  274. {
  275. lockZeichnung();
  276. if (this->gr.x != width) rend = 1;
  277. gr.x = width;
  278. unlockZeichnung();
  279. }
  280. void Zeichnung::setHeight(int height)
  281. {
  282. lockZeichnung();
  283. if (this->gr.y != height) rend = 1;
  284. gr.y = height;
  285. unlockZeichnung();
  286. }
  287. bool Zeichnung::tick(double tickval)
  288. {
  289. while (!actions.empty())
  290. {
  291. actions.front()();
  292. actions.pop();
  293. }
  294. bool r = rend;
  295. rend = 0;
  296. return r;
  297. }
  298. void Zeichnung::setStyle(__int64 style) // setzt den Style des Text Feldes
  299. {
  300. if (this->style != style)
  301. {
  302. this->style = style;
  303. rend = 1;
  304. }
  305. }
  306. void Zeichnung::setStyle(__int64 style, bool add_remove)
  307. {
  308. if (add_remove && (this->style | style) != this->style)
  309. {
  310. this->style |= style;
  311. rend = 1;
  312. }
  313. else if (!add_remove && (this->style & ~style) != this->style)
  314. {
  315. if (toolTip && (style | Style::Sichtbar) == style)
  316. toolTip->setMausIn(0);
  317. this->style &= ~style;
  318. rend = 1;
  319. }
  320. }
  321. void Zeichnung::addStyle(__int64 style)
  322. {
  323. if ((this->style | style) != this->style)
  324. {
  325. this->style |= style;
  326. rend = 1;
  327. }
  328. }
  329. void Zeichnung::removeStyle(__int64 style)
  330. {
  331. if ((this->style & ~style) != this->style)
  332. {
  333. if (toolTip && (style | Style::Sichtbar) == style)
  334. toolTip->setMausIn(0);
  335. this->style &= ~style;
  336. rend = 1;
  337. }
  338. }
  339. void Zeichnung::render(Bild& zRObj)
  340. {
  341. if (toolTip && (style | Style::Sichtbar) == style) toolTip->setZeichnen();
  342. }
  343. // constant
  344. bool Zeichnung::hatMausEreignis() const // prüft, ob Mak gesetzt ist
  345. {
  346. return mak != 0;
  347. }
  348. bool Zeichnung::hatTastaturEreignis() const // prüft, ob Tak gesetzt ist
  349. {
  350. return tak != 0;
  351. }
  352. const Punkt& Zeichnung::getPosition() const // gibt die Position zurück
  353. {
  354. return pos;
  355. }
  356. const Punkt& Zeichnung::getSize() const // gibt die Größe zurück
  357. {
  358. return gr;
  359. }
  360. int Zeichnung::getBreite() const // gibt die Breite zurück
  361. {
  362. return gr.x;
  363. }
  364. int Zeichnung::getHeight() const // gibt die Höhe zurück
  365. {
  366. return gr.y;
  367. }
  368. // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
  369. int Zeichnung::getInnenBreite() const
  370. {
  371. return gr.x;
  372. }
  373. // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
  374. int Zeichnung::getInnenHeight() const
  375. {
  376. return gr.y;
  377. }
  378. int Zeichnung::getX() const // gibt X zurück
  379. {
  380. return pos.x;
  381. }
  382. int Zeichnung::getY() const // gibt Y zurück
  383. {
  384. return pos.y;
  385. }
  386. // Prüft, ob ein Punkt in diesem Objekt liegt
  387. // p: der Punkt
  388. // return: 1, wenn der punkt innen ist, 0 sonst
  389. bool Zeichnung::istPunktInnen(Punkt p) const
  390. {
  391. return istPunktInnen(p.x, p.y);
  392. }
  393. // Prüft, ob ein Punkt in diesem Objekt liegt
  394. // x: die x koordinate des punktes
  395. // y: die y koordinate des punktes
  396. // return: 1, wenn der punkt innen ist, 0 sonst
  397. bool Zeichnung::istPunktInnen(int x, int y) const
  398. {
  399. return x >= pos.x && x <= pos.x + gr.x && y >= pos.y && y <= pos.y + gr.y;
  400. }
  401. ToolTip* Zeichnung::getToolTip() const // gibt den ToolTip Text
  402. {
  403. return dynamic_cast<ToolTip*>(toolTip->getThis());
  404. }
  405. ToolTip* Zeichnung::zToolTip() const
  406. {
  407. return toolTip;
  408. }
  409. bool Zeichnung::hatStyle(__int64 style) const // prüft, ob style vorhanden
  410. {
  411. return (this->style | style) == this->style;
  412. }
  413. bool Zeichnung::hatStyleNicht(
  414. __int64 style) const // prüft, ob style nicht vorhanden
  415. {
  416. return (this->style | style) != this->style;
  417. }
  418. Zeichnung* Zeichnung::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
  419. {
  420. Zeichnung* obj = new Zeichnung();
  421. obj->setPosition(pos);
  422. obj->setSize(gr);
  423. obj->setMausEreignisParameter(makParam);
  424. obj->setTastaturEreignisParameter(takParam);
  425. obj->setMausEreignis(mak);
  426. obj->setTastaturEreignis(tak);
  427. if (toolTip) obj->setToolTipZ((ToolTip*)toolTip->dublizieren());
  428. return obj;
  429. }
  430. // Inhalt der ZeichnungHintergrund Klasse aus Zeichnung.h
  431. // Konstruktor
  432. ZeichnungHintergrund::ZeichnungHintergrund()
  433. : Zeichnung()
  434. {
  435. hintergrundFarbe = 0xFF000000;
  436. rahmen = 0;
  437. hintergrundBild = 0;
  438. hintergrundFeld = 0;
  439. horizontalScrollBar = 0;
  440. vertikalScrollBar = 0;
  441. innenPosition.x = 0;
  442. innenPosition.y = 0;
  443. innenSize.x = 0;
  444. innenSize.y = 0;
  445. }
  446. // Destruktor
  447. ZeichnungHintergrund::~ZeichnungHintergrund()
  448. {
  449. if (rahmen) rahmen->release();
  450. if (hintergrundBild) hintergrundBild->release();
  451. if (hintergrundFeld) hintergrundFeld->release();
  452. if (horizontalScrollBar) horizontalScrollBar->release();
  453. if (vertikalScrollBar) vertikalScrollBar->release();
  454. }
  455. void ZeichnungHintergrund::setHintergrundBild(
  456. Bild* bild) // setzt das Hintergrund Bild
  457. {
  458. if (!hintergrundBild) hintergrundBild = new Bild();
  459. hintergrundBild->neuBild(bild->getBreite(), bild->getHeight(), 0);
  460. int* buff1 = hintergrundBild->getBuffer();
  461. int* buff2 = bild->getBuffer();
  462. for (int i = 0; i < bild->getBreite() * bild->getHeight(); ++i)
  463. buff1[i] = buff2[i];
  464. bild->release();
  465. rend = 1;
  466. }
  467. void ZeichnungHintergrund::setHintergrundBildZ(
  468. Bild* bild) // setzt einen Zeiger zum Hintergrund Bild
  469. {
  470. if (hintergrundBild != bild)
  471. {
  472. if (hintergrundBild) hintergrundBild->release();
  473. hintergrundBild = bild;
  474. rend = 1;
  475. }
  476. }
  477. void ZeichnungHintergrund::setHintergrundFarbe(
  478. int fc) // setzt die Hintergrundfarbe
  479. {
  480. if (hintergrundFarbe != fc)
  481. {
  482. hintergrundFarbe = fc;
  483. rend = 1;
  484. }
  485. }
  486. void ZeichnungHintergrund::setAlphaFeldZ(
  487. AlphaFeld* buff) // setzt einen Zeiger zum Hintergrund Buffer
  488. {
  489. if (hintergrundFeld != buff)
  490. {
  491. if (hintergrundFeld) hintergrundFeld->release();
  492. hintergrundFeld = buff;
  493. rend = 1;
  494. }
  495. }
  496. void ZeichnungHintergrund::setAlphaFeldStrength(
  497. int st) // setzt die Stärke des Hintergrund Buffers
  498. {
  499. if (!hintergrundFeld)
  500. {
  501. hintergrundFeld = new AlphaFeld();
  502. rend = 1;
  503. }
  504. if (hintergrundFeld->getStrength() != st)
  505. {
  506. hintergrundFeld->setStrength(st);
  507. rend = 1;
  508. }
  509. }
  510. void ZeichnungHintergrund::setAlphaFeldFarbe(
  511. int fc) // setzt die Farbe des Hintergrund Buffers
  512. {
  513. if (!hintergrundFeld)
  514. {
  515. hintergrundFeld = new AlphaFeld();
  516. rend = 1;
  517. }
  518. if (hintergrundFeld->getFarbe() != fc)
  519. {
  520. hintergrundFeld->setFarbe(fc);
  521. rend = 1;
  522. }
  523. }
  524. void ZeichnungHintergrund::setRahmenZ(
  525. Rahmen* ram) // setzt einen Zeiger zum Rahmen
  526. {
  527. if (rahmen != ram)
  528. {
  529. if (rahmen) rahmen->release();
  530. rahmen = ram;
  531. rend = 1;
  532. }
  533. }
  534. void ZeichnungHintergrund::setRahmenBreite(
  535. int br) // setzt die Breite des Rahmens
  536. {
  537. if (!rahmen)
  538. {
  539. rahmen = new LRahmen();
  540. rend = 1;
  541. }
  542. if (rahmen->getRBreite() != br)
  543. {
  544. rahmen->setRamenBreite(br);
  545. rend = 1;
  546. }
  547. }
  548. void ZeichnungHintergrund::setRahmenFarbe(int fc) // setzt die Farbe des Rahmens
  549. {
  550. if (!rahmen)
  551. {
  552. rahmen = new LRahmen();
  553. rend = 1;
  554. }
  555. if (rahmen->getFarbe() != fc)
  556. {
  557. rahmen->setFarbe(fc);
  558. rend = 1;
  559. }
  560. }
  561. void ZeichnungHintergrund::setVertikalKlickScroll(
  562. int ks) // setzt die vertikale Scroll geschwindigkeit
  563. {
  564. if (!vertikalScrollBar)
  565. {
  566. vertikalScrollBar = new VScrollBar();
  567. rend = 1;
  568. }
  569. if (vertikalScrollBar->getKlickScroll() != ks)
  570. {
  571. vertikalScrollBar->setKlickScroll(ks);
  572. rend = 1;
  573. }
  574. }
  575. void ZeichnungHintergrund::setVertikalScrollPos(
  576. int pos) // setzt die vertikale Scroll Position
  577. {
  578. if (!vertikalScrollBar)
  579. {
  580. vertikalScrollBar = new VScrollBar();
  581. rend = 1;
  582. }
  583. if (vertikalScrollBar && vertikalScrollBar->getScroll() != pos)
  584. {
  585. vertikalScrollBar->scroll(pos);
  586. rend = 1;
  587. }
  588. }
  589. void ZeichnungHintergrund::setVertikalScrollFarbe(
  590. int f, int bgF) // setzt die scroll Farbe
  591. {
  592. if (!vertikalScrollBar)
  593. {
  594. vertikalScrollBar = new VScrollBar();
  595. rend = 1;
  596. }
  597. if (vertikalScrollBar
  598. && (vertikalScrollBar->getFarbe() != f
  599. || vertikalScrollBar->getBgFarbe() != bgF))
  600. {
  601. vertikalScrollBar->setFarbe(f);
  602. vertikalScrollBar->setBgFarbe(bgF, bgF != 0);
  603. rend = 1;
  604. }
  605. }
  606. void ZeichnungHintergrund::setHorizontalKlickScroll(
  607. int ks) // setzt die horizontale Scroll geschwindigkeit
  608. {
  609. if (!horizontalScrollBar)
  610. {
  611. horizontalScrollBar = new HScrollBar();
  612. rend = 1;
  613. }
  614. if (horizontalScrollBar && horizontalScrollBar->getKlickScroll() != ks)
  615. {
  616. horizontalScrollBar->setKlickScroll(ks);
  617. rend = 1;
  618. }
  619. }
  620. void ZeichnungHintergrund::setHorizontalScrollPos(
  621. int pos) // setzt die horizontale Scroll Position
  622. {
  623. if (!horizontalScrollBar)
  624. {
  625. horizontalScrollBar = new HScrollBar();
  626. rend = 1;
  627. }
  628. if (horizontalScrollBar && horizontalScrollBar->getScroll() != pos)
  629. {
  630. horizontalScrollBar->scroll(pos);
  631. rend = 1;
  632. }
  633. }
  634. void ZeichnungHintergrund::setHorizontalScrollFarbe(
  635. int f, int bgF) // setzt die scroll Farbe
  636. {
  637. if (!horizontalScrollBar)
  638. {
  639. horizontalScrollBar = new HScrollBar();
  640. rend = 1;
  641. }
  642. if (horizontalScrollBar
  643. && (horizontalScrollBar->getFarbe() != f
  644. || horizontalScrollBar->getBgFarbe() != bgF))
  645. {
  646. horizontalScrollBar->setFarbe(f);
  647. horizontalScrollBar->setBgFarbe(bgF, bgF != 0);
  648. rend = 1;
  649. }
  650. }
  651. bool ZeichnungHintergrund::tick(double tickVal)
  652. {
  653. if (vertikalScrollBar && hatStyle(Style::VScroll))
  654. rend |= vertikalScrollBar->getRend();
  655. if (horizontalScrollBar && hatStyle(Style::HScroll))
  656. rend |= horizontalScrollBar->getRend();
  657. return Zeichnung::tick(tickVal);
  658. }
  659. void ZeichnungHintergrund::render(Bild& rObj)
  660. {
  661. innenPosition.x = pos.x;
  662. innenPosition.y = pos.y;
  663. innenSize.x = gr.x;
  664. innenSize.y = gr.y;
  665. if (hatStyleNicht(Style::Sichtbar)) return;
  666. lockZeichnung();
  667. if (!rObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y))
  668. {
  669. unlockZeichnung();
  670. return;
  671. }
  672. Zeichnung::render(rObj);
  673. int rbr = 0;
  674. if (hatStyle(Style::Rahmen) && rahmen)
  675. {
  676. rahmen->setSize(gr);
  677. rahmen->render(rObj);
  678. rbr = rahmen->getRBreite();
  679. }
  680. innenPosition.x += rbr;
  681. innenPosition.y += rbr;
  682. innenSize.x -= rbr * 2;
  683. innenSize.y -= rbr * 2;
  684. if (!rObj.setDrawOptions(rbr, rbr, gr.x - rbr * 2, gr.y - rbr * 2))
  685. {
  686. rObj.releaseDrawOptions();
  687. unlockZeichnung();
  688. return;
  689. }
  690. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  691. bool hs = horizontalScrollBar && hatStyle(Style::HScroll);
  692. if (vs)
  693. {
  694. vertikalScrollBar->render(
  695. gr.x - rbr * 2 - 15, 0, 15, gr.y - rbr * 2, rObj);
  696. innenSize.x -= 15;
  697. if (hs)
  698. {
  699. horizontalScrollBar->render(
  700. 0, gr.y - rbr * 2 - 15, gr.x - rbr * 2 - 15, 15, rObj);
  701. innenSize.y -= 15;
  702. if (!rObj.setDrawOptions(
  703. 0, 0, gr.x - rbr * 2 - 15, gr.y - rbr * 2 - 15))
  704. {
  705. rObj.releaseDrawOptions();
  706. rObj.releaseDrawOptions();
  707. unlockZeichnung();
  708. return;
  709. }
  710. horizontalScrollBar->update(
  711. horizontalScrollBar->getScrollData()->max, innenSize.x);
  712. }
  713. else
  714. {
  715. if (!rObj.setDrawOptions(0, 0, gr.x - rbr * 2 - 15, gr.y - rbr * 2))
  716. {
  717. rObj.releaseDrawOptions();
  718. rObj.releaseDrawOptions();
  719. unlockZeichnung();
  720. return;
  721. }
  722. }
  723. vertikalScrollBar->update(
  724. vertikalScrollBar->getScrollData()->max, innenSize.y);
  725. }
  726. else if (hs)
  727. {
  728. horizontalScrollBar->render(
  729. rbr, gr.y - rbr * 2 - 15, gr.x - rbr * 2, 15, rObj);
  730. innenSize.y -= 15;
  731. if (!rObj.setDrawOptions(0, 0, gr.x - rbr * 2, gr.y - rbr * 2 - 15))
  732. {
  733. rObj.releaseDrawOptions();
  734. rObj.releaseDrawOptions();
  735. unlockZeichnung();
  736. return;
  737. }
  738. }
  739. if (hatStyle(Style::Hintergrund))
  740. {
  741. if (hatStyle(Style::HAlpha))
  742. rObj.alphaRegion(
  743. 0, 0, gr.x - rbr * 2, gr.y - rbr * 2, hintergrundFarbe);
  744. else
  745. rObj.fillRegion(
  746. 0, 0, gr.x - rbr * 2, gr.y - rbr * 2, hintergrundFarbe);
  747. if (hatStyle(Style::HBild) && hintergrundBild)
  748. {
  749. if (hatStyle(Style::HAlpha))
  750. rObj.alphaBildSkall(
  751. 0, 0, gr.x - rbr * 2, gr.y - rbr * 2, *hintergrundBild);
  752. else
  753. rObj.drawBildSkall(
  754. 0, 0, gr.x - rbr * 2, gr.y - rbr * 2, *hintergrundBild);
  755. }
  756. }
  757. if (hatStyle(Style::Buffered) && hintergrundFeld)
  758. {
  759. hintergrundFeld->setSize(gr.x - rbr * 2, gr.y - rbr * 2);
  760. hintergrundFeld->render(rObj);
  761. }
  762. if (vs || hs) rObj.releaseDrawOptions();
  763. rObj.releaseDrawOptions();
  764. rObj.releaseDrawOptions();
  765. unlockZeichnung();
  766. }
  767. // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
  768. int ZeichnungHintergrund::getInnenBreite() const
  769. {
  770. return getBreite() - 2 * getRahmenBreite();
  771. }
  772. // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
  773. int ZeichnungHintergrund::getInnenHeight() const
  774. {
  775. return getHeight() - 2 * getRahmenBreite();
  776. }
  777. Bild* ZeichnungHintergrund::getHintergrundBild()
  778. const // gibt getThis vom Hintergrund Bild zurück
  779. {
  780. if (!hintergrundBild) return 0;
  781. return dynamic_cast<Bild*>(hintergrundBild->getThis());
  782. }
  783. Bild* ZeichnungHintergrund::zHintergrundBild()
  784. const // gibt das Hintergrund Bild zurück
  785. {
  786. return hintergrundBild;
  787. }
  788. int ZeichnungHintergrund::getHintergrundFarbe()
  789. const // giebt getThis der Hintergrundfarbe zurück
  790. {
  791. return hintergrundFarbe;
  792. }
  793. AlphaFeld* ZeichnungHintergrund::getAlphaFeld()
  794. const // gibt getThir vom Hintergrund Buffer zurück
  795. {
  796. if (!hintergrundFeld) return 0;
  797. return dynamic_cast<AlphaFeld*>(hintergrundFeld->getThis());
  798. }
  799. AlphaFeld*
  800. ZeichnungHintergrund::zAlphaFeld() const // gibt den Hintergrund Buffer zurück
  801. {
  802. return hintergrundFeld;
  803. }
  804. int ZeichnungHintergrund::getAlphaFeldStrength()
  805. const // gibt die Stärke des Hintergrund Buffers zurück
  806. {
  807. if (!hintergrundFeld) return 0;
  808. return hintergrundFeld->getStrength();
  809. }
  810. int ZeichnungHintergrund::getAlphaFeldFarbe()
  811. const // gibt getThis von der Farbe des Hintergrund Buffers zurück
  812. {
  813. return hintergrundFeld->getFarbe();
  814. }
  815. Rahmen*
  816. ZeichnungHintergrund::getRahmen() const // gibt getThis des Rahmens zurück
  817. {
  818. if (!rahmen) return 0;
  819. return dynamic_cast<Rahmen*>(rahmen->getThis());
  820. }
  821. Rahmen* ZeichnungHintergrund::zRahmen() const // gibt den Rahmen zurück
  822. {
  823. return rahmen;
  824. }
  825. int ZeichnungHintergrund::getRahmenBreite()
  826. const // gibt die Breite des Rahmens zurück
  827. {
  828. if (!rahmen || hatStyleNicht(Style::Rahmen)) return 0;
  829. return rahmen->getRBreite();
  830. }
  831. int ZeichnungHintergrund::getRahmenFarbe()
  832. const // gibt getThis der Farbe des Rahmens zurück
  833. {
  834. return rahmen->getFarbe();
  835. }
  836. int ZeichnungHintergrund::getVertikalKlickScroll() const
  837. {
  838. return vertikalScrollBar ? vertikalScrollBar->getKlickScroll() : 0;
  839. }
  840. int ZeichnungHintergrund::getVertikalScrollPos() const
  841. {
  842. return vertikalScrollBar ? vertikalScrollBar->getScroll() : 0;
  843. }
  844. int ZeichnungHintergrund::getVertikalScrollFarbe() const
  845. {
  846. return vertikalScrollBar ? vertikalScrollBar->getFarbe() : 0;
  847. }
  848. int ZeichnungHintergrund::getVertikalScrollHintergrund() const
  849. {
  850. return vertikalScrollBar ? vertikalScrollBar->getBgFarbe() : 0;
  851. }
  852. int ZeichnungHintergrund::getHorizontalKlickScroll() const
  853. {
  854. return horizontalScrollBar ? horizontalScrollBar->getKlickScroll() : 0;
  855. }
  856. int ZeichnungHintergrund::getHorizontalScrollPos() const
  857. {
  858. return horizontalScrollBar ? horizontalScrollBar->getScroll() : 0;
  859. }
  860. int ZeichnungHintergrund::getHorizontalScrollFarbe() const
  861. {
  862. return horizontalScrollBar ? horizontalScrollBar->getFarbe() : 0;
  863. }
  864. int ZeichnungHintergrund::getHorizontalScrollHintergrund() const
  865. {
  866. return horizontalScrollBar ? horizontalScrollBar->getBgFarbe() : 0;
  867. }
  868. Zeichnung*
  869. ZeichnungHintergrund::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
  870. {
  871. ZeichnungHintergrund* obj = new ZeichnungHintergrund();
  872. obj->setPosition(pos);
  873. obj->setSize(gr);
  874. obj->setMausEreignisParameter(makParam);
  875. obj->setTastaturEreignisParameter(takParam);
  876. obj->setMausEreignis(mak);
  877. obj->setTastaturEreignis(tak);
  878. if (toolTip) obj->setToolTipZ((ToolTip*)toolTip->dublizieren());
  879. obj->setStyle(style);
  880. obj->setHintergrundFarbe(hintergrundFarbe);
  881. if (hintergrundFeld)
  882. obj->setAlphaFeldZ((AlphaFeld*)hintergrundFeld->dublizieren());
  883. if (rahmen) obj->setRahmenZ((Rahmen*)rahmen->dublizieren());
  884. if (hintergrundBild)
  885. obj->setHintergrundBild(
  886. dynamic_cast<Bild*>(hintergrundBild->getThis()));
  887. if (vertikalScrollBar)
  888. {
  889. obj->setVertikalKlickScroll(vertikalScrollBar->getKlickScroll());
  890. obj->setVertikalScrollPos(vertikalScrollBar->getScroll());
  891. obj->setVertikalScrollFarbe(
  892. vertikalScrollBar->getFarbe(), vertikalScrollBar->getBgFarbe());
  893. }
  894. if (horizontalScrollBar)
  895. {
  896. obj->setHorizontalKlickScroll(horizontalScrollBar->getKlickScroll());
  897. obj->setHorizontalScrollPos(horizontalScrollBar->getScroll());
  898. obj->setHorizontalScrollFarbe(
  899. horizontalScrollBar->getFarbe(), horizontalScrollBar->getBgFarbe());
  900. }
  901. return obj;
  902. }