Thema: Delphi Combobox owenerdraw

Einzelnen Beitrag anzeigen

Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: Combobox owenerdraw

  Alt 13. Aug 2007, 18:35
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
Angehängte Dateien
Dateityp: zip ownerdrawcb_522.zip (100,8 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat