Salut,

J'ai un probleme avec le paint event de TPaintBox.
Premierement lorsque je maximise ou j'appel la procedure refresh du paintbox tous va bien, le paint se fait normalement

Le probleme est lorsqu'il y a une autre fenetre devant mon PaintBox et que je click sur la surface de mon PaintBox alors le event paint est appeler mais il garde des trace indesirable !!! La meme chose se produit lorsque je ferme une application qui se trouve devant.

La seul facon que j'ai trouve pour resoudre le probleme a ete de demarrer un timer a toute les fois qu'un event paint etait declancher

Mais y-a-t-il une methode plus armonieuse ?

Voici mon code
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls ;
 
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Panel1: TPanel;
    Memo1: TMemo;
    bRefresh: TButton;
    bOnPaint: TButton;
    Timer1: TTimer;
    bDessin: TButton;
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseLeave(Sender: TObject);
    procedure PaintBox1MouseEnter(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bRefreshClick(Sender: TObject);
    procedure bOnPaintClick(Sender: TObject);
    procedure bDessinClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    procedure Clear;
    procedure CrossCursor(X, Y: Integer);
    procedure Log(S: String);
    procedure Dessin;
  public
    Lx,Ly:integer;
    CrossCursorEnable: Boolean;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.bOnPaintClick(Sender: TObject);
begin
  PaintBox1Paint(sender);
end;
 
procedure TForm1.bRefreshClick(Sender: TObject);
begin
  paintbox1.Refresh;
end;
 
procedure TForm1.bDessinClick(Sender: TObject);
begin
  with paintbox1.Canvas do begin
    pen.Mode:=pmCopy;
    pen.Color:= clred;
    moveto(30,50);LineTo(paintbox1.width-100,paintbox1.Height-50);
  end;
end;
 
Procedure TForm1.Clear;
Begin
  with PaintBox1.canvas do begin
    Pen.mode:=pmCopy;
    brush.Style := bssolid;
    brush.color:=clWhite;
    pen.color:=clwhite;
    rectangle(0,0,paintbox1.width,paintbox1.height);
  end;
End;
 
Procedure TForm1.CrossCursor(X,Y:Integer);
Begin
 If CrossCursorEnable then begin
  with paintbox1.Canvas do begin
    pen.Mode:=pmnotxor;
    pen.Color:= clblack;
 
    moveto(0,LY);LineTo(paintbox1.width,Ly);
    moveto(Lx,0);LineTo(Lx,paintbox1.Height);
 
    moveto(0,Y);LineTo(paintbox1.width,y);
    moveto(X,0);LineTo(x,paintbox1.Height);
  end;
  Lx:=x;
  Ly:=Y;
 end;
End;
 
Procedure TForm1.Dessin;            //Dessin bidon pour fin de test
Begin
  with paintbox1.Canvas do begin
    pen.Mode:=pmCopy;
    pen.Color:= clblue;
    moveto(0,0);LineTo(paintbox1.width,paintbox1.Height);
    moveto(paintbox1.width,0);LineTo(0,paintbox1.Height);
  end;
End;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  CrossCursorEnable:=true;
end;
 
Procedure TForm1.Log(S:String);
Begin
  Memo1.lines.add(FormatDateTime('HH:NN:SS:ZZZ',now) + ',' + s);
End;
 
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  CrossCursor(-10,-10);
  //...code
  log('MouseDown');
  CrossCursor(x,y);
end;
 
procedure TForm1.PaintBox1MouseEnter(Sender: TObject);
begin
  Log('MouseEnter');
  CrossCursor(-10,-10);
end;
 
procedure TForm1.PaintBox1MouseLeave(Sender: TObject);
begin
  Log('MouseLeave');
  CrossCursor(-10,-10);
end;
 
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  Log('MouseMove');
  caption := inttostr(x)+','+inttostr(y);
  CrossCursor(x,y);
end;
 
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  CrossCursor(-10,-10);
    //...
  log('MouseUp');
  CrossCursor(x,y);
end;
 
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 
  Log('Paint');
  Timer1.Enabled := true;   //  <--S'EST ICI QUE DEVRAIT REDESSINER
  Timer1.Interval := 1;       //  <-- AU LIEU JE DOIT APPELER UN TIMER POUR  
                                      //<--  POUR QU'IL LE FASSE.
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 
Timer1.Enabled := false;
Timer1.Interval := 0;
  Log('Paint dans timer');
  Clear;                   //Efface l'espace de travail
  Dessin;                  //<-dessin bidon pour fin de test
  lx:=-10;ly:=-10;
end;
end.