Fenster.cpp 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058
  1. #include "Fenster.h"
  2. #include "Punkt.h"
  3. #include "Text.h"
  4. #include "MausEreignis.h"
  5. #include "TastaturEreignis.h"
  6. #include "Bildschirm.h"
  7. #include "Bild.h"
  8. #include "Farbe.h"
  9. #include "Rahmen.h"
  10. #include "TextFeld.h"
  11. #include "Maus.h"
  12. #include "Globals.h"
  13. using namespace Framework;
  14. // Fensterklasse erzeugen
  15. WNDCLASS Framework::F_Normal( HINSTANCE hInst )// Erzeugen einer normalen Fensterklasse
  16. {
  17. WNDCLASS ret;
  18. ret.cbClsExtra = 0;
  19. ret.cbWndExtra = 0;
  20. ret.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  21. ret.hCursor = LoadCursor(NULL,IDC_ARROW);
  22. ret.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  23. ret.hInstance = hInst;
  24. ret.lpszMenuName = "";
  25. ret.lpfnWndProc = WindowProc;
  26. ret.style = CS_HREDRAW | CS_VREDRAW;
  27. return ret;
  28. }
  29. WNDCLASSEX Framework::F_NormalEx( HINSTANCE hInst )
  30. {
  31. WNDCLASSEX ret;
  32. ret.cbSize = sizeof( WNDCLASSEX );
  33. ret.cbClsExtra = 0;
  34. ret.cbWndExtra = 0;
  35. ret.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  36. ret.hCursor = LoadCursor(NULL,IDC_ARROW);
  37. ret.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  38. ret.hInstance = hInst;
  39. ret.lpszMenuName = "";
  40. ret.lpfnWndProc = WindowProc;
  41. ret.style = CS_HREDRAW | CS_VREDRAW;
  42. ret.hIconSm = 0;
  43. return ret;
  44. }
  45. // WinAPI
  46. LRESULT CALLBACK Framework::WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  47. {
  48. switch( message )
  49. {
  50. // Device
  51. case WM_SETCURSOR:
  52. return 0;
  53. // Fenster
  54. case WM_SIZE:
  55. if( wparam == SIZE_RESTORED )
  56. WFensterA.sendRestoreMessage( hwnd );
  57. break;
  58. // Schließen
  59. case WM_CLOSE:
  60. if( WFensterA.sendVSchließMessage( hwnd ) )
  61. return 0;
  62. else
  63. break;
  64. case WM_DESTROY:
  65. if( WFensterA.sendNSchließMessage( hwnd ) )
  66. return 0;
  67. else
  68. break;
  69. // Maus
  70. case WM_LBUTTONDOWN: // Linksklick
  71. {
  72. MausStand[ M_Links ] = 1;
  73. MausEreignis me;
  74. me.id = ME_PLinks;
  75. me.mx = (int)(short)LOWORD( lparam );
  76. me.my = (int)(short)HIWORD( lparam );
  77. me.verarbeitet = 0;
  78. WFensterA.sendMausMessage( hwnd, &me );
  79. break;
  80. }
  81. case WM_RBUTTONDOWN: // Rechtsklick
  82. {
  83. MausStand[ M_Rechts ] = 1;
  84. MausEreignis me;
  85. me.id = ME_PRechts;
  86. me.mx = (int)(short)LOWORD( lparam );
  87. me.my = (int)(short)HIWORD( lparam );
  88. me.verarbeitet = 0;
  89. WFensterA.sendMausMessage( hwnd, &me );
  90. break;
  91. }
  92. case WM_MBUTTONDOWN: // Mittelklick
  93. {
  94. MausStand[ M_Mitte ] = 1;
  95. MausEreignis me;
  96. me.id = ME_PMitte;
  97. me.mx = (int)(short)LOWORD( lparam );
  98. me.my = (int)(short)HIWORD( lparam );
  99. me.verarbeitet = 0;
  100. WFensterA.sendMausMessage( hwnd, &me );
  101. break;
  102. }
  103. case WM_LBUTTONUP: // Linksrelease
  104. {
  105. MausStand[ M_Links ] = 0;
  106. MausEreignis me;
  107. me.id = ME_RLinks;
  108. me.mx = (int)(short)LOWORD( lparam );
  109. me.my = (int)(short)HIWORD( lparam );
  110. me.verarbeitet = 0;
  111. WFensterA.sendMausMessage( hwnd, &me );
  112. break;
  113. }
  114. case WM_RBUTTONUP: // Rechtsrelease
  115. {
  116. MausStand[ M_Rechts ] = 0;
  117. MausEreignis me;
  118. me.id = ME_RRechts;
  119. me.mx = (int)(short)LOWORD( lparam );
  120. me.my = (int)(short)HIWORD( lparam );
  121. me.verarbeitet = 0;
  122. WFensterA.sendMausMessage( hwnd, &me );
  123. break;
  124. }
  125. case WM_MBUTTONUP: // Mittelrelease
  126. {
  127. MausStand[ M_Mitte ] = 0;
  128. MausEreignis me;
  129. me.id = ME_RMitte;
  130. me.mx = (int)(short)LOWORD( lparam );
  131. me.my = (int)(short)HIWORD( lparam );
  132. me.verarbeitet = 0;
  133. WFensterA.sendMausMessage( hwnd, &me );
  134. break;
  135. }
  136. case WM_LBUTTONDBLCLK: // Linksdoppelklick
  137. {
  138. MausEreignis me;
  139. me.id = ME_DKLinks;
  140. me.mx = (int)(short)LOWORD( lparam );
  141. me.my = (int)(short)HIWORD( lparam );
  142. me.verarbeitet = 0;
  143. WFensterA.sendMausMessage( hwnd, &me );
  144. break;
  145. }
  146. case WM_RBUTTONDBLCLK: // Rechtsdoppelklick
  147. {
  148. MausEreignis me;
  149. me.id = ME_DKRechts;
  150. me.mx = (int)(short)LOWORD( lparam );
  151. me.my = (int)(short)HIWORD( lparam );
  152. me.verarbeitet = 0;
  153. WFensterA.sendMausMessage( hwnd, &me );
  154. break;
  155. }
  156. case WM_MBUTTONDBLCLK: // Mitteldoppelklick
  157. {
  158. MausEreignis me;
  159. me.id = ME_DKMitte;
  160. me.mx = (int)(short)LOWORD( lparam );
  161. me.my = (int)(short)HIWORD( lparam );
  162. me.verarbeitet = 0;
  163. WFensterA.sendMausMessage( hwnd, &me );
  164. break;
  165. }
  166. case WM_MOUSEHOVER: // Maus betritt Fenster
  167. {
  168. MausTrack = 1;
  169. MausEreignis me;
  170. me.id = ME_Betritt;
  171. me.mx = (int)(short)LOWORD( lparam );
  172. me.my = (int)(short)HIWORD( lparam );
  173. me.verarbeitet = 0;
  174. WFensterA.sendMausMessage( hwnd, &me );
  175. break;
  176. }
  177. case WM_MOUSELEAVE: // Maus verlässt Fenster
  178. {
  179. MausTrack = 1;
  180. MausEreignis me;
  181. me.id = ME_Verlässt;
  182. me.mx = (int)(short)LOWORD( lparam );
  183. me.my = (int)(short)HIWORD( lparam );
  184. me.verarbeitet = 0;
  185. WFensterA.sendMausMessage( hwnd, &me );
  186. break;
  187. }
  188. case WM_MOUSEMOVE: // Maus wird bewegt
  189. {
  190. if( MausTrack )
  191. {
  192. TRACKMOUSEEVENT lptme;
  193. lptme.cbSize = sizeof(TRACKMOUSEEVENT);
  194. lptme.dwFlags = TME_HOVER | TME_LEAVE;
  195. lptme.dwHoverTime = 0;
  196. lptme.hwndTrack = hwnd;
  197. TrackMouseEvent( &lptme );
  198. MausTrack = 0;
  199. }
  200. MausEreignis me;
  201. me.id = ME_Bewegung;
  202. me.mx = (int)(short)LOWORD( lparam );
  203. me.my = (int)(short)HIWORD( lparam );
  204. me.verarbeitet = 0;
  205. WFensterA.sendMausMessage( hwnd, &me );
  206. break;
  207. }
  208. case WM_MOUSEWHEEL: // Maus scroll
  209. {
  210. MausEreignis me;
  211. if( (int)(short)HIWORD( wparam ) < 0 )
  212. me.id = ME_DScroll;
  213. else
  214. me.id = ME_UScroll;
  215. RECT r;
  216. GetWindowRect( hwnd, &r );
  217. me.mx = (int)(short)LOWORD( lparam ) - r.left;
  218. me.my = (int)(short)HIWORD( lparam ) - r.top;
  219. me.verarbeitet = 0;
  220. WFensterA.sendMausMessage( hwnd, &me );
  221. break;
  222. }
  223. // Tastatur
  224. case WM_KEYDOWN:
  225. {
  226. TastaturEreignis te;
  227. te.id = TE_Press;
  228. te.taste = VirtualZuChar( (int)wparam );
  229. te.verarbeitet = 0;
  230. TastenStand[ te.taste ] = 1;
  231. WFensterA.sendTastaturMessage( hwnd, &te );
  232. break;
  233. } // Taste wird gedrückt
  234. case WM_KEYUP:
  235. {
  236. TastaturEreignis te;
  237. te.id = TE_Release;
  238. te.taste = VirtualZuChar( (int)wparam );
  239. TastenStand[ te.taste ] = 0;
  240. te.verarbeitet = 0;
  241. WFensterA.sendTastaturMessage( hwnd, &te );
  242. break;
  243. } // Taste wird losgelassen
  244. }
  245. return (DefWindowProc(hwnd, message, wparam, lparam));
  246. }
  247. void Framework::StartNachrichtenSchleife()
  248. {
  249. MSG msg;
  250. while( GetMessage( &msg, NULL, 0, 0 ) > 0 && !msgExit )
  251. {
  252. if( !msgExit )
  253. {
  254. TranslateMessage( &msg );
  255. DispatchMessage( &msg );
  256. }
  257. }
  258. msgExit = 0;
  259. }
  260. void Framework::StopNachrichtenSchleife( HWND hwnd )
  261. {
  262. msgExit = 1;
  263. PostMessage( hwnd, WM_MOUSELEAVE, 0, 0 );
  264. }
  265. unsigned char Framework::VirtualZuChar( int Virtual )
  266. {
  267. UINT vk = MapVirtualKey( Virtual, 2 );
  268. if( !vk )
  269. {
  270. switch( Virtual )
  271. {
  272. case VK_CAPITAL:
  273. return T_Caps_Lock;
  274. case VK_SHIFT:
  275. return T_Shift;
  276. case VK_CONTROL:
  277. return T_Strg;
  278. case VK_F1:
  279. return T_F1;
  280. case VK_F2:
  281. return T_F2;
  282. case VK_F3:
  283. return T_F3;
  284. case VK_F4:
  285. return T_F4;
  286. case VK_F5:
  287. return T_F5;
  288. case VK_F6:
  289. return T_F6;
  290. case VK_F7:
  291. return T_F7;
  292. case VK_F8:
  293. return T_F8;
  294. case VK_F9:
  295. return T_F9;
  296. case VK_F10:
  297. return T_F10;
  298. case VK_F11:
  299. return T_F11;
  300. case VK_F12:
  301. return T_F12;
  302. case VK_PAUSE:
  303. return T_Pause;
  304. case VK_SNAPSHOT:
  305. return T_Druck;
  306. case VK_INSERT:
  307. return T_Einfg;
  308. case VK_DELETE:
  309. return T_Entf;
  310. case VK_LEFT:
  311. return T_Links;
  312. case VK_UP:
  313. return T_Oben;
  314. case VK_RIGHT:
  315. return T_Rechts;
  316. case VK_DOWN:
  317. return T_Unten;
  318. case VK_MENU:
  319. return T_Alt_Gr;
  320. case VK_NUMLOCK:
  321. return T_Num;
  322. case VK_HOME:
  323. return T_Pos1;
  324. case VK_PRIOR:
  325. return T_BildO;
  326. case VK_NEXT:
  327. return T_BildU;
  328. case VK_END:
  329. return T_Ende;
  330. }
  331. }
  332. char ret = (char)(short)LOWORD( vk );
  333. short SHIFT = GetKeyState( VK_SHIFT );
  334. short CAPSLOCK = GetKeyState( VK_CAPITAL );
  335. short ALTGR = TastenStand[ T_Alt_Gr ];
  336. if( ALTGR )
  337. {
  338. switch( ret )
  339. {
  340. case 'q':
  341. return '@';
  342. case 'Q':
  343. return '@';
  344. case '<':
  345. return '|';
  346. case '>':
  347. return '|';
  348. case '7':
  349. return '{';
  350. case '/':
  351. return '{';
  352. case '8':
  353. return '[';
  354. case '(':
  355. return '[';
  356. case '9':
  357. return ']';
  358. case ')':
  359. return ']';
  360. case '0':
  361. return '}';
  362. case '=':
  363. return '}';
  364. case 'ß':
  365. return '\\';
  366. case '?':
  367. return '\\';
  368. case '+':
  369. return '~';
  370. case '*':
  371. return '~';
  372. case 'e':
  373. return '€';
  374. case 'E':
  375. return '€';
  376. case 'm':
  377. return 'µ';
  378. case 'M':
  379. return 'µ';
  380. case '2':
  381. return '²';
  382. case '"':
  383. return '²';
  384. case '3':
  385. return '³';
  386. case '§':
  387. return '³';
  388. }
  389. }
  390. SHIFT = HIWORD( SHIFT );
  391. CAPSLOCK = LOWORD( CAPSLOCK );
  392. bool up = 0;
  393. if( SHIFT && !CAPSLOCK )
  394. up = 1;
  395. if( CAPSLOCK && !SHIFT )
  396. up = 1;
  397. ret = KleinOrGroß( ret, up );
  398. return ret;
  399. }
  400. // Inhalt der WFenster Klasse aus Fenster.h
  401. // Konstruktor
  402. WFenster::WFenster()
  403. {
  404. hWnd = 0;
  405. WFensterA.addFenster( this );
  406. MausAktion = 0;
  407. VSchließAktion = 0;
  408. NSchließAktion = 0;
  409. TastaturAktion = 0;
  410. screen = 0;
  411. ref = 1;
  412. mx = -1, my = -1;
  413. verschiebbar = 0;
  414. rahmen = 0;
  415. bitmap = 0;
  416. hdc = 0;
  417. }
  418. WFenster::WFenster( HWND hwnd )
  419. {
  420. hWnd = hwnd;
  421. WFensterA.addFenster( this );
  422. MausAktion = 0;
  423. VSchließAktion = 0;
  424. NSchließAktion = 0;
  425. TastaturAktion = 0;
  426. screen = 0;
  427. ref = 1;
  428. }
  429. // Destruktor
  430. WFenster::~WFenster()
  431. {
  432. if( WFensterA.removeFenster( this ) )
  433. {
  434. WFensterA.del();
  435. }
  436. if( hWnd )
  437. DestroyWindow( hWnd );
  438. if( screen )
  439. screen->release();
  440. }
  441. // nicht constant
  442. void WFenster::erstellen( int style, WNDCLASS wc ) // Erstellt ein Fenster in Windows
  443. {
  444. if( !GetClassInfo( wc.hInstance, wc.lpszClassName, &wc ) )
  445. {
  446. if( !RegisterClass( &wc ) ) // Register Fensterklasse
  447. {
  448. MessageBox( hWnd, "Fehler beim Registrieren der Fensterklasse!", "Error", MB_ICONERROR ); // Fehlermeldung bei Fehler
  449. return;
  450. }
  451. }
  452. hWnd = CreateWindow( wc.lpszClassName, wc.lpszClassName, style, 0, 0, 0, 0, 0, 0, wc.hInstance, 0 ); // Fenster Erstellen
  453. if( hWnd == 0 )
  454. {
  455. MessageBox( hWnd, "Fehler beim erstellen des Fensters!", "Error", MB_ICONERROR ); // Fehlermeldung bei Fehler
  456. return;
  457. }
  458. this->style = style;
  459. }
  460. void WFenster::erstellenEx( int exStyle, int style, WNDCLASSEX wc ) // Das Fenster Erstellen
  461. {
  462. if( !GetClassInfoEx( wc.hInstance, wc.lpszClassName, &wc ) )
  463. {
  464. if( !RegisterClassEx( &wc ) ) // Register Fensterklasse
  465. {
  466. MessageBox( hWnd, "Fehler beim Registrieren der Fensterklasse!", "Error", MB_ICONERROR ); // Fehlermeldung bei Fehler
  467. return;
  468. }
  469. }
  470. hWnd = CreateWindowEx( exStyle, wc.lpszClassName, wc.lpszClassName, style, 0, 0, 0, 0, 0, 0, wc.hInstance, 0 ); // Fenster Erstellen
  471. if( hWnd == 0 )
  472. {
  473. MessageBox( hWnd, "Fehler beim erstellen des Fensters!", "Error", MB_ICONERROR ); // Fehlermeldung bei Fehler
  474. return;
  475. }
  476. this->style = style;
  477. }
  478. void WFenster::setAnzeigeModus( int mod )// Fenster Anzeigen
  479. {
  480. if( rahmen )
  481. {
  482. if( mod == 2 )
  483. ShowWindow( rahmen, 0 );
  484. else
  485. ShowWindow( rahmen, mod );
  486. }
  487. ShowWindow( hWnd, mod );
  488. }
  489. void WFenster::setPosition( Punkt *p )// Fenster Position
  490. {
  491. RECT r;
  492. GetWindowRect( hWnd, &r ); // Vorherige Position herausfinden
  493. RECT res;
  494. res.left = p->getX(), res.top = p->getY(), res.right = r.right - r.left, res.bottom = r.bottom - r.top;
  495. AdjustWindowRect( &res, style, 0 );
  496. SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Position ändern
  497. p->release();
  498. }
  499. void WFenster::setPosition( int x, int y )
  500. {
  501. RECT r;
  502. GetWindowRect( hWnd, &r ); // Vorherige Position herausfinden
  503. RECT res;
  504. res.left = x, res.top = y, res.right = r.right - r.left, res.bottom = r.bottom - r.top;
  505. AdjustWindowRect( &res, style, 0 );
  506. SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Position ändern
  507. }
  508. void WFenster::setGröße( Punkt *g )// Fenster Größe
  509. {
  510. RECT r;
  511. GetWindowRect( hWnd, &r ); // vorherige Größe herausfinden
  512. RECT res;
  513. res.left = r.left, res.top = r.top, res.right = g->getX(), res.bottom = g->getY();
  514. AdjustWindowRect( &res, style, 0 );
  515. SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Größe ändern
  516. g->release();
  517. }
  518. void WFenster::setGröße( int breite, int höhe )
  519. {
  520. RECT r;
  521. GetWindowRect( hWnd, &r ); // vorherige Größe herausfinden
  522. RECT res;
  523. res.left = r.left, res.top = r.top, res.right = breite, res.bottom = höhe;
  524. AdjustWindowRect( &res, style, 0 );
  525. SetWindowPos( hWnd, 0, res.left, res.top, res.right - res.left, res.bottom - res.top, 0 ); // Größe ändern
  526. }
  527. void WFenster::setBounds( Punkt *p, Punkt *g ) // setzt größe und Position
  528. {
  529. SetWindowPos( hWnd, 0, p->getX(), p->getY(), g->getX(), g->getY(), 0 ); // Größe und Position ändern
  530. p->release();
  531. g->release();
  532. }
  533. void WFenster::setBildschirm( Bildschirm *screen )
  534. {
  535. if( this->screen )
  536. this->screen->release();
  537. this->screen = screen;
  538. }
  539. void WFenster::zerstören()
  540. {
  541. DestroyWindow( hWnd );
  542. if( rahmen )
  543. DestroyWindow( rahmen );
  544. if( bitmap )
  545. DeleteObject( bitmap );
  546. if( hdc )
  547. DeleteDC( hdc );
  548. }
  549. void WFenster::doMausAktion( MausEreignis *me )
  550. {
  551. if( !MausAktion )
  552. return;
  553. if( !MausAktion( this, *me ) )
  554. return;
  555. if( screen )
  556. {
  557. if( screen->getMembers() )
  558. {
  559. screen->getMembers()->sendMausAll( me );
  560. if( !me->verarbeitet && verschiebbar )
  561. {
  562. if( mx != -1 && my != -1 ) // verschieben
  563. {
  564. RECT r;
  565. if( rahmen )
  566. {
  567. GetWindowRect( rahmen, &r );
  568. r.right -= r.left, r.bottom -= r.top;
  569. r.left += me->mx - mx;
  570. r.top += me->my - my;
  571. SetWindowPos( rahmen, 0, r.left, r.top, r.right, r.bottom, 0 ); // Position setzen
  572. }
  573. GetWindowRect( hWnd, &r ); // Vorherige Position herausfinden
  574. r.right -= r.left, r.bottom -= r.top; // Position updaten
  575. r.left += me->mx - mx;
  576. r.top += me->my - my;
  577. SetWindowPos( hWnd, 0, r.left, r.top, r.right, r.bottom, 0 ); // Position setzen
  578. }
  579. else if( me->id == ME_PLinks ) // verschieben starten
  580. mx = me->mx, my = me->my;
  581. if( me->id == ME_RLinks ) // verschieben beenden
  582. mx = -1, my = -1;
  583. me->verarbeitet = 1;
  584. }
  585. }
  586. }
  587. }
  588. void WFenster::doVSchließAktion()
  589. {
  590. if( !VSchließAktion )
  591. return;
  592. VSchließAktion( this );
  593. }
  594. void WFenster::doNSchließAktion()
  595. {
  596. if( !NSchließAktion )
  597. return;
  598. NSchließAktion( this );
  599. }
  600. void WFenster::doTastaturAktion( TastaturEreignis *te )
  601. {
  602. if( !TastaturAktion )
  603. return;
  604. if( !TastaturAktion( this, *te ) )
  605. return;
  606. if( screen )
  607. if( screen->getMembers() )
  608. screen->getMembers()->sendTastaturAll( te );
  609. }
  610. void WFenster::doRestoreMessage() // macht den Rahmen sichtbar
  611. {
  612. if( rahmen )
  613. ShowWindow( rahmen, 1 );
  614. ShowWindow( hWnd, 1 );
  615. }
  616. void WFenster::setMausAktion( bool (*MausAk)( WFenster *, MausEreignis ) )
  617. {
  618. MausAktion = MausAk;
  619. }
  620. void WFenster::setVSchließAktion( void (*vSchließAk)( WFenster *) )
  621. {
  622. VSchließAktion = vSchließAk;
  623. }
  624. void WFenster::setNSchließAktion( void (*nSchließAk)( WFenster *) )
  625. {
  626. NSchließAktion = nSchließAk;
  627. }
  628. void WFenster::setTastaturAktion( bool (*TastaturAk)( WFenster *, TastaturEreignis ) )
  629. {
  630. TastaturAktion = TastaturAk;
  631. }
  632. void WFenster::setFensterHandle( HWND hWnd ) // setzt das operationsfenster
  633. {
  634. this->hWnd = hWnd;
  635. }
  636. void WFenster::setVerschiebbar( bool verschiebbar ) // legt fest, ob das Fenster durch ziehen mit Maus verschoben werden kann
  637. {
  638. this->verschiebbar = verschiebbar;
  639. }
  640. void WFenster::ladeRahmenFenster( Bild *zBild, HINSTANCE hinst ) // setzt einen Transpatenten Rahmen um das Fenster
  641. {
  642. if( !zBild )
  643. return;
  644. // Fenster erstellen
  645. WNDCLASSEX wcl = { 0 };
  646. wcl.cbSize = sizeof( wcl );
  647. wcl.style = CS_HREDRAW | CS_VREDRAW;
  648. wcl.lpfnWndProc = WindowProc;
  649. wcl.cbClsExtra = 0;
  650. wcl.cbWndExtra = 0;
  651. wcl.hInstance = hinst;
  652. wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  653. wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
  654. wcl.hbrBackground = NULL;
  655. wcl.lpszMenuName = NULL;
  656. wcl.lpszClassName = TEXT("LayeredWindowClass");
  657. wcl.hIconSm = NULL;
  658. // Bitmap erstellen
  659. hdc = CreateCompatibleDC(NULL);
  660. if( !hdc )
  661. return;
  662. BITMAPINFO info;
  663. info.bmiHeader.biSize = sizeof( info.bmiHeader );
  664. info.bmiHeader.biBitCount = 32;
  665. info.bmiHeader.biWidth = zBild->getBreite();
  666. info.bmiHeader.biHeight = -zBild->getHöhe();
  667. info.bmiHeader.biCompression = BI_RGB;
  668. info.bmiHeader.biPlanes = 1;
  669. unsigned char *pPixels = 0;
  670. bitmap = CreateDIBSection( hdc, &info, DIB_RGB_COLORS, (void**)&pPixels, 0, 0 );
  671. if( !bitmap )
  672. {
  673. DeleteObject( bitmap );
  674. DeleteDC( hdc );
  675. }
  676. GdiFlush();
  677. // bitmap füllen
  678. int pitch = ( ( zBild->getBreite() * 32 + 31 ) & ~31 ) >> 3;
  679. unsigned char *pRow = 0;
  680. int *buffer = zBild->getBuffer();
  681. for( int i = 0; i < zBild->getHöhe(); i++ )
  682. {
  683. pRow = &pPixels[ i * pitch ];
  684. for( int i2 = 0; i2 < zBild->getBreite(); i2++ )
  685. {
  686. pRow[ i2 * 4 ] = (unsigned char)( ( buffer[ i2 + i * zBild->getBreite() ] >> 16 ) & 0xFF );
  687. pRow[ i2 * 4 + 1 ] = (unsigned char)( ( buffer[ i2 + i * zBild->getBreite() ] >> 8 ) & 0xFF );
  688. pRow[ i2 * 4 + 2] = (unsigned char)( ( buffer[ i2 + i * zBild->getBreite() ] ) & 0xFF );
  689. pRow[ i2 * 4 + 3] = (unsigned char)( ( buffer[ i2 + i * zBild->getBreite() ] >> 24 ) & 0xFF );
  690. }
  691. }
  692. // alpha berechnen
  693. unsigned char *pPixel = 0;
  694. if( zBild->getBreite() * 4 == pitch )
  695. {
  696. int i = 0;
  697. int totalBytes = zBild->getBreite() * zBild->getHöhe() * 4;
  698. for( i = 0; i < totalBytes; i += 4 )
  699. {
  700. pPixel = &pPixels[ i ];
  701. pPixel[0] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  702. pPixel[1] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  703. pPixel[2] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  704. }
  705. }
  706. else
  707. {
  708. int x = 0;
  709. int y = 0;
  710. for( y = 0; y < zBild->getHöhe(); ++y )
  711. {
  712. for( x = 0; x < zBild->getBreite(); ++x )
  713. {
  714. pPixel = &pPixels[ ( y * pitch ) + ( x * 4 ) ];
  715. pPixel[0] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  716. pPixel[1] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  717. pPixel[2] *= (unsigned char)( (float)pPixel[ 3 ] / 255.0f );
  718. }
  719. }
  720. }
  721. // Fenster erstellen fortsetzen
  722. if( RegisterClassEx( &wcl ) )
  723. {
  724. rahmen = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_LAYERED,
  725. wcl.lpszClassName,
  726. TEXT( "Transparentes Fenster" ),
  727. WS_POPUP,
  728. 0,
  729. 0,
  730. zBild->getBreite(),
  731. zBild->getHöhe(),
  732. 0,
  733. 0,
  734. wcl.hInstance,
  735. 0
  736. );
  737. if( rahmen )
  738. {
  739. // zeichnen
  740. HDC h = 0;
  741. if( h = GetDC( rahmen ) )
  742. {
  743. HGDIOBJ hPrevObj = NULL;
  744. POINT ptDest = { 0, 0 };
  745. POINT ptSrc = { 0, 0 };
  746. SIZE client = { zBild->getBreite(), zBild->getHöhe() };
  747. BLENDFUNCTION blendFunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
  748. hPrevObj = SelectObject( hdc, bitmap );
  749. ClientToScreen( rahmen, &ptDest );
  750. UpdateLayeredWindow( rahmen, h, &ptDest, &client, hdc, &ptSrc, 0, &blendFunc, ULW_ALPHA );
  751. SelectObject( hdc, hPrevObj );
  752. ReleaseDC( rahmen, h );
  753. }
  754. UpdateWindow( rahmen );
  755. Punkt *pos = getPosition();
  756. Punkt *gr = getGröße();
  757. pos->x += ( gr->x - zBild->getBreite() ) / 2;
  758. pos->y += ( gr->y - zBild->getHöhe() ) / 2;
  759. SetWindowPos( rahmen, 0, pos->x, pos->y, zBild->getBreite(), zBild->getHöhe(), 0 );
  760. pos->release();
  761. gr->release();
  762. }
  763. }
  764. }
  765. // constant
  766. Punkt *WFenster::getPosition() const // gibt die Position zurück
  767. {
  768. RECT r;
  769. GetWindowRect( hWnd, &r ); // Position herausfinden
  770. return new Punkt( r.left, r.top );
  771. }
  772. Punkt *WFenster::getGröße() const // gibt die Größe zurück
  773. {
  774. RECT r;
  775. GetWindowRect( hWnd, &r ); // Größe herausfinden
  776. return new Punkt( r.right - r.left, r.bottom - r.top );
  777. }
  778. HWND WFenster::getFensterHandle() const // gibt ein Handle zum Fenster zurück
  779. {
  780. return hWnd;
  781. }
  782. bool WFenster::hatMausAktion() const
  783. {
  784. return MausAktion != 0;
  785. }
  786. bool WFenster::hatVSchließAktion() const
  787. {
  788. return VSchließAktion != 0;
  789. }
  790. bool WFenster::hatNSchließAktion() const
  791. {
  792. return NSchließAktion != 0;
  793. }
  794. bool WFenster::hatTastaturAktion() const
  795. {
  796. return TastaturAktion != 0;
  797. }
  798. Bildschirm *WFenster::getBildschirm() const
  799. {
  800. if( !screen )
  801. return 0;
  802. return screen->getThis();
  803. }
  804. Bildschirm *WFenster::zBildschirm() const
  805. {
  806. return screen;
  807. }
  808. bool WFenster::istVerschiebbar() const // prüft, ob das Fenster durch ziehen mit Maus verschoben werden kann
  809. {
  810. return verschiebbar;
  811. }
  812. // Reference Counting
  813. WFenster *WFenster::getThis()
  814. {
  815. ref++;
  816. return this;
  817. }
  818. WFenster *WFenster::release()
  819. {
  820. ref--;
  821. if( ref < 1 )
  822. delete this;
  823. return 0;
  824. }
  825. // Inhalt der WFensterArray Klasse aus Fenster.h
  826. // Konstruktor
  827. WFensterArray::WFensterArray()
  828. {
  829. next = 0;
  830. This = 0;
  831. }
  832. // Destruktor
  833. WFensterArray::~WFensterArray()
  834. {
  835. if( next )
  836. delete next;
  837. }
  838. // add und remove
  839. bool WFensterArray::addFenster( WFenster *fenster )
  840. {
  841. if( fenster == This )
  842. return 0;
  843. if( !This )
  844. {
  845. This = fenster;
  846. return 1;
  847. }
  848. if( !next )
  849. next = new WFensterArray();
  850. return next->addFenster( fenster );
  851. }
  852. bool WFensterArray::removeFenster( WFenster *fenster )
  853. {
  854. if( fenster == This )
  855. return 1;
  856. if( !next )
  857. return 0;
  858. if( next->removeFenster( fenster ) )
  859. {
  860. WFensterArray *tmp = next->getNext();
  861. next->setNext0();
  862. delete next;
  863. next = tmp;
  864. }
  865. return 0;
  866. }
  867. WFensterArray *WFensterArray::getNext()
  868. {
  869. return next;
  870. }
  871. void WFensterArray::setNext0()
  872. {
  873. next = 0;
  874. }
  875. void WFensterArray::del()
  876. {
  877. if( next )
  878. {
  879. This = next->getThis();
  880. WFensterArray *tmp = next->getNext();
  881. next->setNext0();
  882. delete next;
  883. next = tmp;
  884. }
  885. else
  886. This = 0;
  887. }
  888. // Messages
  889. bool WFensterArray::sendVSchließMessage( HWND hwnd )
  890. {
  891. if( !This )
  892. return 0;
  893. bool ret = 0;
  894. if( This->getFensterHandle() == hwnd && This->hatVSchließAktion() )
  895. {
  896. This->doVSchließAktion();
  897. ret = 1;
  898. }
  899. if( !next )
  900. return ret;
  901. if( ret )
  902. next->sendVSchließMessage( hwnd );
  903. else
  904. ret = next->sendVSchließMessage( hwnd );
  905. return ret;
  906. }
  907. bool WFensterArray::sendNSchließMessage( HWND hwnd )
  908. {
  909. if( !This )
  910. return 0;
  911. bool ret = 0;
  912. if( This->getFensterHandle() == hwnd && This->hatNSchließAktion() )
  913. {
  914. This->doNSchließAktion();
  915. ret = 1;
  916. }
  917. if( !next )
  918. return ret;
  919. if( ret )
  920. next->sendNSchließMessage( hwnd );
  921. else
  922. ret = next->sendNSchließMessage( hwnd );
  923. return ret;
  924. }
  925. bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis *me )
  926. {
  927. if( !This )
  928. return 0;
  929. bool ret = 0;
  930. if( This->getFensterHandle() == hwnd && This->hatMausAktion() )
  931. {
  932. This->doMausAktion( me );
  933. ret = 1;
  934. }
  935. if( !next )
  936. return ret;
  937. if( ret )
  938. next->sendMausMessage( hwnd, me );
  939. else
  940. ret = next->sendMausMessage( hwnd, me );
  941. return ret;
  942. }
  943. bool WFensterArray::sendTastaturMessage( HWND hwnd, TastaturEreignis *te )
  944. {
  945. if( !This )
  946. return 0;
  947. bool ret = 0;
  948. if( This->getFensterHandle() == hwnd && This->hatMausAktion() )
  949. {
  950. This->doTastaturAktion( te );
  951. ret = 1;
  952. }
  953. if( !next )
  954. return ret;
  955. if( ret )
  956. next->sendTastaturMessage( hwnd, te );
  957. else
  958. ret = next->sendTastaturMessage( hwnd, te );
  959. return ret;
  960. }
  961. bool WFensterArray::sendRestoreMessage( HWND hwnd )
  962. {
  963. if( !This )
  964. return 0;
  965. bool ret = 0;
  966. if( This->getFensterHandle() == hwnd && This->hatMausAktion() )
  967. {
  968. This->doRestoreMessage();
  969. ret = 1;
  970. }
  971. if( !next )
  972. return ret;
  973. if( ret )
  974. next->sendRestoreMessage( hwnd );
  975. else
  976. ret = next->sendRestoreMessage( hwnd );
  977. return ret;
  978. }
  979. WFenster *WFensterArray::getThis()
  980. {
  981. return This;
  982. }
  983. // WMessageBox
  984. void Framework::WMessageBox( HWND hWnd, Text *titel, Text *meldung, UINT style )
  985. {
  986. MessageBox( hWnd, meldung->getText(), titel->getText(), style ); // Message Box
  987. titel->release();
  988. meldung->release();
  989. }