WInput.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(OS-based input unit)
  3.  (C) 2006 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <br>
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Unit contains OS-based input implementation
  6. *)
  7. {$Include GDefines.inc}
  8. unit WInput;
  9. interface
  10. uses Basics, BaseMsg, OSUtils, Input;
  11. type
  12.   // OS-routines based controller implementation
  13.   TOSController = class(TController)
  14.   private
  15.     LastMouseX, LastMouseY: LongInt;
  16.   protected
  17.     procedure ApplyMouseCapture(Value: Boolean); override;
  18.   public
  19.     constructor Create(AHandle: Cardinal; AMessageHandler: TMessageHandler); override;
  20.     procedure SetMouseWindow(const X1, Y1, X2, Y2: Longint); override;    
  21.     procedure GetInputState; override;
  22.   end;
  23. implementation
  24. { TOSController }
  25. constructor TOSController.Create(AHandle: Cardinal; AMessageHandler: TMessageHandler);
  26. begin
  27.   {$I WI_CONST.inc}
  28.   inherited;  
  29. end;
  30. procedure TOSController.GetInputState;
  31. begin
  32.   ObtainKeyboardState(KeyboardState);
  33.   ObtainCursorPos(MouseX, MouseY);
  34.   with MouseState do begin
  35.     lX := MouseX - LastMouseX;
  36.     lY := MouseY - LastMouseY;
  37.     Buttons[0] := Ord(GetAsyncKeyState(IK_MOUSELEFT)   < 0) * 128;
  38.     Buttons[1] := Ord(GetAsyncKeyState(IK_MOUSERIGHT)  < 0) * 128;
  39.     Buttons[2] := Ord(GetAsyncKeyState(IK_MOUSEMIDDLE) < 0) * 128;
  40.   end;
  41.   
  42.   if MouseCapture then SetCursorCapturePos else begin
  43.     LastMouseX := MouseX; LastMouseY := MouseY;
  44.   end;
  45.   ScreenToClient(Handle, MouseX, MouseY);
  46.   MouseX := MinI(MouseWindow.Right,  MaxI(MouseWindow.Left, MouseX));
  47.   MouseY := MinI(MouseWindow.Bottom, MaxI(MouseWindow.Top,  MouseY));
  48. end;
  49. procedure TOSController.ApplyMouseCapture(Value: Boolean);
  50. begin
  51.   inherited;
  52.   if Value then begin
  53. //    AdjustCursorVisibility(False);
  54.     OSUtils.HideCursor;
  55.     SetCursorCapturePos;
  56.     ObtainCursorPos(LastMouseX, LastMouseY);
  57.   end else OSUtils.ShowCursor;// AdjustCursorVisibility(True);
  58. end;
  59. procedure TOSController.SetMouseWindow(const X1, Y1, X2, Y2: Integer);
  60. begin
  61.   inherited;
  62.   ClipCursor(MouseWindow);
  63. end;
  64. end.