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 Combobox owenerdraw (https://www.delphipraxis.net/97614-combobox-owenerdraw.html)

hanspeter 13. Aug 2007 16:20


Combobox owenerdraw
 
Hallo,
vielleicht hat wer einen schnellen Tip.
Ich habe eine Combobox. In der Liste dieser Combobox möchte ich eine einzelne Zeile färben.
Das geht ja mit csOwnerDrawFixed problemlos.
Leider ist in diesem Mode das Editfeld der Combobox dann readonly.

Weis wer wie ich in einer Combobox im Style csDropDown, trotzdem im Listteil zeichen kann
oder im Style csOwnerDrawFixed das Editfeld funktioniert ?

Gruß
Peter

_frank_ 13. Aug 2007 17:35

Re: Combobox owenerdraw
 
Liste der Anhänge anzeigen (Anzahl: 1)
hat mich auch interesiert und bin hier (mittels google)
http://www.delphi.cz/soubor.asp?rok=...r=dlfaaaap.htm
fündig geworden :)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TXYComboBox = class(TComboBox)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ComboBox1Change(Sender: TObject);
  private
    XYCombo: TXYComboBox;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TXYCombo }

procedure TXYComboBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
    Style := Style or CBS_OWNERDRAWFIXED;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  XYCombo := TXYComboBox.Create(Self);
  with XYCombo do
  begin
    Parent := Self;
    Style := csDropDown;
    for I := 1 to 100 do Items.Add(Format('Item %d', [I]));
    OnDrawItem := ComboBox1DrawItem;
    OnChange := ComboBox1Change;
  end;
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with TXYComboBox(Control) do
  begin
    Canvas.Font.Color := Index * 5000;
    Canvas.TextRect(Rect, Rect.Left, Rect.Top, Items[Index]);
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  MessageBeep(0);
end;

end.
ich kann zwar kein tschechisch, aber code sagt mehr als 1000 worte *g*

evtl. findet der code auch Anklang in der Codelib

//edit
nimmt man in CreateParams den Style CBS_OWNERDRAWVARIABLE lassen sich die Items in der Höhe verändern.
hab beim debuggen herausgefunden, dass man mit der ItemID prüfen kann, ob es sich um die Combobox oder die "Listbox" handelt. Die Items der Listbox fangen mit 0 an, -1 ist die Combo selbst. So kann man erreichen, dass bei größeren Items in der Liste die Combobox nicht mitwächst (wie sich das ItemHeight in der VCL auswirkt).
Delphi-Quellcode:
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;

procedure TFWComboBox.CNMeasureItem(var Message: TWMMeasureItem);
begin
  if Message.MeasureItemStruct^.ItemId>-1 then
    Message.MeasureItemStruct^.itemHeight := FItemheight //height of list-entries
  else
    Message.MeasureItemStruct^.itemHeight := 15; //height of item in CB itself
end;
ist übrigends auch ein Trick, um die combobox kleiner als 21px in der Höhe zu bekommen, wenn man das normale Eingabe-Feld behalten will...funktioniert auch mit dem CBS_OWNERDRAWFIXED

"kleine" demo-anwendung mit richtiger Klasse im Anhang (werde die wohl in meinen DFMeditor einbauen) :)
weis nur noch nicht, wie man ggf. in der Combo selbst noch malen kann (leinwand erlaubt kein zeichnen, beim zugriff auf Combobox.canvas, wenn Liste geschlossen) und den text ab nem gewissen punkt beginnen lassen kann (wenn icon davor).

HTH Frank

hanspeter 14. Aug 2007 08:00

Re: Combobox owenerdraw
 
Danke!
werde ich ausprobieren.

Gruß Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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