{************************************************************************* Unit Name: MarkerForm Purpose : Totally transparent form for making notes over other application Author : Vesa Lappalainen Date : 8.2.2001 Changed : 10.2.2001 + colors + line widths + fill/no fill + line, rectangle, ellipse and dragging + redrawing the picture + FormOption + undo/redo Usage : Todo : - some problems with redrawing - layers, selecting visible - selecting one object and changing the properties/delete - saving to file - different cursor for different type - orto-drawing - macros = record drawing and keep that as one object (or undo objects and call that list as a macro) *************************************************************************} unit MarkerForm; interface uses Windows, ShellApi, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AppEvnts, ExtCtrls,DrawObject, ActnList; type TFormMarker = class(TForm) ApplicationEvents1: TApplicationEvents; Timer1: TTimer; TimerRedraw: TTimer; ActionList1: TActionList; ActionHelpContents: TAction; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); procedure FormCreate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure ApplicationEvents1Activate(Sender: TObject); procedure ApplicationEvents1Deactivate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure TimerRedrawTimer(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ActionHelpContentsExecute(Sender: TObject); private objs : TDrawingObjects; StartPt : TPoint; EndPt : TPoint; fundo : TDrawingObjects; obj : TDrawingObject; maxi,minimizing : boolean; procedure DoSettings; public procedure Undo; procedure Redo; procedure Clear; procedure Redraw; procedure SetCurrent; procedure Paint; override; procedure WMEraseBackground(var Msg:TMessage); message WM_ERASEBKGND; end; var FormMarker: TFormMarker; implementation uses OptionsForm; {$R *.DFM} { TForm1 } procedure TFormMarker.FormCreate(Sender: TObject); begin objs := TDrawingObjects.Create; fundo := TDrawingObjects.Create; SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT); end; procedure TFormMarker.FormDestroy(Sender: TObject); begin objs.Free; fundo.Free; end; procedure TFormMarker.Paint; begin // inherited; objs.Draw(canvas); end; procedure TFormMarker.WMEraseBackground(var Msg: TMessage); begin // end; procedure TFormMarker.DoSettings; begin if ( obj = nil ) then exit; obj.Filled := FormOptions.CBFilled.Checked; obj.Pen.Color := FormOptions.PanelColor.Color;; obj.Pen.Mode := TPenMode(Round(FormOptions.EditStyleEditDouble.Value)); obj.Pen.Width := Round(FormOptions.EditWidthEditDouble.Value); obj.CheckSettings(canvas); end; procedure TFormMarker.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ( ssRight in Shift ) then exit; obj := ExampleGObjects.NewObject[FormOptions.EditType.AsString]; if ( obj = nil ) then exit; if not ( ssCtrl in Shift ) then begin StartPt.x := x; StartPt.y := y; end; if ( ssShift in Shift ) then begin StartPt := EndPt; end; DoSettings; obj.StartPoint(Canvas,StartPt.x,StartPt.y); OnMouseMove := FormMouseMove; end; procedure TFormMarker.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ( obj = nil ) then exit; obj.AddPoint(Canvas,x,y); end; procedure TFormMarker.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ( obj = nil ) then exit; if ( not Assigned(OnMouseMove) ) then exit; obj.EndPoint(Canvas,x,y); objs.AddObject(obj); EndPt.x := x; EndPt.y := y; OnMouseMove := nil; end; procedure TFormMarker.FormContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin FormOptions.Show; end; procedure TFormMarker.FormKeyPress(Sender: TObject; var Key: Char); begin FormOptions.HandleKey(Key); if ( Assigned(OnMouseMove) ) then DoSettings; end; procedure TFormMarker.ApplicationEvents1Activate(Sender: TObject); begin maxi := true; if ( FormOptions.IsLinux ) then exit; if not minimizing then begin Application.Restore; //Application.Maximize; // Height := 500; // ShowMessage(Format('%d %d',[Width,Height])); // Height := 500; // WindowState := wsNormal; if ( FormOptions.IsLinux ) then Redraw; end; end; procedure TFormMarker.ApplicationEvents1Deactivate(Sender: TObject); begin if ( maxi ) then exit; minimizing := true; if ( not FormOptions.IsLinux ) then Application.Minimize; end; procedure TFormMarker.Timer1Timer(Sender: TObject); begin maxi := false; minimizing := false; end; procedure TFormMarker.TimerRedrawTimer(Sender: TObject); begin TimerRedraw.Enabled := false; TimerRedraw.Interval := 100; Paint; Application.BringToFront; end; procedure TFormMarker.Redraw; var v : boolean; begin maxi := true; minimizing := true; v := FormOptions.Visible; Application.Minimize; Application.Restore; if ( v ) then FormOptions.Show; Show; TimerRedraw.Enabled := true; end; procedure TFormMarker.Clear; var o : TDrawingObject; begin while ( true ) do begin o := objs.Pop; if ( o = nil ) then break; fundo.AddObject(o); end; Redraw; end; procedure TFormMarker.Redo; begin objs.AddObject(fundo.Pop); objs.Draw(Canvas); obj := objs.Last; end; procedure TFormMarker.Undo; begin fundo.AddObject(objs.Pop); Redraw; obj := objs.Last; end; procedure TFormMarker.SetCurrent; begin DoSettings; Redraw; end; procedure TFormMarker.ActionHelpContentsExecute(Sender: TObject); var s:string; begin s := ChangeFileExt(Application.ExeName,'.html'); ShellExecute(Handle,'open',PChar(s),nil,'',SW_SHOW); end; end.