![]() |
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 |
Re: Combobox owenerdraw
Liste der Anhänge anzeigen (Anzahl: 1)
hat mich auch interesiert und bin hier (mittels google)
![]() fündig geworden :)
Delphi-Quellcode:
ich kann zwar kein tschechisch, aber code sagt mehr als 1000 worte *g*
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. 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:
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
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; "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 |
Re: Combobox owenerdraw
Danke!
werde ich ausprobieren. Gruß Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz