Cross Codebot Example: Magnify

Here is an example of a how to create simple screen magnifier utility using the Cross Codebot library. The application creates a small magnifier window which follows your mouse cursor. There's room for improvement with the application, such as moving the magnifier window when the mouse nears the screen edges, but overall was very easy to create.


Source Code

Below is a listing of the magnify application Main unit file.

unit Main;

{$mode delphi}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Codebot.Graphics,
  Codebot.Graphics.Types,
  Codebot.Input.MouseMonitor;

{ TMainForm }

type
  TMainForm = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    FSplash: ISplash;
    FDesktop: ISurface;
    procedure Capture(X, Y: Integer);
    procedure MouseNotify(Kind: TMouseNotifyKind; Button: TMouseButton; X,
      Y: Integer);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.lfm}

{ TMainForm }

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FDesktop := NewSurface(TCanvas(nil));
  FSplash := NewSplash;
  FSplash.Bitmap.SetSize(200, 200);
  with Mouse.CursorPos do
  begin
    Capture(X, Y);
    FSplash.Move(X + 40, Y + 40);
  end;
  FSplash.Visible := True;
  MouseMonitor.Add(MouseNotify);
  Timer.Enabled := True;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  Timer.Enabled := False;
  MouseMonitor.Remove(MouseNotify);
end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  with Mouse.CursorPos do
    Capture(X, Y);
end;

procedure TMainForm.Capture(X, Y: Integer);
var
  B: ISurface;
  R: TRectI;
begin
  R := FSplash.Bitmap.ClientRect;
  R.Offset(X - 100, Y - 100);
  R.Inflate(-66, -66);
  B := FSplash.Bitmap.Surface;
  B.Clear(clBlack);
  FDesktop.CopyTo(R, B, FSplash.Bitmap.ClientRect, $FF, rqLowest);
  B.StrokeRect(NewPen(clBlack), FSplash.Bitmap.ClientRect);
  FSplash.Update;
end;

procedure TMainForm.MouseNotify(Kind: TMouseNotifyKind; Button: TMouseButton; X, Y: Integer);
begin
  if Kind = nkMove then
    FSplash.Move(X + 40, Y + 40);
end;

end.