Fenster.cpp 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464
  1. #include "Fenster.h"
  2. #include "Text.h"
  3. #include "MausEreignis.h"
  4. #include "TastaturEreignis.h"
  5. #include "Bildschirm.h"
  6. #include "AlphaFeld.h"
  7. #include "Bild.h"
  8. #include "Rahmen.h"
  9. #include "TextFeld.h"
  10. #include "Scroll.h"
  11. #include "ToolTip.h"
  12. #include "Globals.h"
  13. #ifdef WIN32
  14. #include "Maus.h"
  15. #endif
  16. using namespace Framework;
  17. #ifdef WIN32
  18. // Fensterklasse erzeugen
  19. WNDCLASS Framework::F_Normal(HINSTANCE hInst)// Erzeugen einer normalen Fensterklasse
  20. {
  21. if (!hInst)
  22. hInst = _hinst;
  23. WNDCLASS ret;
  24. ret.cbClsExtra = 0;
  25. ret.cbWndExtra = 0;
  26. ret.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  27. ret.hCursor = LoadCursor(NULL, IDC_ARROW);
  28. ret.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  29. ret.hInstance = hInst;
  30. ret.lpszMenuName = "";
  31. ret.lpfnWndProc = WindowProc;
  32. ret.style = CS_HREDRAW | CS_VREDRAW;
  33. return ret;
  34. }
  35. WNDCLASSEX Framework::F_NormalEx(HINSTANCE hInst)
  36. {
  37. if (!hInst)
  38. hInst = _hinst;
  39. WNDCLASSEX ret;
  40. ret.cbSize = sizeof(WNDCLASSEX);
  41. ret.cbClsExtra = 0;
  42. ret.cbWndExtra = 0;
  43. ret.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  44. ret.hCursor = LoadCursor(NULL, IDC_ARROW);
  45. ret.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  46. ret.hInstance = hInst;
  47. ret.lpszMenuName = "";
  48. ret.lpfnWndProc = WindowProc;
  49. ret.style = CS_HREDRAW | CS_VREDRAW;
  50. ret.hIconSm = 0;
  51. return ret;
  52. }
  53. // WinAPI
  54. LRESULT CALLBACK Framework::WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  55. {
  56. if (msgExit)
  57. return (DefWindowProc(hwnd, message, wparam, lparam));
  58. switch (message)
  59. {
  60. // Maus Zeiger
  61. case WM_SETCURSOR:
  62. MausZeiger.update();
  63. return 0;
  64. // Fenster
  65. case WM_SIZE:
  66. if (wparam == SIZE_RESTORED)
  67. WFensterA.sendRestoreMessage(hwnd);
  68. break;
  69. // Schließen
  70. case WM_CLOSE:
  71. if (WFensterA.sendVSchließMessage(hwnd))
  72. return 0;
  73. else
  74. break;
  75. case WM_DESTROY:
  76. if (WFensterA.sendNSchließMessage(hwnd))
  77. return 0;
  78. else
  79. break;
  80. // Maus
  81. case WM_LBUTTONDOWN: // Linksklick
  82. if (1)
  83. {
  84. MausStand[M_Links] = 1;
  85. MausEreignis me = { ME_PLinks, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  86. WFensterA.sendMausMessage(hwnd, me);
  87. break;
  88. }
  89. case WM_RBUTTONDOWN: // Rechtsklick
  90. if (1)
  91. {
  92. MausStand[M_Rechts] = 1;
  93. MausEreignis me = { ME_PRechts, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  94. WFensterA.sendMausMessage(hwnd, me);
  95. break;
  96. }
  97. case WM_MBUTTONDOWN: // Mittelklick
  98. if (1)
  99. {
  100. MausStand[M_Mitte] = 1;
  101. MausEreignis me = { ME_PMitte, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  102. WFensterA.sendMausMessage(hwnd, me);
  103. break;
  104. }
  105. case WM_LBUTTONUP: // Linksrelease
  106. if (1)
  107. {
  108. MausStand[M_Links] = 0;
  109. MausEreignis me = { ME_RLinks, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  110. WFensterA.sendMausMessage(hwnd, me);
  111. break;
  112. }
  113. case WM_RBUTTONUP: // Rechtsrelease
  114. if (1)
  115. {
  116. MausStand[M_Rechts] = 0;
  117. MausEreignis me = { ME_RRechts, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  118. WFensterA.sendMausMessage(hwnd, me);
  119. break;
  120. }
  121. case WM_MBUTTONUP: // Mittelrelease
  122. if (1)
  123. {
  124. MausStand[M_Mitte] = 0;
  125. MausEreignis me = { ME_RMitte, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  126. WFensterA.sendMausMessage(hwnd, me);
  127. break;
  128. }
  129. case WM_LBUTTONDBLCLK: // Linksdoppelklick
  130. if (1)
  131. {
  132. MausEreignis me = { ME_DKLinks, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  133. WFensterA.sendMausMessage(hwnd, me);
  134. break;
  135. }
  136. case WM_RBUTTONDBLCLK: // Rechtsdoppelklick
  137. if (1)
  138. {
  139. MausEreignis me = { ME_DKRechts, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  140. WFensterA.sendMausMessage(hwnd, me);
  141. break;
  142. }
  143. case WM_MBUTTONDBLCLK: // Mitteldoppelklick
  144. if (1)
  145. {
  146. MausEreignis me = { ME_DKMitte, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  147. WFensterA.sendMausMessage(hwnd, me);
  148. break;
  149. }
  150. case WM_MOUSEHOVER: // Maus betritt Fenster
  151. if (1)
  152. {
  153. MausTrack = 1;
  154. MausEreignis me = { ME_Betritt, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  155. WFensterA.sendMausMessage(hwnd, me);
  156. break;
  157. }
  158. case WM_MOUSELEAVE: // Maus verlässt Fenster
  159. if (1)
  160. {
  161. MausTrack = 1;
  162. MausEreignis me = { ME_Leaves, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  163. WFensterA.sendMausMessage(hwnd, me);
  164. break;
  165. }
  166. case WM_MOUSEMOVE: // Maus wird bewegt
  167. if (1)
  168. {
  169. if (MausTrack)
  170. {
  171. TRACKMOUSEEVENT lptme;
  172. lptme.cbSize = sizeof(TRACKMOUSEEVENT);
  173. lptme.dwFlags = TME_HOVER | TME_LEAVE;
  174. lptme.dwHoverTime = 0;
  175. lptme.hwndTrack = hwnd;
  176. TrackMouseEvent(&lptme);
  177. MausTrack = 0;
  178. }
  179. MausEreignis me = { ME_Bewegung, (int)LOWORD(lparam), (int)HIWORD(lparam), 0, 1, (int)LOWORD(lparam), (int)HIWORD(lparam) };
  180. WFensterA.sendMausMessage(hwnd, me);
  181. break;
  182. }
  183. case WM_MOUSEWHEEL: // Maus scroll
  184. if (1)
  185. {
  186. Punkt pos = getMausPos();
  187. RECT r;
  188. GetWindowRect(hwnd, &r);
  189. pos.x -= r.left;
  190. pos.y -= r.top;
  191. MausEreignis me = { 0, pos.x, pos.y, 0, 1, pos.x, pos.y };
  192. if ((int)(short)HIWORD(wparam) < 0)
  193. me.id = !getTastenStand(T_Shift) ? ME_DScroll : ME_RScroll;
  194. else
  195. me.id = !getTastenStand(T_Shift) ? ME_UScroll : ME_LScroll;
  196. WFensterA.sendMausMessage(hwnd, me);
  197. break;
  198. }
  199. // Tastatur
  200. case WM_KEYDOWN:
  201. if (1)
  202. {
  203. TastaturEreignis te = { TE_Press, VirtualZuChar((int)wparam), 0 };
  204. if (te.taste == T_Alt_Gr)
  205. TastenStand[T_Strg] = 0;
  206. TastenStand[te.taste] = 1;
  207. WFensterA.sendTastaturMessage(hwnd, te);
  208. break;
  209. } // Taste wird gedrückt
  210. case WM_KEYUP:
  211. if (1)
  212. {
  213. TastaturEreignis te = { TE_Release, VirtualZuChar((int)wparam), 0 };
  214. TastenStand[te.taste] = 0;
  215. WFensterA.sendTastaturMessage(hwnd, te);
  216. break;
  217. } // Taste wird losgelassen
  218. }
  219. return (DefWindowProc(hwnd, message, wparam, lparam));
  220. }
  221. void Framework::StartNachrichtenSchleife()
  222. {
  223. MSG msg;
  224. while (GetMessage(&msg, NULL, 0, 0) > 0 && !msgExit)
  225. {
  226. if (!msgExit)
  227. {
  228. TranslateMessage(&msg);
  229. DispatchMessage(&msg);
  230. }
  231. }
  232. msgExit = 0;
  233. }
  234. void Framework::StopNachrichtenSchleife(HWND hwnd)
  235. {
  236. msgExit = 1;
  237. PostMessage(hwnd, WM_MOUSELEAVE, 0, 0);
  238. }
  239. unsigned char Framework::VirtualZuChar(int Virtual)
  240. {
  241. UINT vk = MapVirtualKey(Virtual, 2);
  242. if (!vk)
  243. {
  244. switch (Virtual)
  245. {
  246. case VK_CAPITAL:
  247. return T_Caps_Lock;
  248. case VK_SHIFT:
  249. return T_Shift;
  250. case VK_CONTROL:
  251. return T_Strg;
  252. case VK_F1:
  253. return T_F1;
  254. case VK_F2:
  255. return T_F2;
  256. case VK_F3:
  257. return T_F3;
  258. case VK_F4:
  259. return T_F4;
  260. case VK_F5:
  261. return T_F5;
  262. case VK_F6:
  263. return T_F6;
  264. case VK_F7:
  265. return T_F7;
  266. case VK_F8:
  267. return T_F8;
  268. case VK_F9:
  269. return T_F9;
  270. case VK_F10:
  271. return T_F10;
  272. case VK_F11:
  273. return T_F11;
  274. case VK_F12:
  275. return T_F12;
  276. case VK_PAUSE:
  277. return T_Pause;
  278. case VK_SNAPSHOT:
  279. return T_Druck;
  280. case VK_INSERT:
  281. return T_Einfg;
  282. case VK_DELETE:
  283. return T_Entf;
  284. case VK_LEFT:
  285. return T_Links;
  286. case VK_UP:
  287. return T_Oben;
  288. case VK_RIGHT:
  289. return T_Rechts;
  290. case VK_DOWN:
  291. return T_Unten;
  292. case VK_MENU:
  293. return T_Alt_Gr;
  294. case VK_NUMLOCK:
  295. return T_Num;
  296. case VK_HOME:
  297. return T_Pos1;
  298. case VK_PRIOR:
  299. return T_BildO;
  300. case VK_NEXT:
  301. return T_BildU;
  302. case VK_END:
  303. return T_Ende;
  304. case VK_TAB:
  305. return T_Tab;
  306. case VK_LMENU:
  307. return T_Alt;
  308. }
  309. }
  310. if (vk == VK_TAB)
  311. return T_Tab;
  312. char ret = (char)(short)LOWORD(vk);
  313. short SHIFT = GetKeyState(VK_SHIFT);
  314. short CAPSLOCK = GetKeyState(VK_CAPITAL);
  315. short ALTGR = TastenStand[T_Alt_Gr];
  316. if (ALTGR)
  317. {
  318. switch (ret)
  319. {
  320. case 'q':
  321. return '@';
  322. case 'Q':
  323. return '@';
  324. case '<':
  325. return '|';
  326. case '>':
  327. return '|';
  328. case '7':
  329. return '{';
  330. case '/':
  331. return '{';
  332. case '8':
  333. return '[';
  334. case '(':
  335. return '[';
  336. case '9':
  337. return ']';
  338. case ')':
  339. return ']';
  340. case '0':
  341. return '}';
  342. case '=':
  343. return '}';
  344. case 'ß':
  345. return '\\';
  346. case '?':
  347. return '\\';
  348. case '+':
  349. return '~';
  350. case '*':
  351. return '~';
  352. case 'e':
  353. return '€';
  354. case 'E':
  355. return '€';
  356. case 'm':
  357. return 'µ';
  358. case 'M':
  359. return 'µ';
  360. case '2':
  361. return '²';
  362. case '"':
  363. return '²';
  364. case '3':
  365. return '³';
  366. case '§':
  367. return '³';
  368. }
  369. }
  370. SHIFT = HIWORD(SHIFT);
  371. CAPSLOCK = LOWORD(CAPSLOCK);
  372. bool up = 0;
  373. if (SHIFT && !CAPSLOCK)
  374. up = 1;
  375. if (CAPSLOCK && !SHIFT)
  376. up = 1;
  377. ret = smallOrBig(ret, up);
  378. return ret;
  379. }
  380. // Inhalt der WFenster Klasse aus Fenster.h
  381. // Konstruktor
  382. WFenster::WFenster()
  383. : ReferenceCounter(),
  384. hWnd(0),
  385. style(0),
  386. makParam(0),
  387. sakParam(0),
  388. takParam(0),
  389. mausAktion(0),
  390. vCloseAktion(0),
  391. nCloseAktion(0),
  392. tastaturAktion(0),
  393. screen(0),
  394. mx(-1),
  395. my(-1),
  396. verschiebbar(0),
  397. rahmen(0),
  398. bitmap(0),
  399. hdc(0)
  400. {
  401. WFensterA.addFenster(this);
  402. }
  403. WFenster::WFenster(HWND hwnd)
  404. : WFenster()
  405. {
  406. hWnd = hwnd;
  407. }
  408. // Destruktor
  409. WFenster::~WFenster()
  410. {
  411. if (WFensterA.removeFenster(this))
  412. {
  413. WFensterA.del();
  414. }
  415. if (hWnd)
  416. zerstören();
  417. if (screen)
  418. screen->release();
  419. }
  420. // nicht constant
  421. void WFenster::erstellen(int style, WNDCLASS wc) // Erstellt ein Fenster in Windows
  422. {
  423. if (!GetClassInfo(wc.hInstance, wc.lpszClassName, &wc))
  424. {
  425. #pragma warning(suppress: 6102)
  426. if (!RegisterClass(&wc)) // Register Fensterklasse
  427. {
  428. MessageBox(hWnd, "Fehler beim Registrieren der Fensterklasse!", "Error", MB_ICONERROR); // Fehlermeldung bei Fehler
  429. return;
  430. }
  431. }
  432. hWnd = CreateWindow(wc.lpszClassName, wc.lpszClassName, style, 0, 0, 0, 0, 0, 0, wc.hInstance, 0); // Fenster Erstellen
  433. if (hWnd == 0)
  434. {
  435. MessageBox(hWnd, "Fehler beim erstellen des Fensters!", "Error", MB_ICONERROR); // Fehlermeldung bei Fehler
  436. return;
  437. }
  438. this->style = style;
  439. }
  440. void WFenster::erstellenEx(int exStyle, int style, WNDCLASSEX wc) // Das Fenster Erstellen
  441. {
  442. if (!GetClassInfoEx(wc.hInstance, wc.lpszClassName, &wc))
  443. {
  444. #pragma warning(suppress: 6102)
  445. if (!RegisterClassEx(&wc)) // Register Fensterklasse
  446. {
  447. MessageBox(hWnd, "Fehler beim Registrieren der Fensterklasse!", "Error", MB_ICONERROR); // Fehlermeldung bei Fehler
  448. return;
  449. }
  450. }
  451. hWnd = CreateWindowEx(exStyle, wc.lpszClassName, wc.lpszClassName, style, 0, 0, 0, 0, 0, 0, wc.hInstance, 0); // Fenster Erstellen
  452. if (hWnd == 0)
  453. {
  454. MessageBox(hWnd, "Fehler beim erstellen des Fensters!", "Error", MB_ICONERROR); // Fehlermeldung bei Fehler
  455. return;
  456. }
  457. this->style = style;
  458. }
  459. void WFenster::setAnzeigeModus(int mod)// Fenster Anzeigen
  460. {
  461. if (rahmen)
  462. {
  463. if (mod == 2)
  464. ShowWindow(rahmen, 0);
  465. else
  466. ShowWindow(rahmen, mod);
  467. }
  468. ShowWindow(hWnd, mod);
  469. }
  470. bool WFenster::setFokus() // Setzt den Fokus auf das Fenster
  471. {
  472. DWORD dwCurrentThread = GetCurrentThreadId();
  473. DWORD dwFGThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
  474. AttachThreadInput(dwCurrentThread, dwFGThread, TRUE);
  475. SetFocus(hWnd);
  476. AttachThreadInput(dwCurrentThread, dwFGThread, FALSE);
  477. SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
  478. SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
  479. return GetFocus() == hWnd;
  480. }
  481. void WFenster::setPosition(Punkt& p)// Fenster Position
  482. {
  483. setPosition(p.x, p.y);
  484. }
  485. void WFenster::setPosition(int x, int y)
  486. {
  487. RECT r;
  488. GetWindowRect(hWnd, &r); // Vorherige Position herausfinden
  489. RECT res;
  490. res.left = x, res.top = y, res.right = r.right - r.left, res.bottom = r.bottom - r.top;
  491. AdjustWindowRect(&res, style, 0);
  492. /* if( res.top < 0 )
  493. {
  494. res.bottom -= res.top;
  495. res.top = 0;
  496. }
  497. if( res.left < 0 )
  498. {
  499. res.right -= res.left;
  500. res.left = 0;
  501. }*/
  502. SetWindowPos(hWnd, 0, res.left, res.top, res.right, res.bottom, 0); // Position ändern
  503. }
  504. void WFenster::setSize(Punkt& g)// Fenster Größe
  505. {
  506. RECT r;
  507. GetWindowRect(hWnd, &r); // vorherige Größe herausfinden
  508. RECT res;
  509. res.left = r.left, res.top = r.top, res.right = g.x, res.bottom = g.y;
  510. AdjustWindowRect(&res, style, 0);
  511. /* if( res.top < 0 )
  512. {
  513. res.bottom -= res.top;
  514. res.top = 0;
  515. }
  516. if( res.left < 0 )
  517. {
  518. res.right -= res.left;
  519. res.left = 0;
  520. }*/
  521. SetWindowPos(hWnd, 0, res.left, res.top, res.right, res.bottom, 0); // Größe ändern
  522. }
  523. void WFenster::setSize(int breite, int höhe)
  524. {
  525. RECT r;
  526. GetWindowRect(hWnd, &r); // vorherige Größe herausfinden
  527. RECT res;
  528. res.left = r.left, res.top = r.top, res.right = breite, res.bottom = höhe;
  529. AdjustWindowRect(&res, style, 0);
  530. /* if( res.top < 0 )
  531. {
  532. res.bottom -= res.top;
  533. res.top = 0;
  534. }
  535. if( res.left < 0 )
  536. {
  537. res.right -= res.left;
  538. res.left = 0;
  539. }*/
  540. SetWindowPos(hWnd, 0, res.left, res.top, res.right, res.bottom, 0); // Größe ändern
  541. }
  542. void WFenster::setBounds(Punkt& p, Punkt& g) // setzt größe und Position
  543. {
  544. SetWindowPos(hWnd, 0, p.x, p.y, g.x, g.y, 0); // Größe und Position ändern
  545. }
  546. void WFenster::setBildschirm(Bildschirm* screen)
  547. {
  548. if (this->screen)
  549. this->screen->release();
  550. this->screen = screen;
  551. }
  552. void WFenster::zerstören()
  553. {
  554. DestroyWindow(hWnd);
  555. hWnd = 0;
  556. if (rahmen)
  557. DestroyWindow(rahmen);
  558. rahmen = 0;
  559. if (bitmap)
  560. DeleteObject(bitmap);
  561. bitmap = 0;
  562. if (hdc)
  563. DeleteDC(hdc);
  564. hdc = 0;
  565. }
  566. void WFenster::doMausAktion(MausEreignis& me)
  567. {
  568. if (!mausAktion || !mausAktion(makParam, this, me))
  569. return;
  570. if (screen && me.id != ME_Betritt && me.id != ME_Leaves)
  571. {
  572. screen->doMausEreignis(me);
  573. if (!me.verarbeitet && verschiebbar)
  574. {
  575. if (mx != -1 && my != -1) // verschieben
  576. {
  577. RECT r;
  578. if (rahmen)
  579. {
  580. GetWindowRect(rahmen, &r);
  581. r.right -= r.left, r.bottom -= r.top;
  582. r.left += me.mx - mx;
  583. r.top += me.my - my;
  584. SetWindowPos(rahmen, 0, r.left, r.top, r.right, r.bottom, 0); // Position setzen
  585. }
  586. GetWindowRect(hWnd, &r); // Vorherige Position herausfinden
  587. r.right -= r.left, r.bottom -= r.top; // Position updaten
  588. r.left += me.mx - mx;
  589. r.top += me.my - my;
  590. SetWindowPos(hWnd, 0, r.left, r.top, r.right, r.bottom, 0); // Position setzen
  591. }
  592. else if (me.id == ME_PLinks) // verschieben starten
  593. mx = me.mx, my = me.my;
  594. if (me.id == ME_RLinks) // verschieben beenden
  595. mx = -1, my = -1;
  596. me.verarbeitet = 1;
  597. }
  598. }
  599. }
  600. void WFenster::doVSchließAktion()
  601. {
  602. if (!vCloseAktion)
  603. return;
  604. vCloseAktion(sakParam, this);
  605. }
  606. void WFenster::doNSchließAktion()
  607. {
  608. if (!nCloseAktion)
  609. return;
  610. nCloseAktion(sakParam, this);
  611. }
  612. void WFenster::doTastaturAktion(TastaturEreignis& te)
  613. {
  614. if (!tastaturAktion || !tastaturAktion(takParam, this, te))
  615. return;
  616. if (screen)
  617. screen->doTastaturEreignis(te);
  618. }
  619. void WFenster::doRestoreMessage() // macht den Rahmen sichtbar
  620. {
  621. if (rahmen)
  622. ShowWindow(rahmen, 1);
  623. ShowWindow(hWnd, 1);
  624. }
  625. void WFenster::setMausEreignisParameter(void* p) // setzt den Parameter vom Maus Ereignis
  626. {
  627. makParam = p;
  628. }
  629. void WFenster::setSchließEreignisParameter(void* p) // setzt den Parameter vom Schließ Ereignis
  630. {
  631. sakParam = p;
  632. }
  633. void WFenster::setTastaturEreignisParameter(void* p) // setzt den Parameter vom Tastatur Ereignis
  634. {
  635. takParam = p;
  636. }
  637. void WFenster::setMausAktion(MausAktion mausAk)
  638. {
  639. mausAktion = mausAk;
  640. }
  641. void WFenster::setVSchließAktion(std::function< void(void*, void*) > vSchließAk)
  642. {
  643. vCloseAktion = vSchließAk;
  644. }
  645. void WFenster::setNSchließAktion(std::function< void(void*, void*) > nSchließAk)
  646. {
  647. nCloseAktion = nSchließAk;
  648. }
  649. void WFenster::setTastaturAktion(TastaturAktion tastaturAk)
  650. {
  651. tastaturAktion = tastaturAk;
  652. }
  653. void WFenster::setFensterHandle(HWND hWnd) // setzt das operationsfenster
  654. {
  655. this->hWnd = hWnd;
  656. }
  657. void WFenster::setVerschiebbar(bool verschiebbar) // legt fest, ob das Fenster durch ziehen mit Maus verschoben werden kann
  658. {
  659. this->verschiebbar = verschiebbar;
  660. }
  661. void WFenster::ladeRahmenFenster(Bild* zBild, HINSTANCE hinst) // setzt einen Transpatenten Rahmen um das Fenster
  662. {
  663. if (!zBild)
  664. return;
  665. // Fenster erstellen
  666. WNDCLASSEX wcl = { 0 };
  667. wcl.cbSize = sizeof(wcl);
  668. wcl.style = CS_HREDRAW | CS_VREDRAW;
  669. wcl.lpfnWndProc = WindowProc;
  670. wcl.cbClsExtra = 0;
  671. wcl.cbWndExtra = 0;
  672. wcl.hInstance = hinst;
  673. wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  674. wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
  675. wcl.hbrBackground = NULL;
  676. wcl.lpszMenuName = NULL;
  677. wcl.lpszClassName = TEXT("LayeredWindowClass");
  678. wcl.hIconSm = NULL;
  679. // Bitmap erstellen
  680. hdc = CreateCompatibleDC(NULL);
  681. if (!hdc)
  682. return;
  683. BITMAPINFO info;
  684. info.bmiHeader.biSize = sizeof(info.bmiHeader);
  685. info.bmiHeader.biBitCount = 32;
  686. info.bmiHeader.biWidth = zBild->getBreite();
  687. info.bmiHeader.biHeight = -zBild->getHeight();
  688. info.bmiHeader.biCompression = BI_RGB;
  689. info.bmiHeader.biPlanes = 1;
  690. unsigned char* pPixels = 0;
  691. bitmap = CreateDIBSection(hdc, &info, DIB_RGB_COLORS, (void**)&pPixels, 0, 0);
  692. if (!bitmap)
  693. DeleteDC(hdc);
  694. GdiFlush();
  695. // bitmap füllen
  696. int pitch = ((zBild->getBreite() * 32 + 31) & ~31) >> 3;
  697. unsigned char* pRow = 0;
  698. int* buffer = zBild->getBuffer();
  699. for (int i = 0; i < zBild->getHeight(); ++i)
  700. {
  701. pRow = &pPixels[i * pitch];
  702. for (int i2 = 0; i2 < zBild->getBreite(); ++i2)
  703. {
  704. pRow[i2 * 4] = (unsigned char)((buffer[i2 + i * zBild->getBreite()] >> 16) & 0xFF);
  705. pRow[i2 * 4 + 1] = (unsigned char)((buffer[i2 + i * zBild->getBreite()] >> 8) & 0xFF);
  706. pRow[i2 * 4 + 2] = (unsigned char)((buffer[i2 + i * zBild->getBreite()]) & 0xFF);
  707. pRow[i2 * 4 + 3] = (unsigned char)((buffer[i2 + i * zBild->getBreite()] >> 24) & 0xFF);
  708. }
  709. }
  710. // alpha berechnen
  711. unsigned char* pPixel = 0;
  712. if (zBild->getBreite() * 4 == pitch)
  713. {
  714. int i = 0;
  715. int totalBytes = zBild->getBreite() * zBild->getHeight() * 4;
  716. for (i = 0; i < totalBytes; i += 4)
  717. {
  718. pPixel = &pPixels[i];
  719. pPixel[0] *= (unsigned char)((float)pPixel[3] / 255.0f);
  720. pPixel[1] *= (unsigned char)((float)pPixel[3] / 255.0f);
  721. pPixel[2] *= (unsigned char)((float)pPixel[3] / 255.0f);
  722. }
  723. }
  724. else
  725. {
  726. int x = 0;
  727. int y = 0;
  728. for (y = 0; y < zBild->getHeight(); ++y)
  729. {
  730. for (x = 0; x < zBild->getBreite(); ++x)
  731. {
  732. pPixel = &pPixels[(y * pitch) + (x * 4)];
  733. pPixel[0] *= (unsigned char)((float)pPixel[3] / 255.0f);
  734. pPixel[1] *= (unsigned char)((float)pPixel[3] / 255.0f);
  735. pPixel[2] *= (unsigned char)((float)pPixel[3] / 255.0f);
  736. }
  737. }
  738. }
  739. // Fenster erstellen fortsetzen
  740. if (RegisterClassEx(&wcl))
  741. {
  742. rahmen = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED,
  743. wcl.lpszClassName,
  744. TEXT("Transparentes Fenster"),
  745. WS_POPUP,
  746. 0,
  747. 0,
  748. zBild->getBreite(),
  749. zBild->getHeight(),
  750. 0,
  751. 0,
  752. wcl.hInstance,
  753. 0
  754. );
  755. if (rahmen)
  756. {
  757. // zeichnen
  758. HDC h = 0;
  759. if ((h = GetDC(rahmen)) && bitmap)
  760. {
  761. HGDIOBJ hPrevObj = NULL;
  762. POINT ptDest = { 0, 0 };
  763. POINT ptSrc = { 0, 0 };
  764. SIZE client = { zBild->getBreite(), zBild->getHeight() };
  765. BLENDFUNCTION blendFunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
  766. hPrevObj = SelectObject(hdc, bitmap);
  767. ClientToScreen(rahmen, &ptDest);
  768. UpdateLayeredWindow(rahmen, h, &ptDest, &client, hdc, &ptSrc, 0, &blendFunc, ULW_ALPHA);
  769. SelectObject(hdc, hPrevObj);
  770. ReleaseDC(rahmen, h);
  771. }
  772. UpdateWindow(rahmen);
  773. Punkt pos = getPosition() + (getGröße() - zBild->getSize()) / 2;
  774. SetWindowPos(rahmen, 0, pos.x, pos.y, zBild->getBreite(), zBild->getHeight(), 0);
  775. }
  776. }
  777. }
  778. // constant
  779. Punkt WFenster::getPosition() const // gibt die Position zurück
  780. {
  781. RECT r;
  782. GetWindowRect(hWnd, &r); // Position herausfinden
  783. return{ r.left, r.top };
  784. }
  785. Punkt WFenster::getGröße() const // gibt die Größe zurück
  786. {
  787. RECT r;
  788. GetWindowRect(hWnd, &r); // Größe herausfinden
  789. return{ r.right - r.left, r.bottom - r.top };
  790. }
  791. Punkt WFenster::getKörperGröße() const // gibt die Fenster Körpergröße zurück
  792. {
  793. RECT r;
  794. GetClientRect(hWnd, &r); // Größe herausfinden
  795. return{ r.right - r.left, r.bottom - r.top };
  796. }
  797. int WFenster::getKörperBreite() const // gibt die Fenster Körperbreite zurück
  798. {
  799. RECT r;
  800. GetClientRect(hWnd, &r); // Größe herausfinden
  801. return r.right;
  802. }
  803. int WFenster::getKörperHöhe() const // gibt die Fenster Körperhöhe zurück
  804. {
  805. RECT r;
  806. GetClientRect(hWnd, &r); // Größe herausfinden
  807. return r.bottom;
  808. }
  809. HWND WFenster::getFensterHandle() const // gibt ein Handle zum Fenster zurück
  810. {
  811. return hWnd;
  812. }
  813. bool WFenster::hatMausAktion() const
  814. {
  815. return mausAktion != 0;
  816. }
  817. bool WFenster::hatVSchließAktion() const
  818. {
  819. return vCloseAktion != 0;
  820. }
  821. bool WFenster::hatNSchließAktion() const
  822. {
  823. return nCloseAktion != 0;
  824. }
  825. bool WFenster::hatTastaturAktion() const
  826. {
  827. return tastaturAktion != 0;
  828. }
  829. Bildschirm* WFenster::getBildschirm() const
  830. {
  831. if (!screen)
  832. return 0;
  833. return dynamic_cast<Bildschirm*>(screen->getThis());
  834. }
  835. Bildschirm* WFenster::zBildschirm() const
  836. {
  837. return screen;
  838. }
  839. bool WFenster::istVerschiebbar() const // prüft, ob das Fenster durch ziehen mit Maus verschoben werden kann
  840. {
  841. return verschiebbar;
  842. }
  843. // Inhalt der WFensterArray Klasse aus Fenster.h
  844. // Konstruktor
  845. WFensterArray::WFensterArray()
  846. : next(0),
  847. This(0)
  848. {}
  849. // Destruktor
  850. WFensterArray::~WFensterArray()
  851. {
  852. if (next)
  853. delete next;
  854. }
  855. // add und remove
  856. bool WFensterArray::addFenster(WFenster* fenster)
  857. {
  858. if (fenster == This)
  859. return 0;
  860. if (!This)
  861. {
  862. This = fenster;
  863. return 1;
  864. }
  865. if (!next)
  866. next = new WFensterArray();
  867. return next->addFenster(fenster);
  868. }
  869. bool WFensterArray::removeFenster(WFenster* fenster)
  870. {
  871. if (fenster == This)
  872. return 1;
  873. if (!next)
  874. return 0;
  875. if (next->removeFenster(fenster))
  876. {
  877. WFensterArray* tmp = next->getNext();
  878. next->setNext0();
  879. delete next;
  880. next = tmp;
  881. }
  882. return 0;
  883. }
  884. WFensterArray* WFensterArray::getNext()
  885. {
  886. return next;
  887. }
  888. void WFensterArray::setNext0()
  889. {
  890. next = 0;
  891. }
  892. void WFensterArray::del()
  893. {
  894. if (next)
  895. {
  896. This = next->getThis();
  897. WFensterArray* tmp = next->getNext();
  898. next->setNext0();
  899. delete next;
  900. next = tmp;
  901. }
  902. else
  903. This = 0;
  904. }
  905. // Messages
  906. bool WFensterArray::sendVSchließMessage(HWND hwnd)
  907. {
  908. if (!This)
  909. return 0;
  910. bool ret = 0;
  911. if (This->getFensterHandle() == hwnd && This->hatVSchließAktion())
  912. {
  913. This->doVSchließAktion();
  914. ret = 1;
  915. }
  916. if (!next)
  917. return ret;
  918. return ret || next->sendVSchließMessage(hwnd);
  919. }
  920. bool WFensterArray::sendNSchließMessage(HWND hwnd)
  921. {
  922. if (!This)
  923. return 0;
  924. bool ret = 0;
  925. if (This->getFensterHandle() == hwnd && This->hatNSchließAktion())
  926. {
  927. This->doNSchließAktion();
  928. ret = 1;
  929. }
  930. if (!next)
  931. return ret;
  932. return ret || next->sendNSchließMessage(hwnd);
  933. }
  934. bool WFensterArray::sendMausMessage(HWND hwnd, MausEreignis& me)
  935. {
  936. if (!This)
  937. return 0;
  938. bool ret = 0;
  939. if (This->getFensterHandle() == hwnd && This->hatMausAktion())
  940. {
  941. This->doMausAktion(me);
  942. ret = 1;
  943. }
  944. if (!next)
  945. return ret;
  946. return ret || next->sendMausMessage(hwnd, me);
  947. }
  948. bool WFensterArray::sendTastaturMessage(HWND hwnd, TastaturEreignis& te)
  949. {
  950. if (!This)
  951. return 0;
  952. bool ret = 0;
  953. if (This->getFensterHandle() == hwnd && This->hatTastaturAktion())
  954. {
  955. This->doTastaturAktion(te);
  956. ret = 1;
  957. }
  958. if (!next)
  959. return ret;
  960. return ret || next->sendTastaturMessage(hwnd, te);
  961. }
  962. bool WFensterArray::sendRestoreMessage(HWND hwnd)
  963. {
  964. if (!This)
  965. return 0;
  966. bool ret = 0;
  967. if (This->getFensterHandle() == hwnd && This->hatMausAktion())
  968. {
  969. This->doRestoreMessage();
  970. ret = 1;
  971. }
  972. if (!next)
  973. return ret;
  974. return ret || next->sendRestoreMessage(hwnd);
  975. }
  976. WFenster* WFensterArray::getThis()
  977. {
  978. return This;
  979. }
  980. // WMessageBox
  981. void Framework::WMessageBox(HWND hWnd, Text* titel, Text* meldung, UINT style)
  982. {
  983. MessageBox(hWnd, meldung->getText(), titel->getText(), style); // Message Box
  984. titel->release();
  985. meldung->release();
  986. }
  987. #endif
  988. // Inhalt der Fenster Klasse aus Fenster.h
  989. // Konstruktor
  990. Fenster::Fenster()
  991. : Zeichnung(),
  992. closingMe(0),
  993. closingMeParam(0),
  994. rahmen(0),
  995. titel(0),
  996. members(0),
  997. bgBodyColor(0xFF000000),
  998. bgBodyPicture(0),
  999. bodyBuffer(0),
  1000. bgClosingFarbe(0xFF000000),
  1001. bgClosingBild(0),
  1002. closeBuffer(0),
  1003. closeKlickBuffer(0),
  1004. vScroll(0),
  1005. hScroll(0),
  1006. kMin(0, 0),
  1007. kMax(0, 0),
  1008. closeKlick(0),
  1009. klick(0),
  1010. moving(0),
  1011. mx(0),
  1012. my(0)
  1013. {
  1014. style = Style::MEIgnoreVerarbeitet | Style::MEIgnoreSichtbar | Style::MEIgnoreParentInside | Style::MEIgnoreInside;
  1015. this->setMausEreignis(_ret1ME);
  1016. this->setTastaturEreignis(_ret1TE);
  1017. min = Punkt(0, 0), max = Punkt(0, 0);
  1018. }
  1019. // Destruktor
  1020. Fenster::~Fenster()
  1021. {
  1022. if (rahmen)
  1023. rahmen->release();
  1024. if (titel)
  1025. titel->release();
  1026. if (members)
  1027. members->release();
  1028. if (bodyBuffer)
  1029. bodyBuffer->release();
  1030. if (bgBodyPicture)
  1031. bgBodyPicture->release();
  1032. if (bgClosingBild)
  1033. bgClosingBild->release();
  1034. if (closeBuffer)
  1035. closeBuffer->release();
  1036. if (closeKlickBuffer)
  1037. closeKlickBuffer->release();
  1038. if (vScroll)
  1039. vScroll->release();
  1040. if (hScroll)
  1041. hScroll->release();
  1042. }
  1043. void Fenster::doMausEreignis(MausEreignis& me, bool userRet)
  1044. {
  1045. if (hatStyleNicht(Style::Sichtbar) || !me.insideParent || me.verarbeitet || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y || !userRet)
  1046. {
  1047. bool insideParent = me.insideParent;
  1048. bool verarbeitet = me.verarbeitet;
  1049. me.verarbeitet |= hatStyleNicht(Style::Sichtbar);
  1050. me.insideParent = 0;
  1051. int rbr = 0;
  1052. if (hatStyle(Style::Rahmen) && rahmen)
  1053. rbr = rahmen->getRBreite();
  1054. int th = 0;
  1055. if (hatStyle(Style::Titel) && titel)
  1056. th = titel->getHeight();
  1057. me.mx -= rbr;
  1058. me.my -= rbr + th;
  1059. if (hatStyle(Style::VScroll) && vScroll)
  1060. me.my += vScroll->getScroll();
  1061. if (hatStyle(Style::HScroll) && hScroll)
  1062. me.mx += hScroll->getScroll();
  1063. if (me.id != ME_Betritt && me.id != ME_Leaves && members)
  1064. {
  1065. for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
  1066. members->z(i)->doPublicMausEreignis(me);
  1067. }
  1068. me.mx += rbr;
  1069. me.my += rbr + th;
  1070. if (hatStyle(Style::VScroll) && vScroll)
  1071. me.my -= vScroll->getScroll();
  1072. if (hatStyle(Style::HScroll) && hScroll)
  1073. me.mx -= hScroll->getScroll();
  1074. me.insideParent = insideParent;
  1075. if (hatStyleNicht(Style::Sichtbar))
  1076. me.verarbeitet = verarbeitet;
  1077. if (!moving)
  1078. return;
  1079. }
  1080. bool mvtmp = me.verarbeitet;
  1081. if (hatStyleNicht(Style::Erlaubt))
  1082. me.verarbeitet = 1;
  1083. int rbr = 0;
  1084. if (hatStyle(Style::Rahmen) && rahmen)
  1085. rbr = rahmen->getRBreite();
  1086. int th = 0;
  1087. if (hatStyle(Style::Titel) && titel)
  1088. th = titel->getHeight();
  1089. bool hSc = hatStyle(Style::HScroll) && hScroll;
  1090. bool vSc = hatStyle(Style::VScroll) && vScroll;
  1091. if (me.id == ME_Bewegung && moving && getMausStand(M_Links))
  1092. {
  1093. if (hatStyle(Style::Beweglich) || hatStyle(Style::HeightChangeable) || hatStyle(Style::BreiteChangeable) || hatStyle(Style::TitelHeightChangeable))
  1094. {
  1095. bool ret1 = 0;
  1096. bool mset = 0;
  1097. int schi = 0;
  1098. int scbr = 0;
  1099. if (hSc)
  1100. {
  1101. schi = 15;
  1102. scbr = 40;
  1103. }
  1104. if (vSc)
  1105. {
  1106. scbr += 15;
  1107. schi = 40;
  1108. }
  1109. bool minXb, maxXb, minYb, maxYb;
  1110. bool kMinXb, kMaxXb, kMinYb, kMaxYb;
  1111. minXb = hatStyle(Style::MinBr);
  1112. maxXb = hatStyle(Style::MaxBr);
  1113. minYb = hatStyle(Style::MinHi);
  1114. maxYb = hatStyle(Style::MaxHi);
  1115. kMinXb = hatStyle(Style::BodyMinBr);
  1116. kMaxXb = hatStyle(Style::BodyMaxBr);
  1117. kMinYb = hatStyle(Style::BodyMinHi);
  1118. kMaxYb = hatStyle(Style::BodyMaxHi);
  1119. int fMinBr = rbr * 2 + scbr;
  1120. if (minXb)
  1121. fMinBr = fMinBr < min.x ? min.x : fMinBr;
  1122. if (kMinXb)
  1123. fMinBr = fMinBr < (rbr * 2 + kMin.x + scbr) ? (rbr * 2 + kMin.x + scbr) : fMinBr;
  1124. int fMinHi = rbr * 2 + th + schi;
  1125. if (minYb)
  1126. fMinHi = fMinHi < min.y ? min.y : fMinHi;
  1127. if (kMinYb)
  1128. fMinHi = fMinHi < (rbr * 2 + kMin.y + th + schi) ? (rbr * 2 + kMin.y + th + schi) : fMinHi;
  1129. int fMaxBr = 0;
  1130. if (maxXb)
  1131. fMaxBr = max.x;
  1132. if (kMaxXb)
  1133. fMaxBr = fMaxBr < (rbr * 2 + kMax.x + scbr) ? (rbr * 2 + kMax.x + scbr) : fMaxBr;
  1134. int fMaxHi = 0;
  1135. if (maxYb)
  1136. fMaxHi = max.y;
  1137. if (kMaxYb)
  1138. fMaxHi = fMaxHi < (rbr * 2 + kMax.y + th + schi) ? (rbr * 2 + kMax.y + th + schi) : fMaxHi;
  1139. minXb |= kMinXb, maxXb |= kMaxXb, minYb |= kMinYb, maxYb |= kMaxYb;
  1140. if (hatStyle(Style::HeightChangeable))
  1141. {
  1142. if ((moving | 0x1) == moving) // top
  1143. {
  1144. pos.y -= my - me.my;
  1145. gr.y += my - me.my;
  1146. if (gr.y < fMinHi)
  1147. {
  1148. pos.y += fMinHi - gr.y;
  1149. gr.y = fMinHi;
  1150. }
  1151. else if (maxYb && gr.y > fMaxHi)
  1152. {
  1153. pos.y += gr.y - fMaxHi;
  1154. gr.y = fMaxHi;
  1155. }
  1156. else if (vSc)
  1157. vScroll->getScrollData()->anzeige = gr.y;
  1158. rend = 1;
  1159. ret1 = 1;
  1160. }
  1161. else if ((moving | 0x2) == moving) // bottom
  1162. {
  1163. gr.y += me.my - my;
  1164. if (gr.y < fMinHi)
  1165. gr.y = fMinHi;
  1166. else if (maxYb && gr.y > fMaxHi)
  1167. gr.y = fMaxHi;
  1168. else
  1169. {
  1170. mset = 1;
  1171. if (vSc)
  1172. vScroll->getScrollData()->anzeige = gr.y;
  1173. }
  1174. rend = 1;
  1175. ret1 = 1;
  1176. }
  1177. }
  1178. if (hatStyle(Style::BreiteChangeable))
  1179. {
  1180. if ((moving | 0x4) == moving) // left
  1181. {
  1182. pos.x -= mx - me.mx;
  1183. gr.x += mx - me.mx;
  1184. if (gr.x < fMinBr)
  1185. {
  1186. pos.x += fMinBr - gr.x;
  1187. gr.x = fMinBr;
  1188. }
  1189. else if (maxXb && gr.x > fMaxBr)
  1190. {
  1191. pos.x += gr.x - fMaxBr;
  1192. gr.x = fMaxBr;
  1193. }
  1194. else if (hSc)
  1195. hScroll->getScrollData()->anzeige = gr.x;
  1196. rend = 1;
  1197. ret1 = 1;
  1198. }
  1199. else if ((moving | 0x8) == moving) // right
  1200. {
  1201. gr.x += me.mx - mx;
  1202. if (gr.x < rbr * 2 + fMinBr)
  1203. gr.x = rbr * 2 + fMinBr;
  1204. else if (maxXb && gr.x > fMaxBr)
  1205. gr.x = fMaxBr;
  1206. else
  1207. {
  1208. mset = 1;
  1209. if (hSc)
  1210. hScroll->getScrollData()->anzeige = gr.x;
  1211. }
  1212. rend = 1;
  1213. ret1 = 1;
  1214. }
  1215. }
  1216. if (hatStyle(Style::TitelHeightChangeable) && titel && (moving | 0x10) == moving) // titel height
  1217. {
  1218. int maxTh = gr.y - rbr * 2 - schi;
  1219. if (kMaxYb)
  1220. maxTh = maxTh < (gr.x - rbr * 2 - kMin.y) ? maxTh : (gr.x - rbr * 2 - kMin.y);
  1221. if (hatStyle(Style::Closable))
  1222. maxTh = (gr.x - th - 5 - rbr * 2 - me.my + my) < 0 ? th : maxTh;
  1223. titel->setSize(titel->getBreite(), titel->getHeight() + me.my - my);
  1224. if (titel->getHeight() > maxTh)
  1225. titel->setSize(titel->getBreite(), maxTh);
  1226. else if (titel->getHeight() < 5)
  1227. titel->setSize(titel->getBreite(), 5);
  1228. else
  1229. mset = 1;
  1230. rend = 1;
  1231. ret1 = 1;
  1232. }
  1233. if (ret1)
  1234. {
  1235. if (mset)
  1236. mx = me.mx, my = me.my;
  1237. me.verarbeitet = 1;
  1238. }
  1239. if (hatStyle(Style::Beweglich) && (moving | 0x20) == moving) // move
  1240. {
  1241. pos.x += me.mx - mx;
  1242. pos.y += me.my - my;
  1243. rend = 1;
  1244. ret1 = 1;
  1245. }
  1246. if (ret1)
  1247. me.verarbeitet = 1;
  1248. }
  1249. }
  1250. if (me.id == ME_RLinks)
  1251. {
  1252. if (closeKlick)
  1253. rend = 1;
  1254. closeKlick = 0, klick = 0;
  1255. moving = 0;
  1256. mx = -1, my = -1;
  1257. }
  1258. if (me.id == ME_Leaves)
  1259. {
  1260. if (closeKlick != 0)
  1261. rend = 1;
  1262. closeKlick = 0, klick = 0;
  1263. }
  1264. if (hatStyleNicht(Style::Sichtbar) || !me.insideParent || me.verarbeitet || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y || !userRet)
  1265. return;
  1266. if (!me.verarbeitet)
  1267. {
  1268. if (me.id == ME_PLinks)
  1269. {
  1270. klick = 1;
  1271. mx = me.mx, my = me.my;
  1272. if (me.mx >= 0 && me.mx < gr.x && me.my >= 0 && me.my < rbr + 5)
  1273. moving |= 0x1;
  1274. if (me.mx >= 0 && me.mx < gr.x && me.my >= gr.y - (rbr + 5) && me.my < gr.y)
  1275. moving |= 0x2;
  1276. if (me.mx >= 0 && me.mx < rbr + 5 && me.my >= 0 && me.my < gr.y)
  1277. moving |= 0x4;
  1278. if (me.mx >= gr.x - rbr - 5 && me.mx < gr.x && me.my >= 0 && me.my < gr.y)
  1279. moving |= 0x8;
  1280. if (titel && me.mx >= 0 && me.mx < gr.x && me.my >= titel->getHeight() && me.my < titel->getHeight() + 2 * (rbr + 5))
  1281. moving |= 0x10;
  1282. if (titel && me.mx >= 0 && me.mx < gr.x && me.my >= rbr + 5 && me.my < titel->getHeight())
  1283. moving |= 0x20;
  1284. }
  1285. if (hatStyle(Style::Closable) && me.my <= th + rbr && me.mx >= gr.x + rbr - th && me.my >= rbr && me.mx <= gr.x - rbr)
  1286. {
  1287. if (!closingMe || closingMe(closingMeParam, this, me))
  1288. {
  1289. if (me.id == ME_PLinks)
  1290. {
  1291. closeKlick = 1;
  1292. rend = 1;
  1293. }
  1294. if (!closeKlick && MausStand[M_Links])
  1295. {
  1296. closeKlick = 1;
  1297. rend = 1;
  1298. }
  1299. me.verarbeitet = 1;
  1300. }
  1301. }
  1302. else if (closeKlick)
  1303. {
  1304. closeKlick = 0;
  1305. rend = 1;
  1306. }
  1307. }
  1308. if (members)
  1309. {
  1310. if (vSc)
  1311. {
  1312. vScroll->doMausMessage(gr.x - rbr - 16, rbr + th, 15, gr.y - rbr * 2 - th - 1, me);
  1313. if (hSc)
  1314. hScroll->doMausMessage(rbr, gr.y - rbr - 16, gr.x - rbr * 2 - 16, 15, me);
  1315. }
  1316. else
  1317. if (hSc)
  1318. hScroll->doMausMessage(rbr, gr.y - rbr - 16, gr.x - rbr * 2 - 1, 15, me);
  1319. me.mx -= rbr;
  1320. me.my -= rbr + th;
  1321. if (hatStyle(Style::VScroll) && vScroll)
  1322. me.my += vScroll->getScroll();
  1323. if (hatStyle(Style::HScroll) && hScroll)
  1324. me.mx += hScroll->getScroll();
  1325. if (me.id != ME_Betritt && me.id != ME_Leaves)
  1326. {
  1327. for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
  1328. members->z(i)->doPublicMausEreignis(me);
  1329. }
  1330. me.mx += rbr;
  1331. me.my += rbr + th;
  1332. if (hatStyle(Style::VScroll) && vScroll)
  1333. me.my -= vScroll->getScroll();
  1334. if (hatStyle(Style::HScroll) && hScroll)
  1335. me.mx -= hScroll->getScroll();
  1336. }
  1337. if (hatStyleNicht(Style::METransparenz))
  1338. me.verarbeitet = 1;
  1339. if (hatStyleNicht(Style::Erlaubt))
  1340. me.verarbeitet = mvtmp;
  1341. }
  1342. // nicht const
  1343. // -- Rahmen --
  1344. void Fenster::setRahmenZ(Rahmen* ram) // setzt den rahmen
  1345. {
  1346. if (rahmen)
  1347. rahmen->release();
  1348. rahmen = ram;
  1349. rend = 1;
  1350. }
  1351. void Fenster::setRFarbe(int f) // setzt die Rahmen Farbe
  1352. {
  1353. if (!rahmen)
  1354. rahmen = new LRahmen();
  1355. rahmen->setFarbe(f);
  1356. rend = 1;
  1357. }
  1358. void Fenster::setRBreite(int br) // setzt die Breite des Rahmens
  1359. {
  1360. if (!rahmen)
  1361. rahmen = new LRahmen();
  1362. rahmen->setRamenBreite(br);
  1363. rend = 1;
  1364. }
  1365. // -- Titel --
  1366. void Fenster::setTitel(Text* txt) // setzt den Titel
  1367. {
  1368. if (!titel)
  1369. titel = new TextFeld();
  1370. titel->setText(txt);
  1371. rend = 1;
  1372. }
  1373. void Fenster::setTitelZ(Text* txt)
  1374. {
  1375. if (!titel)
  1376. titel = new TextFeld();
  1377. titel->setTextZ(txt);
  1378. rend = 1;
  1379. }
  1380. void Fenster::setTitel(const char* txt)
  1381. {
  1382. if (!titel)
  1383. titel = new TextFeld();
  1384. titel->setText(txt);
  1385. rend = 1;
  1386. }
  1387. void Fenster::setTTextFeldZ(TextFeld* tf) // setzt das Titel TextFeld
  1388. {
  1389. if (titel)
  1390. titel->release();
  1391. titel = tf;
  1392. rend = 1;
  1393. }
  1394. // -- Schrift --
  1395. void Fenster::setTSchriftZ(Schrift* schrift) // setzt die Titel Schrift
  1396. {
  1397. if (!titel)
  1398. titel = new TextFeld();
  1399. titel->setSchriftZ(schrift);
  1400. rend = 1;
  1401. }
  1402. void Fenster::setTSFarbe(int f) // setzt die Titel Schrift Farbe
  1403. {
  1404. if (!titel)
  1405. titel = new TextFeld();
  1406. titel->setSchriftFarbe(f);
  1407. rend = 1;
  1408. }
  1409. void Fenster::setTSSize(int gr) // setzt die Titel Schrift Größe
  1410. {
  1411. if (!titel)
  1412. titel = new TextFeld();
  1413. titel->setSchriftSize((unsigned char)gr);
  1414. rend = 1;
  1415. }
  1416. // -- Titel Hintergrund --
  1417. void Fenster::setTBgFarbe(int f) // setzt Titel Hintergrund farbe
  1418. {
  1419. if (!titel)
  1420. titel = new TextFeld();
  1421. titel->setHintergrundFarbe(f);
  1422. rend = 1;
  1423. }
  1424. // -- Titel AlphaFeld --
  1425. void Fenster::setTAlphaFeldZ(AlphaFeld* af) // setzt das Titel AlphaFeld
  1426. {
  1427. if (!titel)
  1428. titel = new TextFeld();
  1429. titel->setAlphaFeldZ(af);
  1430. rend = 1;
  1431. }
  1432. void Fenster::setTAfFarbe(int f) // setzt die Titel AlphFeld Farbe
  1433. {
  1434. if (!titel)
  1435. titel = new TextFeld();
  1436. titel->setAlphaFeldFarbe(f);
  1437. rend = 1;
  1438. }
  1439. void Fenster::setTAfStrength(int st) // setzt die Stärke des Titel AlphaFeldes
  1440. {
  1441. if (!titel)
  1442. titel = new TextFeld();
  1443. titel->setAlphaFeldStrength(st);
  1444. rend = 1;
  1445. }
  1446. // -- Titel Hintergrund Bild --
  1447. void Fenster::setTBgBild(Bild* b) // setzt das Titel Hintergrund Bild
  1448. {
  1449. if (!titel)
  1450. titel = new TextFeld();
  1451. titel->setHintergrundBild(b);
  1452. rend = 1;
  1453. }
  1454. void Fenster::setTBgBildZ(Bild* b)
  1455. {
  1456. if (!titel)
  1457. titel = new TextFeld();
  1458. titel->setHintergrundBildZ(b);
  1459. rend = 1;
  1460. }
  1461. // -- Titel Rahmen --
  1462. void Fenster::setTRahmenZ(Rahmen* ram) // set Titel Rahmen
  1463. {
  1464. if (!titel)
  1465. titel = new TextFeld();
  1466. titel->setRahmenZ(ram);
  1467. rend = 1;
  1468. }
  1469. void Fenster::setTRFarbe(int f) // setzt die Titel Rahmen Farbe
  1470. {
  1471. if (!titel)
  1472. titel = new TextFeld();
  1473. titel->setRahmenFarbe(f);
  1474. rend = 1;
  1475. }
  1476. void Fenster::setTRBreite(int br) // setzt die Titel Rahmen Breite
  1477. {
  1478. if (!titel)
  1479. titel = new TextFeld();
  1480. titel->setRahmenBreite(br);
  1481. rend = 1;
  1482. }
  1483. // -- Körper Hintergrund --
  1484. void Fenster::setKBgFarbe(int f) // setzt die Körper Hintergrund Farbe
  1485. {
  1486. bgBodyColor = f;
  1487. rend = 1;
  1488. }
  1489. // -- Körper Hintergrund Bild --
  1490. void Fenster::setKBgBild(Bild* b) // setzt das Körper Hintergrund Bild
  1491. {
  1492. if (!bgBodyPicture)
  1493. bgBodyPicture = new Bild();
  1494. bgBodyPicture->neuBild(b->getBreite(), b->getHeight(), 0);
  1495. int* buff1 = bgBodyPicture->getBuffer();
  1496. int* buff2 = b->getBuffer();
  1497. int gr = bgBodyPicture->getBreite() * bgBodyPicture->getHeight();
  1498. for (int i = 0; i < gr; ++i)
  1499. buff1[i] = buff2[i];
  1500. b->release();
  1501. rend = 1;
  1502. }
  1503. void Fenster::setKBgBildZ(Bild* b)
  1504. {
  1505. if (bgBodyPicture)
  1506. bgBodyPicture->release();
  1507. bgBodyPicture = b;
  1508. rend = 1;
  1509. }
  1510. // -- Körper AlphaFeld --
  1511. void Fenster::setKAlphaFeldZ(AlphaFeld* af) // setzt das Körper AlphaFeld
  1512. {
  1513. if (bodyBuffer)
  1514. bodyBuffer->release();
  1515. bodyBuffer = af;
  1516. rend = 1;
  1517. }
  1518. void Fenster::setKAfFarbe(int f) // setzt Körper AlphaFeld Farbe
  1519. {
  1520. if (!bodyBuffer)
  1521. bodyBuffer = new AlphaFeld();
  1522. bodyBuffer->setFarbe(f);
  1523. rend = 1;
  1524. }
  1525. void Fenster::setKAfStrength(int st) // setzt die Stärke des Körper AlphaFeldes
  1526. {
  1527. if (!bodyBuffer)
  1528. bodyBuffer = new AlphaFeld();
  1529. bodyBuffer->setStrength(st);
  1530. rend = 1;
  1531. }
  1532. // -- Schließen --
  1533. void Fenster::setClosingMeParam(void* param)
  1534. {
  1535. closingMeParam = param;
  1536. }
  1537. void Fenster::setClosingMe(MausAktion closingMe) // setzt das Schließen Mausereignis
  1538. {
  1539. this->closingMe = closingMe;
  1540. }
  1541. // -- Schließen Hintergrund --
  1542. void Fenster::setSBgFarbe(int f) // setzt die Schließ Hintergrund Farbe
  1543. {
  1544. bgClosingFarbe = f;
  1545. rend = 1;
  1546. }
  1547. // -- Schließen Hintergrund Bild --
  1548. void Fenster::setSBgBild(Bild* b) // setzt das Schließ Hintergrund Bild
  1549. {
  1550. if (!bgClosingBild)
  1551. bgClosingBild = new Bild();
  1552. bgClosingBild->neuBild(b->getBreite(), b->getHeight(), 0);
  1553. int* buff1 = bgClosingBild->getBuffer();
  1554. int* buff2 = b->getBuffer();
  1555. int gr = bgClosingBild->getBreite() * bgClosingBild->getHeight();
  1556. for (int i = 0; i < gr; ++i)
  1557. buff1[i] = buff2[i];
  1558. b->release();
  1559. rend = 1;
  1560. }
  1561. void Fenster::setSBgBildZ(Bild* b)
  1562. {
  1563. if (bgClosingBild)
  1564. bgClosingBild->release();
  1565. bgClosingBild = b;
  1566. rend = 1;
  1567. }
  1568. // -- Schließen AlphaFeld --
  1569. void Fenster::setSAlphaFeldZ(AlphaFeld* af) // setzt das Schließ AlphaFeld
  1570. {
  1571. if (closeBuffer)
  1572. closeBuffer->release();
  1573. closeBuffer = af;
  1574. rend = 1;
  1575. }
  1576. void Fenster::setSAfFarbe(int f) // setzt die Farbe des Schließ AlphaFeldes
  1577. {
  1578. if (!closeBuffer)
  1579. closeBuffer = new AlphaFeld();
  1580. closeBuffer->setFarbe(f);
  1581. rend = 1;
  1582. }
  1583. void Fenster::setSAfStrength(int st) // setzt die Stärke des Schließ AlphaFeldes
  1584. {
  1585. if (!closeBuffer)
  1586. closeBuffer = new AlphaFeld();
  1587. closeBuffer->setStrength(st);
  1588. rend = 1;
  1589. }
  1590. // -- Schließen Klick AlphaFeld --
  1591. void Fenster::setSKAlphaFeldZ(AlphaFeld* af) // setzt das Schließ klick AlphaFeld
  1592. {
  1593. if (closeKlickBuffer)
  1594. closeKlickBuffer->release();
  1595. closeKlickBuffer = af;
  1596. rend = 1;
  1597. }
  1598. void Fenster::setSKAfFarbe(int f) // setzt die Farbe des Schließ klick AlphaFeldes
  1599. {
  1600. if (!closeKlickBuffer)
  1601. closeKlickBuffer = new AlphaFeld();
  1602. closeKlickBuffer->setFarbe(f);
  1603. rend = 1;
  1604. }
  1605. void Fenster::setSKAfStrength(int st) // setzt die Stärke des Schließ klick AlphaFeldes
  1606. {
  1607. if (!closeKlickBuffer)
  1608. closeKlickBuffer = new AlphaFeld();
  1609. closeKlickBuffer->setStrength(st);
  1610. rend = 1;
  1611. }
  1612. // -- min max --
  1613. void Fenster::setMin(int mx, int my) // setzt die Mindest Fenster Größe
  1614. {
  1615. min.x = mx;
  1616. min.y = my;
  1617. }
  1618. void Fenster::setMin(const Punkt& min)
  1619. {
  1620. this->min = min;
  1621. }
  1622. void Fenster::setMax(int mx, int my) // setzt die Maximale Fenster Größe
  1623. {
  1624. max.x = mx;
  1625. max.y = my;
  1626. }
  1627. void Fenster::setMax(const Punkt& max)
  1628. {
  1629. this->max = max;
  1630. }
  1631. void Fenster::setKMin(int mx, int my) // setzt die Mindest Körper Größe
  1632. {
  1633. kMin.x = mx;
  1634. kMin.y = my;
  1635. }
  1636. void Fenster::setKMin(const Punkt& min)
  1637. {
  1638. kMin = min;
  1639. }
  1640. void Fenster::setKMax(int mx, int my) // setzt die Maximale Körper Größe
  1641. {
  1642. kMax.x = mx;
  1643. kMax.y = my;
  1644. }
  1645. void Fenster::setKMax(const Punkt& max)
  1646. {
  1647. kMax = max;
  1648. }
  1649. // -- scroll --
  1650. void Fenster::setHScrollBarZ(HScrollBar* hScroll) // setzt die Horizontale Scroll Bar
  1651. {
  1652. if (this->hScroll)
  1653. this->hScroll->release();
  1654. this->hScroll = hScroll;
  1655. rend = 1;
  1656. }
  1657. void Fenster::setVScrollBarZ(VScrollBar* vScroll) // setzt die Vertikale Scroll BAr
  1658. {
  1659. if (this->vScroll)
  1660. this->vScroll->release();
  1661. this->vScroll = vScroll;
  1662. rend = 1;
  1663. }
  1664. void Fenster::setHSBMax(int max) // setzt das Scroll Maximum
  1665. {
  1666. if (!hScroll)
  1667. hScroll = new HScrollBar();
  1668. int rbr = 0;
  1669. if (hatStyle(Style::Rahmen) && rahmen)
  1670. rbr = rahmen->getRBreite();
  1671. int vsh = 0;
  1672. if (hatStyle(Style::VScroll) && vScroll)
  1673. vsh = 15;
  1674. hScroll->update(max, gr.x - rbr * 2 - vsh);
  1675. rend = 1;
  1676. }
  1677. void Fenster::setVSBMax(int max)
  1678. {
  1679. if (!vScroll)
  1680. vScroll = new VScrollBar();
  1681. int rbr = 0;
  1682. int th = 0;
  1683. if (hatStyle(Style::Rahmen) && rahmen)
  1684. rbr = rahmen->getRBreite();
  1685. if (hatStyle(Style::Titel) && titel)
  1686. th = titel->getHeight();
  1687. int hsh = 0;
  1688. if (hatStyle(Style::HScroll) && hScroll)
  1689. hsh = 15;
  1690. vScroll->update(max, gr.y - rbr * 2 - th - hsh);
  1691. rend = 1;
  1692. }
  1693. void Fenster::setHSBScroll(int scroll) // setzt die momentane Scroll Position
  1694. {
  1695. if (!hScroll)
  1696. hScroll = new HScrollBar();
  1697. hScroll->scroll(scroll);
  1698. rend = 1;
  1699. }
  1700. void Fenster::setVSBScroll(int scroll)
  1701. {
  1702. if (!vScroll)
  1703. vScroll = new VScrollBar();
  1704. vScroll->scroll(scroll);
  1705. rend = 1;
  1706. }
  1707. // -- Members --
  1708. void Fenster::addMember(Zeichnung* obj) // fügt einen Member hinzu
  1709. {
  1710. if (!members)
  1711. members = new RCArray<Zeichnung>();
  1712. members->add(obj);
  1713. rend = 1;
  1714. }
  1715. void Fenster::removeMember(Zeichnung* zObj) // entfernt einen Member
  1716. {
  1717. if (!members)
  1718. return;
  1719. for (int i = 0; i < members->getEintragAnzahl(); i++)
  1720. {
  1721. if (members->z(i) == zObj)
  1722. {
  1723. members->remove(i);
  1724. rend = 1;
  1725. }
  1726. }
  1727. }
  1728. void Fenster::removeAll()
  1729. {
  1730. if (!members)
  1731. return;
  1732. members->leeren();
  1733. rend = 1;
  1734. }
  1735. // -- Messages --
  1736. bool Fenster::tick(double tickval) // tick
  1737. {
  1738. if (members && hatStyle(Style::Sichtbar))
  1739. {
  1740. for (Zeichnung* i : *members)
  1741. rend |= i->tick(tickval);
  1742. }
  1743. else if (members)
  1744. {
  1745. for (Zeichnung* i : *members)
  1746. i->tick(tickval);
  1747. }
  1748. if (vScroll && hatStyle(Style::VScroll))
  1749. rend |= vScroll->getRend();
  1750. if (hScroll && hatStyle(Style::HScroll))
  1751. rend |= hScroll->getRend();
  1752. return Zeichnung::tick(tickval);
  1753. }
  1754. void Fenster::doTastaturEreignis(TastaturEreignis& te)
  1755. {
  1756. bool ntakc = !te.verarbeitet;
  1757. if (hatStyle(Style::Sichtbar))
  1758. {
  1759. if (te.verarbeitet)
  1760. {
  1761. if (members)
  1762. {
  1763. for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
  1764. members->z(i)->doTastaturEreignis(te);
  1765. }
  1766. }
  1767. else
  1768. {
  1769. if (tak && tak(takParam, this, te))
  1770. {
  1771. if (members)
  1772. {
  1773. for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
  1774. members->z(i)->doTastaturEreignis(te);
  1775. }
  1776. }
  1777. }
  1778. }
  1779. if (ntakc && te.verarbeitet && nTak)
  1780. te.verarbeitet = nTak(ntakParam, this, te);
  1781. }
  1782. // -- Render --
  1783. void Fenster::render(Bild& zRObj) // zeichent nach zRObj
  1784. {
  1785. if (hatStyle(Style::Sichtbar))
  1786. {
  1787. lockZeichnung();
  1788. if (!zRObj.setDrawOptions(pos, gr))
  1789. {
  1790. unlockZeichnung();
  1791. return;
  1792. }
  1793. Zeichnung::render(zRObj);
  1794. int rbr = 0;
  1795. if (hatStyle(Style::Rahmen) && rahmen)
  1796. {
  1797. rahmen->setSize(gr);
  1798. rahmen->render(zRObj);
  1799. rbr = rahmen->getRBreite();
  1800. }
  1801. int th = 0;
  1802. if (titel)
  1803. titel->setStyle(TextFeld::Style::Sichtbar, hatStyle(Style::Titel));
  1804. if (hatStyle(Style::Titel) && titel)
  1805. {
  1806. titel->setStyle(TextFeld::Style::Hintergrund, hatStyle(Style::TitelHintergrund));
  1807. titel->setStyle(TextFeld::Style::HAlpha, hatStyle(Style::TitelHAlpha));
  1808. titel->setStyle(TextFeld::Style::HBild, hatStyle(Style::TitelHBild));
  1809. titel->setStyle(TextFeld::Style::Buffered, hatStyle(Style::TitelBuffered));
  1810. th = titel->getHeight();
  1811. if (!zRObj.setDrawOptions(rbr, rbr, gr.x - rbr * 2, th))
  1812. {
  1813. zRObj.releaseDrawOptions();
  1814. unlockZeichnung();
  1815. return;
  1816. }
  1817. int sbr = 0;
  1818. if (hatStyle(Style::Closable))
  1819. {
  1820. sbr = th;
  1821. if (hatStyle(Style::ClosingHintergrund))
  1822. {
  1823. if (hatStyle(Style::ClosingHAlpha))
  1824. zRObj.alphaRegion(gr.x - th - rbr * 2, 0, th, th, bgClosingFarbe);
  1825. else
  1826. zRObj.fillRegion(gr.x - th - rbr * 2, 0, th, th, bgClosingFarbe);
  1827. if (hatStyle(Style::ClosingHBild) && bgClosingBild)
  1828. {
  1829. if (hatStyle(Style::ClosingHAlpha))
  1830. zRObj.alphaBild(gr.x - th - rbr * 2, 0, th, th, *bgClosingBild);
  1831. else
  1832. zRObj.drawBild(gr.x - th - rbr * 2, 0, th, th, *bgClosingBild);
  1833. }
  1834. }
  1835. if (!hatStyle(Style::ClosingHBild) || !bgClosingBild)
  1836. {
  1837. zRObj.drawLinie(Punkt(gr.x - th - rbr * 2, 0), Punkt(gr.x - rbr * 2, th), 0xFFFFFFFF);
  1838. zRObj.drawLinie(Punkt(gr.x - rbr * 2, 0), Punkt(gr.x - th - rbr * 2, th), 0xFFFFFFFF);
  1839. }
  1840. if (hatStyle(Style::ClosingBuffer) && closeBuffer)
  1841. {
  1842. closeBuffer->setPosition(gr.x - th - rbr * 2, 0);
  1843. closeBuffer->setSize(th, th);
  1844. closeBuffer->render(zRObj);
  1845. }
  1846. if (hatStyle(Style::ClosingKlickBuffer) && closeKlickBuffer && closeKlick)
  1847. {
  1848. closeKlickBuffer->setPosition(gr.x - th - rbr * 2, 0);
  1849. closeKlickBuffer->setSize(th, th);
  1850. closeKlickBuffer->render(zRObj);
  1851. }
  1852. }
  1853. titel->setSize(gr.x - rbr * 2 - sbr, th);
  1854. titel->render(zRObj);
  1855. zRObj.releaseDrawOptions();
  1856. }
  1857. bool vSc = hatStyle(Style::VScroll) && vScroll;
  1858. bool hSc = hatStyle(Style::HScroll) && hScroll;
  1859. if (vSc)
  1860. {
  1861. vScroll->render(gr.x - rbr - 16, rbr + th, 15, gr.y - rbr * 2 - th - 1, zRObj);
  1862. if (hSc)
  1863. hScroll->render(rbr, gr.y - rbr - 16, gr.x - rbr * 2 - 16, 15, zRObj);
  1864. }
  1865. else
  1866. if (hSc)
  1867. hScroll->render(rbr, gr.y - rbr - 16, gr.x - rbr * 2 - 1, 15, zRObj);
  1868. int x = rbr;
  1869. int y = rbr + th;
  1870. int br = gr.x - rbr * 2;
  1871. int hi = gr.y - rbr * 2 - th;
  1872. if (vSc)
  1873. br -= 16;
  1874. if (hSc)
  1875. hi -= 16;
  1876. if (!zRObj.setDrawOptions(x, y, br, hi))
  1877. {
  1878. zRObj.releaseDrawOptions();
  1879. unlockZeichnung();
  1880. return;
  1881. }
  1882. if (hatStyle(Style::BodyHintergrund))
  1883. {
  1884. if (hatStyle(Style::BodyHAlpha))
  1885. zRObj.alphaRegion(0, 0, br, hi, bgBodyColor);
  1886. else
  1887. zRObj.fillRegion(0, 0, br, hi, bgBodyColor);
  1888. if (hatStyle(Style::BodyHBild) && bgBodyPicture)
  1889. {
  1890. if (hatStyle(Style::BodyHAlpha))
  1891. zRObj.alphaBild(0, 0, br, hi, *bgBodyPicture);
  1892. else
  1893. zRObj.drawBild(0, 0, br, hi, *bgBodyPicture);
  1894. }
  1895. }
  1896. if (hatStyle(Style::BodyBuffered) && bodyBuffer)
  1897. {
  1898. bodyBuffer->setSize(br, hi);
  1899. bodyBuffer->render(zRObj);
  1900. }
  1901. if (members)
  1902. {
  1903. if (!vSc && !hSc)
  1904. {
  1905. for (Zeichnung* i : *members)
  1906. i->render(zRObj);
  1907. }
  1908. else
  1909. {
  1910. zRObj.addScrollOffset(hSc ? hScroll->getScroll() : 0, vSc ? vScroll->getScroll() : 0);
  1911. for (Zeichnung* i : *members)
  1912. i->render(zRObj);
  1913. }
  1914. }
  1915. zRObj.releaseDrawOptions();
  1916. zRObj.releaseDrawOptions();
  1917. unlockZeichnung();
  1918. }
  1919. }
  1920. // constant
  1921. // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
  1922. int Fenster::getInnenBreite() const
  1923. {
  1924. return getBreite() - 2 * getRBreite();
  1925. }
  1926. // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
  1927. int Fenster::getInnenHeight() const
  1928. {
  1929. int th = 0;
  1930. if (hatStyle(Style::Titel) && titel)
  1931. th += titel->getHeight();
  1932. return getHeight() - 2 * getRBreite() - th;
  1933. }
  1934. // -- Rahmen --
  1935. Rahmen* Fenster::getRahmen() const // gibt den Rahmen zurück
  1936. {
  1937. if (!rahmen)
  1938. return 0;
  1939. return dynamic_cast<Rahmen*>(rahmen->getThis());
  1940. }
  1941. Rahmen* Fenster::zRahmen() const
  1942. {
  1943. return rahmen;
  1944. }
  1945. int Fenster::getRFarbe() const // gibt die Farbe des Rahmens zurück
  1946. {
  1947. if (!rahmen)
  1948. return 0;
  1949. return rahmen->getFarbe();
  1950. }
  1951. int Fenster::getRBreite() const // gibt die breite des Rahmens zurück
  1952. {
  1953. if (!rahmen || hatStyleNicht(Style::Rahmen))
  1954. return 0;
  1955. return rahmen->getRBreite();
  1956. }
  1957. // -- Titel --
  1958. Text* Fenster::getTitel() const // gibt den Titel zurück
  1959. {
  1960. if (!titel)
  1961. return 0;
  1962. return titel->getText();
  1963. }
  1964. Text* Fenster::zTitel() const
  1965. {
  1966. if (!titel)
  1967. return 0;
  1968. return titel->zText();
  1969. }
  1970. TextFeld* Fenster::getTTextFeld() const // gibt das Titel TextFeld zurück
  1971. {
  1972. if (!titel)
  1973. return 0;
  1974. return dynamic_cast<TextFeld*>(titel->getThis());
  1975. }
  1976. TextFeld* Fenster::zTTextFeld() const
  1977. {
  1978. return titel;
  1979. }
  1980. // -- Titel Schrift --
  1981. Schrift* Fenster::getTSchrift() const // gibt die Titel Schrift zurück
  1982. {
  1983. if (!titel)
  1984. return 0;
  1985. return titel->getSchrift();
  1986. }
  1987. Schrift* Fenster::zTSchrift() const
  1988. {
  1989. if (!titel)
  1990. return 0;
  1991. return titel->zSchrift();
  1992. }
  1993. int Fenster::getTSFarbe() const // gibt die Titel Schrift Farbe zurück
  1994. {
  1995. if (!titel)
  1996. return 0;
  1997. return titel->getSchriftFarbe();
  1998. }
  1999. int Fenster::getTSSize() const // gibt die Titel Schrift Größe zurück
  2000. {
  2001. if (!titel)
  2002. return 0;
  2003. return titel->getSchriftSize();
  2004. }
  2005. // -- Titel Hintergrund --
  2006. int Fenster::getTBgFarbe() const // gibt die Titel Hintergrund Farbe zurück
  2007. {
  2008. if (!titel)
  2009. return 0;
  2010. return titel->getHintergrundFarbe();
  2011. }
  2012. // -- Titel AlphaFeld --
  2013. AlphaFeld* Fenster::getTAlphaFeld() const // gibt das Titel AlphaFeld zurück
  2014. {
  2015. if (!titel)
  2016. return 0;
  2017. return titel->getAlphaFeld();
  2018. }
  2019. AlphaFeld* Fenster::zTAlphaFeld() const
  2020. {
  2021. if (!titel)
  2022. return 0;
  2023. return titel->zAlphaFeld();
  2024. }
  2025. int Fenster::getTAfFarbe() const // gibt die Farbe des Titel AlphaFeldes zurück
  2026. {
  2027. if (!titel)
  2028. return 0;
  2029. return titel->getAlphaFeldFarbe();
  2030. }
  2031. int Fenster::getTAfStrength() const // gibt die Stärke des TitelAlphaFeldes zurück
  2032. {
  2033. if (!titel)
  2034. return 0;
  2035. return titel->getAlphaFeldStrength();
  2036. }
  2037. // -- Titel Hintergrund Bild --
  2038. Bild* Fenster::getTBgBild() const // gibt das Titel Hintergrund Bild zurück
  2039. {
  2040. if (!titel)
  2041. return 0;
  2042. return titel->getHintergrundBild();
  2043. }
  2044. Bild* Fenster::zTBgBild() const
  2045. {
  2046. if (!titel)
  2047. return 0;
  2048. return titel->zHintergrundBild();
  2049. }
  2050. // -- Titel Rahmen --
  2051. Rahmen* Fenster::getTRahmen() const // gibt den Titel Rahmen zurück
  2052. {
  2053. if (!titel)
  2054. return 0;
  2055. return titel->getRahmen();
  2056. }
  2057. Rahmen* Fenster::zTRahmen() const
  2058. {
  2059. if (!titel)
  2060. return 0;
  2061. return titel->zRahmen();
  2062. }
  2063. int Fenster::getTRFarbe() const // gibt die Farbe des Titel Rahmens zurück
  2064. {
  2065. if (!titel)
  2066. return 0;
  2067. return titel->getRahmenFarbe();
  2068. }
  2069. int Fenster::getTRBreite() const // gibt die Breite des Titel Rahmens zurück
  2070. {
  2071. if (!titel)
  2072. return 0;
  2073. return titel->getRahmenBreite();
  2074. }
  2075. // -- Körper Hintergrund --
  2076. int Fenster::getKBgFarbe() const // gibt die Körper Hintergrund Farbe zurück
  2077. {
  2078. return bgBodyColor;
  2079. }
  2080. // -- Körper Hintergrund Bild --
  2081. Bild* Fenster::getKBgBild() const // gibt das Körper Hintergrund Bild zurück
  2082. {
  2083. if (!bgBodyPicture)
  2084. return 0;
  2085. return dynamic_cast<Bild*>(bgBodyPicture->getThis());
  2086. }
  2087. Bild* Fenster::zKBgBild() const
  2088. {
  2089. return bgBodyPicture;
  2090. }
  2091. // -- Körper AlphaFeld --
  2092. AlphaFeld* Fenster::getKAlphaFeld() const // gibt das Körper AlphaFeld zurück
  2093. {
  2094. if (!bodyBuffer)
  2095. return 0;
  2096. return dynamic_cast<AlphaFeld*>(bodyBuffer->getThis());
  2097. }
  2098. AlphaFeld* Fenster::zKAlphaFeld() const
  2099. {
  2100. return bodyBuffer;
  2101. }
  2102. int Fenster::getKAfFarbe() const // gibt die Farbe des Körper AlphaFeldes zurück
  2103. {
  2104. if (!bodyBuffer)
  2105. return 0;
  2106. return bodyBuffer->getFarbe();
  2107. }
  2108. int Fenster::getKAfStrength() const // gibt die Stärke des Körper AlphaFeldes zurück
  2109. {
  2110. if (!bodyBuffer)
  2111. return 0;
  2112. return bodyBuffer->getStrength();
  2113. }
  2114. // -- Schließen Hintergrund --
  2115. int Fenster::getSBgFarbe() const // gibt die Schließ Hintergrund Farbe zurück
  2116. {
  2117. return bgClosingFarbe;
  2118. }
  2119. // -- Schließen Hintergrund Bild --
  2120. Bild* Fenster::getSBgBild() const // gibt das Schließ Hintergrund Bild zurück
  2121. {
  2122. if (!bgClosingBild)
  2123. return 0;
  2124. return dynamic_cast<Bild*>(bgClosingBild->getThis());
  2125. }
  2126. Bild* Fenster::zSBgBild() const
  2127. {
  2128. return bgClosingBild;
  2129. }
  2130. // -- Schließen AlphaFeld --
  2131. AlphaFeld* Fenster::getSAlphaFeld() const // gibt das Schließ AlphaFeld zurück
  2132. {
  2133. if (!closeBuffer)
  2134. return 0;
  2135. return dynamic_cast<AlphaFeld*>(closeBuffer->getThis());
  2136. }
  2137. AlphaFeld* Fenster::zSAlphaFeld() const
  2138. {
  2139. return closeBuffer;
  2140. }
  2141. int Fenster::getSAfFarbe() const // gibt die Farbe des Schließ AlphaFeldes zurück
  2142. {
  2143. if (!closeBuffer)
  2144. return 0;
  2145. return closeBuffer->getFarbe();
  2146. }
  2147. int Fenster::getSAfStrength() const // gibt die Stärke des Schließ AlphaFeldes zurück
  2148. {
  2149. if (!closeBuffer)
  2150. return 0;
  2151. return closeBuffer->getStrength();
  2152. }
  2153. // -- Schließen Klick AlphaFeld --
  2154. AlphaFeld* Fenster::getSKAlphaFeld() const // gibt das Schließ Klick AlphaFeld zurück
  2155. {
  2156. if (!closeKlickBuffer)
  2157. return 0;
  2158. return dynamic_cast<AlphaFeld*>(closeKlickBuffer->getThis());
  2159. }
  2160. AlphaFeld* Fenster::zSKAlphaFeld() const
  2161. {
  2162. return closeKlickBuffer;
  2163. }
  2164. int Fenster::getSKAfFarbe() const // gibt die Farbe des Schließ Klick AlphaFeldes zurück
  2165. {
  2166. if (!closeKlickBuffer)
  2167. return 0;
  2168. return closeKlickBuffer->getFarbe();
  2169. }
  2170. int Fenster::getSKAfStrength() const // gibt die Stärke des Schließ Klick AlphaFeldes zurück
  2171. {
  2172. if (!closeKlickBuffer)
  2173. return 0;
  2174. return closeKlickBuffer->getStrength();
  2175. }
  2176. // -- min max --
  2177. const Punkt& Fenster::getMin() const // gibt die minimale Fenstergröße zurück
  2178. {
  2179. return min;
  2180. }
  2181. const Punkt& Fenster::getMax() const // gibt die maximale Fenstergröße zurück
  2182. {
  2183. return max;
  2184. }
  2185. const Punkt& Fenster::getKMin() const // gibt die minimale Fenstergröße zurück
  2186. {
  2187. return kMin;
  2188. }
  2189. const Punkt& Fenster::getKMax() const // gibt die maximale Fenstergröße zurück
  2190. {
  2191. return kMax;
  2192. }
  2193. // -- scroll --
  2194. VScrollBar* Fenster::getVScrollBar() const // gibt die Vertikale Scroll Bar zurück
  2195. {
  2196. if (!vScroll)
  2197. return 0;
  2198. return dynamic_cast<VScrollBar*>(vScroll->getThis());
  2199. }
  2200. VScrollBar* Fenster::zVScrollBar() const
  2201. {
  2202. return vScroll;
  2203. }
  2204. HScrollBar* Fenster::getHScrollBar() const // gibt die Horizontale Scroll Bar zurück
  2205. {
  2206. if (!hScroll)
  2207. return 0;
  2208. return dynamic_cast<HScrollBar*>(hScroll->getThis());
  2209. }
  2210. HScrollBar* Fenster::zHScrollBar() const
  2211. {
  2212. return hScroll;
  2213. }
  2214. // -- Members --
  2215. Iterator<Zeichnung*> Fenster::getMembers() const // gibt die Members zurück
  2216. {
  2217. if (!members)
  2218. return Iterator<Zeichnung*>(0);
  2219. return members->begin();
  2220. }
  2221. // -- Kopie --
  2222. Zeichnung* Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
  2223. {
  2224. Fenster* ret = new Fenster();
  2225. ret->setPosition(pos);
  2226. ret->setSize(gr);
  2227. ret->setMausEreignisParameter(makParam);
  2228. ret->setTastaturEreignisParameter(takParam);
  2229. ret->setMausEreignis(mak);
  2230. ret->setTastaturEreignis(tak);
  2231. if (toolTip)
  2232. ret->setToolTipZ((ToolTip*)toolTip->dublizieren());
  2233. ret->setStyle(style);
  2234. ret->setClosingMeParam(closingMeParam);
  2235. ret->setClosingMe(closingMe);
  2236. if (rahmen)
  2237. {
  2238. ret->setRBreite(rahmen->getRBreite());
  2239. ret->setRFarbe(rahmen->getFarbe());
  2240. }
  2241. if (titel)
  2242. ret->setTTextFeldZ((TextFeld*)titel->dublizieren());
  2243. ret->setKBgFarbe(bgBodyColor);
  2244. if (bgBodyPicture)
  2245. ret->setKBgBild(dynamic_cast<Bild*>(bgBodyPicture->getThis()));
  2246. if (bodyBuffer)
  2247. {
  2248. ret->setKAfFarbe(bodyBuffer->getFarbe());
  2249. ret->setKAfStrength(bodyBuffer->getStrength());
  2250. }
  2251. ret->setSBgFarbe(bgClosingFarbe);
  2252. if (bgClosingBild)
  2253. ret->setSBgBild(dynamic_cast<Bild*>(bgClosingBild->getThis()));
  2254. if (closeBuffer)
  2255. {
  2256. ret->setSAfFarbe(closeBuffer->getFarbe());
  2257. ret->setSAfStrength(closeBuffer->getStrength());
  2258. }
  2259. if (closeKlickBuffer)
  2260. {
  2261. ret->setSKAfFarbe(closeKlickBuffer->getFarbe());
  2262. ret->setSKAfStrength(closeKlickBuffer->getStrength());
  2263. }
  2264. if (vScroll)
  2265. {
  2266. ret->setVSBMax(vScroll->getScrollData()->max);
  2267. ret->setVSBScroll(vScroll->getScroll());
  2268. }
  2269. if (hScroll)
  2270. {
  2271. ret->setHSBMax(hScroll->getScrollData()->max);
  2272. ret->setHSBScroll(hScroll->getScroll());
  2273. }
  2274. ret->setMin(min);
  2275. ret->setMax(max);
  2276. ret->setKMin(kMin);
  2277. ret->setKMax(kMax);
  2278. return ret;
  2279. }