Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Gelöst: Ablauf beim Erzeugen einer Combobox (https://www.delphipraxis.net/188410-geloest-ablauf-beim-erzeugen-einer-combobox.html)

ernschd 29. Feb 2016 16:47


Gelöst: Ablauf beim Erzeugen einer Combobox
 
Hallo,

ich arbeite derzeit an eigenen Komponenten, die u.a. eine andere Rahmenfarbe haben, wenn sie fokussiert sind. Meine Edit-Komponente funktioniert ganz nach meinen Vorstellungen, aber die Combobox macht Probleme.
Beispiel: Rahmenfarbe ist blau, fokussiert ist sie rot.
Nach dem Erzeugen ist die Combobox erst mal nur grau, erst ein kurzes Fokussieren und wieder verlassen ändert die Farbe auf blau. Wenn ich mit der Maus über die blaue Combobox gehe, ohne sie zu aktivieren, wechselt sie zu grau - genauer gesagt, beim verlassen. In dem Fall wird aber weder DoExit noch WMKillFocus aufgerufen.

Hat das evtl. was mit der ItemsList in der Combobox zu tun? Wie bekomme ich das gewünschte Verhalten hin?

Edit: Die Methode WMPaint hat gefehlt! Nun funktioniert es.

Hier die "wichtigsten" Auszüge aus dem Code:
Delphi-Quellcode:
constructor TTestComboBox.create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  ColorFocused     := clRed;
  ColorNotFocused  := clBlue;
  FSelected        := False;
end;

procedure TTestComboBox.DoEnter;
begin
  Inherited;
  if FSelected then exit;
  RedrawBorder;
end;

procedure TTestComboBox.DoExit;
begin
  Inherited;
  FSelected    := False;
  RedrawBorder;
end;

procedure TTestComboBox.WMSetFocus(var Message: TWMSetFocus);
begin
    Inherited;
    if not (csDesigning in ComponentState) then begin
        FSelected := True;
        RedrawBorder;
    end;
end;

procedure TTestComboBox.WMKillFocus(var Message: TWMKillFocus);
begin
    inherited;
    if not (csDesigning in ComponentState) then begin
        FSelected := False;
        RedrawBorder;
    end;
end;

procedure TTestComboBox.RedrawBorder;
var col: Cardinal;
begin
  inherited;
  if FSelected then
    col := rcolorfocused
  else
    col := rcolornotfocused;
  Fdc := GetWindowDC(Self.Handle);
  try
    if Fdc = 0 then exit;

    FPen := CreatePen(PS_SOLID, 1, col);
    try
        FOldPen := SelectObject(Fdc, FPen);
        FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
        if NOT Rectangle(Fdc, 0, 0, Width, Height) then exit;
        SelectObject(Fdc, FOldBrush);
        SelectObject(Fdc, FOldPen);
    finally
        DeleteObject(FPen);
    end;
  finally
      ReleaseDC(Self.Handle, Fdc);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz