Bonjour à toutes et à tous,

Pour tracer un rectangle en pointillé qui se déforme avec le déplacement de la souris, j'utilise ce qui suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, LResources, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    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 FormCreate(Sender: TObject);
  private
    { private declarations }
    P0, P1: TPoint;
    PA, PB: TPoint;
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  PA.X:= 0;
  PA.Y:= 0;
  PB.X:= 0;
  PB.Y:= 0;
end;
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
  begin
    Canvas.Pen.Style:= psDash;
    Canvas.Pen.Mode:= pmNotXor;
    P0.X:= X;
    P0.Y:= Y;
    P1.X:= X;
    P1.Y:= Y;
    if (PA.X = 0) and ( PA.Y = 0) and (PB.X = 0) and (PB.Y = 0) then
      Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y)
    else {effacement du rectangle après le relevé de la souris}
      Canvas.Rectangle(PA.X, PA.Y, PB.X, PB.Y);
  end;
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y); {effaçage}
    P1.X:= X;
    P1.Y:= Y;
    Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y); {Retraçage}
  end;
end;
 
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  PA.X:= P0.X;
  PA.Y:= P0.Y;
  PB.X:= P1.X;
  PB.Y:= P1.Y;
end;
 
end.
Je voudrais utiliser la bibliothèque BGRABitMap pour ses diverses possibilités et notamment le "Scanline".

Pour autant, je n'arrive pas à faire ce que j'ai décrit ci-dessus car dans la bibliothèque BGRABitMap, "CanvasBGRA.Pen" ne possède pas la propriété "Mode" que je mets à "pmNotXor" qui me permet l'effacement du rectangle précédent au fur et à mesure que la souris se déplace.

Comment faites-vous ?

Merci de votre aide.

Pierre