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