Fenster.cpp 66 KB

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