Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

584 строки
22 KiB

  1. unit uutlEventManager;
  2. { Package: Utils
  3. Prefix: utl - UTiLs
  4. Beschreibung: diese Unit verwaltet Events und verteilt diese an registrierte Programm-Teile }
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. Classes, SysUtils, Controls,
  9. uutlEvent;
  10. type
  11. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. TutlEventType = byte;
  13. TutlEventTypes = set of TutlEventType;
  14. TutlMouseButtons = set of TMouseButton;
  15. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. TutlWinControlEvent = class(TutlEventArgs)
  17. private
  18. fControl: TControl;
  19. fEventType: TutlEventType;
  20. fTimestamp: Single;
  21. public
  22. property Control: TControl read fControl;
  23. property EventType: TutlEventType read fEventType;
  24. property Timestamp: Single read fTimestamp;
  25. constructor Create(
  26. const aControl: TControl;
  27. const aEventType: TutlEventType);
  28. end;
  29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. TutlMouseEvent = class(TutlWinControlEvent)
  31. private
  32. fButtons: TutlMouseButtons;
  33. fClientPos: TPoint;
  34. fScreenPos: TPoint;
  35. public
  36. property Buttons: TutlMouseButtons read fButtons;
  37. property ClientPos: TPoint read fClientPos;
  38. property ScreenPos: TPoint read fScreenPos;
  39. constructor Create(
  40. const aSender: TControl;
  41. const aEventType: TutlEventType;
  42. const aButtons: TutlMouseButtons;
  43. const aClientPos: TPoint);
  44. end;
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. TutlMouseWheelEvent = class(TutlWinControlEvent)
  47. private
  48. fWheelDelta: Integer;
  49. fClientPos: TPoint;
  50. fScreenPos: TPoint;
  51. public
  52. property WheelDelta: Integer read fWheelDelta;
  53. property ClientPos: TPoint read fClientPos;
  54. property ScreenPos: TPoint read fScreenPos;
  55. constructor Create(
  56. const aSender: TControl;
  57. const aWheelDelta: Integer;
  58. const aClientPos: TPoint);
  59. end;
  60. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. TutlKeyEvent = class(TutlWinControlEvent)
  62. private
  63. fCharCode: WideChar;
  64. fKeyCode: Word;
  65. public
  66. property CharCode: WideChar read fCharCode;
  67. property KeyCode: Word read fKeyCode;
  68. constructor Create(
  69. const aSender: TControl;
  70. const aEventType: TutlEventType;
  71. const aCharCode: WideChar;
  72. const aKeyCode: Word);
  73. end;
  74. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. TutlWindowEvent = class(TutlWinControlEvent)
  76. private
  77. fScreenRect: TRect;
  78. fClientWidth: Cardinal;
  79. fClientHeight: Cardinal;
  80. public
  81. property ScreenRect: TRect read fScreenRect;
  82. property ClientWidth: Cardinal read fClientWidth;
  83. property ClientHeight: Cardinal read fClientHeight;
  84. constructor Create(
  85. const aSender: TControl;
  86. const aEventType: TutlEventType;
  87. const aScreenRect: TRect;
  88. const aClientWidth: Cardinal;
  89. const aClientHeight: Cardinal);
  90. end;
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. TutlWinControlEventManager = class(TutlEventListenerSet)
  93. public const
  94. EVENT_MOUSE_DOWN = 0;
  95. EVENT_MOUSE_UP = 1;
  96. EVENT_MOUSE_WHEEL_UP = 2;
  97. EVENT_MOUSE_WHEEL_DOWN = 3;
  98. EVENT_MOUSE_MOVE = 4;
  99. EVENT_MOUSE_ENTER = 5;
  100. EVENT_MOUSE_LEAVE = 6;
  101. EVENT_MOUSE_CLICK = 7;
  102. EVENT_MOUSE_DBL_CLICK = 8;
  103. EVENT_KEY_DOWN = 10;
  104. EVENT_KEY_REPEAT = 11;
  105. EVENT_KEY_UP = 12;
  106. EVENT_WINDOW_RESIZE = 15;
  107. EVENT_WINDOW_ACTIVATE = 16;
  108. EVENT_WINDOW_DEACTIVATE = 17;
  109. EVENTS_MOUSE: TutlEventTypes = [
  110. EVENT_MOUSE_DOWN,
  111. EVENT_MOUSE_UP,
  112. EVENT_MOUSE_WHEEL_UP,
  113. EVENT_MOUSE_WHEEL_DOWN,
  114. EVENT_MOUSE_MOVE,
  115. EVENT_MOUSE_ENTER,
  116. EVENT_MOUSE_LEAVE,
  117. EVENT_MOUSE_CLICK,
  118. EVENT_MOUSE_DBL_CLICK
  119. ];
  120. EVENTS_KEYBOARD: TutlEventTypes = [
  121. EVENT_KEY_DOWN,
  122. EVENT_KEY_REPEAT,
  123. EVENT_KEY_UP
  124. ];
  125. EVENTS_WINDOW: TutlEventTypes = [
  126. EVENT_WINDOW_RESIZE,
  127. EVENT_WINDOW_ACTIVATE,
  128. EVENT_WINDOW_DEACTIVATE
  129. ];
  130. private type
  131. TKeyboardState = record
  132. Modifiers: TShiftState;
  133. KeyState: array[Byte] of Boolean;
  134. end;
  135. TMouseState = record
  136. ScreenPos: TPoint;
  137. ClientPos: TPoint;
  138. Buttons: TutlMouseButtons;
  139. end;
  140. TWindowState = record
  141. Active: Boolean;
  142. ScreenRect: TRect;
  143. ClientWidth: Integer;
  144. ClientHeight: Integer;
  145. end;
  146. private
  147. fKeyboard: TKeyboardState;
  148. fMouse: TMouseState;
  149. fWindow: TWindowState;
  150. procedure HandlerMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  151. procedure HandlerMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  152. procedure HandlerMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
  153. procedure HandlerMouseEnter (Sender: TObject);
  154. procedure HandlerMouseLeave (Sender: TObject);
  155. procedure HandlerClick (Sender: TObject);
  156. procedure HandlerDblClick (Sender: TObject);
  157. procedure HandlerMouseWheel (Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  158. procedure HandlerKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
  159. procedure HandlerKeyUp (Sender: TObject; var Key: Word; Shift: TShiftState);
  160. procedure HandlerResize (Sender: TObject);
  161. procedure HandlerActivate (Sender: TObject);
  162. procedure HandlerDeactivate (Sender: TObject);
  163. protected
  164. procedure RecordEvent(const aEvent: IutlEventArgs); virtual;
  165. function CreateMouseEvent(
  166. aSender: TObject;
  167. aType: TutlEventType;
  168. aButtons: TutlMouseButtons;
  169. aClientPos: TPoint): TutlMouseEvent; virtual;
  170. function CreateMouseWheelEvent(
  171. aSender: TObject;
  172. aDelta: Integer;
  173. aClientPos: TPoint): TutlMouseWheelEvent; virtual;
  174. function CreateKeyEvent(
  175. aSender: TObject; aType: TutlEventType;
  176. aKey: Word): TutlKeyEvent; virtual;
  177. function CreateWindowEvent(
  178. aSender: TObject;
  179. aType: TutlEventType): TutlWindowEvent; virtual;
  180. public
  181. property Keyboard: TKeyboardState read fKeyboard;
  182. property Mouse: TMouseState read fMouse;
  183. property Window: TWindowState read fWindow;
  184. procedure DispatchEvent(aEvent: IutlEventArgs); override;
  185. procedure AttachEvents(const aControl: TWinControl; const aTypes: TutlEventTypes);
  186. end;
  187. implementation
  188. uses
  189. LCLIntf, Forms,
  190. uutlKeyCodes, uutlCommon;
  191. type
  192. TWinControlVisibilityClass = class(TWinControl)
  193. published
  194. property OnMouseDown;
  195. property OnMouseMove;
  196. property OnMouseUp;
  197. property OnMouseWheel;
  198. property OnMouseEnter;
  199. property OnMouseLeave;
  200. property OnClick;
  201. property OnDblClick;
  202. end;
  203. TCustomFormVisibilityClass = class(TCustomForm)
  204. published
  205. property OnActivate;
  206. property OnDeactivate;
  207. end;
  208. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  209. //TutlWinControlEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  210. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  211. function TutlWinControlEvent.GetControl: TControl;
  212. begin
  213. result := (Sender as TControl);
  214. end;
  215. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. constructor TutlWinControlEvent.Create(const aControl: TControl; const aEventType: TutlEventType);
  217. begin
  218. inherited Create;
  219. fControl := aControl;
  220. fEventType := aEventType;
  221. fTimestamp := GetMicroTime / 1000000;
  222. end;
  223. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  224. //TutlMouseEvent/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  225. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  226. constructor TutlMouseEvent.Create(
  227. const aSender: TControl;
  228. const aEventType: TutlEventType;
  229. const aButtons: TutlMouseButtons;
  230. const aClientPos: TPoint);
  231. begin
  232. inherited Create(aSender, aEventType);
  233. fButtons := aButtons;
  234. fClientPos := aClientPos;
  235. fScreenPos := Control.ClientToScreen(fClientPos);
  236. end;
  237. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  238. //TutlMouseWheelEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  239. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. constructor TutlMouseWheelEvent.Create(
  241. const aSender: TControl;
  242. const aWheelDelta: Integer;
  243. const aClientPos: TPoint);
  244. begin
  245. if (aWheelDelta < 0)
  246. then inherited Create(aSender, TutlWinControlEventManager.EVENT_MOUSE_WHEEL_DOWN)
  247. else inherited Create(aSender, TutlWinControlEventManager.EVENT_MOUSE_WHEEL_UP);
  248. fWheelDelta := aWheelDelta;
  249. fClientPos := aClientPos;
  250. fScreenPos := Control.ClientToScreen(fClientPos);
  251. end;
  252. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. //TutlKeyEvent///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  254. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. constructor TutlKeyEvent.Create(
  256. const aSender: TControl;
  257. const aEventType: TutlEventType;
  258. const aCharCode: WideChar;
  259. const aKeyCode: Word);
  260. begin
  261. inherited Create(aSender, aEventType);
  262. fCharCode := aCharCode;
  263. fKeyCode := aKeyCode;
  264. end;
  265. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  266. //TutlWindowEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. constructor TutlWindowEvent.Create(
  269. const aSender: TControl;
  270. const aEventType: TutlEventType;
  271. const aScreenRect: TRect;
  272. const aClientWidth: Cardinal;
  273. const aClientHeight: Cardinal);
  274. begin
  275. inherited Create(aSender, aEventType);
  276. fScreenRect := aScreenRect;
  277. fClientWidth := aClientWidth;
  278. fClientHeight := aClientHeight;
  279. end;
  280. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. //TutlWinControlEventManager/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  282. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  283. procedure TutlWinControlEventManager.HandlerMouseDown(Sender: TObject; Button: TMouseButton;
  284. Shift: TShiftState; X, Y: Integer);
  285. begin
  286. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_DOWN, [ Button ], Point(X, Y)));
  287. end;
  288. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  289. procedure TutlWinControlEventManager.HandlerMouseUp(Sender: TObject; Button: TMouseButton;
  290. Shift: TShiftState; X, Y: Integer);
  291. begin
  292. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_UP, [Button], Point(X, Y)));
  293. end;
  294. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  295. procedure TutlWinControlEventManager.HandlerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  296. begin
  297. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_MOVE, [], Point(X, Y)));
  298. end;
  299. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  300. procedure TutlWinControlEventManager.HandlerMouseEnter(Sender: TObject);
  301. begin
  302. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_ENTER, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  303. end;
  304. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  305. procedure TutlWinControlEventManager.HandlerMouseLeave(Sender: TObject);
  306. begin
  307. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_LEAVE, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  308. end;
  309. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  310. procedure TutlWinControlEventManager.HandlerClick(Sender: TObject);
  311. begin
  312. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  313. end;
  314. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  315. procedure TutlWinControlEventManager.HandlerDblClick(Sender: TObject);
  316. begin
  317. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_DBL_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  318. end;
  319. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. procedure TutlWinControlEventManager.HandlerMouseWheel(Sender: TObject; Shift: TShiftState;
  321. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  322. begin
  323. DispatchEvent(CreateMouseWheelEvent(Sender, WheelDelta, MousePos));
  324. Handled := false;
  325. end;
  326. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  327. procedure TutlWinControlEventManager.HandlerKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  328. begin
  329. DispatchEvent(CreateKeyEvent(Sender, EVENT_KEY_DOWN, Key));
  330. end;
  331. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  332. procedure TutlWinControlEventManager.HandlerKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  333. begin
  334. DispatchEvent(CreateKeyEvent(Sender, EVENT_KEY_UP, Key));
  335. end;
  336. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  337. procedure TutlWinControlEventManager.HandlerResize(Sender: TObject);
  338. begin
  339. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_RESIZE));
  340. end;
  341. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  342. procedure TutlWinControlEventManager.HandlerActivate(Sender: TObject);
  343. begin
  344. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_ACTIVATE));
  345. end;
  346. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  347. procedure TutlWinControlEventManager.HandlerDeactivate(Sender: TObject);
  348. begin
  349. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_DEACTIVATE));
  350. end;
  351. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  352. procedure TutlWinControlEventManager.RecordEvent(const aEvent: IutlEventArgs);
  353. var
  354. me: TutlMouseEvent;
  355. ke: TutlKeyEvent;
  356. we: TutlWindowEvent;
  357. function GetPressedButtons: TutlMouseButtons;
  358. begin
  359. result := [];
  360. if (GetKeyState(VK_LBUTTON) < 0) then
  361. result := result + [mbLeft];
  362. if (GetKeyState(VK_RBUTTON) < 0) then
  363. result := result + [mbRight];
  364. if (GetKeyState(VK_MBUTTON) < 0) then
  365. result := result + [mbMiddle];
  366. if (GetKeyState(VK_XBUTTON1) < 0) then
  367. result := result + [mbExtra1];
  368. if (GetKeyState(VK_XBUTTON2) < 0) then
  369. result := result + [mbExtra2];
  370. end;
  371. begin
  372. if Supports(aEvent, TutlMouseEvent, me) then begin
  373. fMouse.ClientPos := me.ClientPos;
  374. fMouse.ScreenPos := me.ScreenPos;
  375. case me.EventType of
  376. EVENT_MOUSE_DOWN:
  377. fMouse.Buttons := fMouse.Buttons + me.Buttons;
  378. EVENT_MOUSE_UP:
  379. fMouse.Buttons := fMouse.Buttons - me.Buttons;
  380. EVENT_MOUSE_LEAVE:
  381. fMouse.Buttons := [];
  382. EVENT_MOUSE_ENTER:
  383. fMouse.Buttons := GetPressedButtons;
  384. end;
  385. end else if Supports(aEvent, TutlKeyEvent, ke) then begin
  386. case ke.EventType of
  387. EVENT_KEY_DOWN,
  388. EVENT_KEY_REPEAT: begin
  389. fKeyboard.KeyState[ke.KeyCode and $FF] := true;
  390. case ke.KeyCode of
  391. VK_SHIFT: Include(fKeyboard.Modifiers, ssShift);
  392. VK_MENU: Include(fKeyboard.Modifiers, ssAlt);
  393. VK_CONTROL: Include(fKeyboard.Modifiers, ssCtrl);
  394. end;
  395. end;
  396. EVENT_KEY_UP: begin
  397. fKeyboard.KeyState[ke.KeyCode and $FF] := false;
  398. case ke.KeyCode of
  399. VK_SHIFT: Exclude(fKeyboard.Modifiers, ssShift);
  400. VK_MENU: Exclude(fKeyboard.Modifiers, ssAlt);
  401. VK_CONTROL: Exclude(fKeyboard.Modifiers, ssCtrl);
  402. end;
  403. end;
  404. end;
  405. if ([ssCtrl, ssAlt] - fKeyboard.Modifiers = [])
  406. then include(fKeyboard.Modifiers, ssAltGr)
  407. else exclude(fKeyboard.Modifiers, ssAltGr);
  408. end else if Supports(aEvent, TutlWindowEvent, we) then begin
  409. case we.EventType of
  410. EVENT_WINDOW_ACTIVATE:
  411. fWindow.Active := true;
  412. EVENT_WINDOW_DEACTIVATE:
  413. fWindow.Active := false;
  414. EVENT_WINDOW_RESIZE: begin
  415. fWindow.ScreenRect := we.ScreenRect;
  416. fWindow.ClientWidth := we.ClientWidth;
  417. fWindow.ClientHeight := we.ClientHeight;
  418. end;
  419. end;
  420. end;
  421. end;
  422. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  423. function TutlWinControlEventManager.CreateMouseEvent(aSender: TObject; aType: TutlEventType;
  424. aButtons: TutlMouseButtons; aClientPos: TPoint): TutlMouseEvent;
  425. begin
  426. result := TutlMouseEvent.Create(
  427. (aSender as TControl),
  428. aType,
  429. aButtons,
  430. aClientPos);
  431. end;
  432. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  433. function TutlWinControlEventManager.CreateMouseWheelEvent(aSender: TObject; aDelta: Integer;
  434. aClientPos: TPoint): TutlMouseWheelEvent;
  435. begin
  436. result := TutlMouseWheelEvent.Create(
  437. (aSender as TControl),
  438. aDelta,
  439. aClientPos);
  440. end;
  441. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  442. function TutlWinControlEventManager.CreateKeyEvent(aSender: TObject; aType: TutlEventType; aKey: Word): TutlKeyEvent;
  443. begin
  444. if (aType = EVENT_KEY_DOWN) and fKeyboard.KeyState[aKey and $FF] then
  445. aType := EVENT_KEY_REPEAT;
  446. result := TutlKeyEvent.Create(
  447. (aSender as TControl),
  448. aType,
  449. VKCodeToCharCode(aKey, fKeyboard.Modifiers),
  450. aKey);
  451. end;
  452. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  453. function TutlWinControlEventManager.CreateWindowEvent(aSender: TObject; aType: TutlEventType): TutlWindowEvent;
  454. var
  455. p0, p1: TPoint;
  456. begin
  457. with TControl(aSender) do begin
  458. p0 := ClientToScreen(Point(0, 0));
  459. p1 := ClientToScreen(Point(Width, Height));
  460. end;
  461. result := TutlWindowEvent.Create(
  462. (aSender as TControl),
  463. aType,
  464. Rect(p0.x, p0.y, p1.x, p1.y),
  465. (aSender as TWinControl).ClientWidth,
  466. (aSender as TWinControl).ClientHeight);
  467. end;
  468. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  469. procedure TutlWinControlEventManager.DispatchEvent(aEvent: IutlEventArgs);
  470. begin
  471. RecordEvent(aEvent);
  472. inherited DispatchEvent(aEvent);
  473. end;
  474. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  475. procedure TutlWinControlEventManager.AttachEvents(const aControl: TWinControl; const aTypes: TutlEventTypes);
  476. var
  477. ctl: TWinControlVisibilityClass;
  478. frm: TCustomFormVisibilityClass;
  479. begin
  480. ctl := TWinControlVisibilityClass(aControl);
  481. // mouse events
  482. if (EVENT_MOUSE_DOWN in aTypes) then ctl.OnMouseDown := @HandlerMouseDown;
  483. if (EVENT_MOUSE_UP in aTypes) then ctl.OnMouseUp := @HandlerMouseUp;
  484. if (EVENT_MOUSE_MOVE in aTypes) then ctl.OnMouseMove := @HandlerMouseMove;
  485. if (EVENT_MOUSE_ENTER in aTypes) then ctl.OnMouseEnter := @HandlerMouseEnter;
  486. if (EVENT_MOUSE_LEAVE in aTypes) then ctl.OnMouseLeave := @HandlerMouseLeave;
  487. if (EVENT_MOUSE_CLICK in aTypes) then ctl.OnClick := @HandlerClick;
  488. if (EVENT_MOUSE_DBL_CLICK in aTypes) then ctl.OnDblClick := @HandlerDblClick;
  489. if (EVENT_MOUSE_WHEEL_DOWN in aTypes) or
  490. (EVENT_MOUSE_WHEEL_UP in aTypes) then ctl.OnMouseWheel := @HandlerMouseWheel;
  491. // key events
  492. if (EVENT_KEY_DOWN in aTypes) then ctl.OnKeyDown := @HandlerKeyDown;
  493. if (EVENT_KEY_UP in aTypes) then ctl.OnKeyUp := @HandlerKeyUp;
  494. // window events
  495. if (EVENT_WINDOW_RESIZE in aTypes) then begin
  496. ctl.OnResize := @HandlerResize;
  497. fWindow.ClientWidth := ctl.ClientWidth;
  498. fWindow.ClientHeight := ctl.ClientHeight;
  499. end;
  500. if (aControl is TCustomForm) then begin
  501. frm := TCustomFormVisibilityClass(aControl);
  502. frm.KeyPreview := true;
  503. if (EVENT_WINDOW_ACTIVATE in aTypes) then frm.OnActivate := @HandlerActivate;
  504. if (EVENT_WINDOW_DEACTIVATE in aTypes) then frm.OnDeactivate := @HandlerDeactivate;
  505. end;
  506. end;
  507. end.