J'essaie de mettre en œuvre mon propre dessin sur un TEdit
lorsqu'il n'a pas le focus (montrer les ellipses en TEdit
lorsque l'éditeur n'affiche pas complètement son texte). J'ai donc commencé par ce code :
type
TEdit = class(StdCtrls.TEdit)
private
FEllipsis: Boolean;
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEllipsis := False;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TEdit.Destroy;
begin
FCanvas.Free;
inherited;
end;
procedure TEdit.WMPaint(var Message: TWMPaint);
begin
if FEllipsis and (not Focused) then
begin
// Message.Result := 0;
// TODO...
end
else
inherited;
end;
Remarquez que lorsque FEllipsis and (not Focused)
le gestionnaire de message ne fait rien.
Maintenant, j'ai laissé tomber un TButton
et 2 TEdit
sur le formulaire, et ajouté des contrôles de formulaire OnCreate
:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit2.FEllipsis := True;
end;
Je m'attendais à Edit1
pour tirer normalement, et Edit2
de ne rien dessiner à l'intérieur du contrôle d'édition.
Au lieu de cela, le gestionnaire de messages a été traité sans fin, Edit1
ne s'affichait pas non plus, et l'application entière s'étouffait (avec une utilisation de 25 % du processeur !). J'ai également essayé de renvoyer Message.Result := 0
- même effet.
Maintenant, la partie "étrange" : Lorsque j'obtiens la poignée du canevas avec BeginPaint
Tout fonctionne comme prévu.
procedure TEdit.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
begin
if FEllipsis and (not Focused) then
begin
if Message.DC = 0 then
FCanvas.Handle := BeginPaint(Handle, PS)
else
FCanvas.Handle := Message.DC;
try
// paint on FCanvas...
finally
FCanvas.Handle := 0;
if Message.DC = 0 then EndPaint(Handle, PS);
end;
end
else
inherited;
end;
Remarquez que je n'ai pas appelé inherited
soit.
Comment expliquer ce comportement ? Merci de votre compréhension.