Guten Morgen,
weil ich nicht allen
VCL-Komponenten nachträglich eine Funktionalität "vererben" kann und die Methode aus Beitrag #22 mir selbst nicht gefallen hat, hier noch ein Ansatz:
Delphi-Quellcode:
procedure Decorate(hdc: HDC; r: TRect; penColor: TColor);
const
PENWIDTH = 2;
begin
with TCanvas.Create
do
try
Handle := hdc;
Pen.Width := PENWIDTH;
Pen.Color := penColor;
InflateRect(r, PENWIDTH, PENWIDTH);
Brush.Style := bsClear;
Rectangle(r);
finally
Free;
end;
end;
So können nicht nur Label mit einem visual clue ausgestattet werden. Auch die Einbettung (Parent) darf belieb sein.
Nach Auslotung der verschiedenen Möglichkeiten hat mir der Ansatz (bsClear) von Thomas in Beitrag #19 am besten gefallen.
Der Hinweis von Ingo in Beitrag #24 ist richtig, aber bei Einhaltung der gängigen Style Guides sollen Controls mit mindestens vier Pixeln freigestellt werden, so dass ein zwei Pixel dicker Rahmen keine Überdeckungen verursacht.
Wird der Rahmen auf die jeweilige visuelle Komponente selbst gezeichnet, dann fehlt mir der punmping effect. Und FrameRect() zeichnet leider nur den dünnst-möglichen Rahmen (ein Pixel), was mir zu mager ist.
Getestet habe ich so:
Delphi-Quellcode:
procedure TDemoForm.LabelEnter(Sender: TObject);
begin
with Sender
as TLabel
do
Decorate(GetDC(
Handle), BoundsRect, clHighlight);
end;
procedure TDemoForm.LabelLeave(Sender: TObject);
begin
with Sender
as TLabel
do
Decorate(GetDC(
Handle), BoundsRect, self.Color);
end;
Freundliche Grüße