Fenster.cpp 63 KB

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