![]() |
ListBox Items Brush zweifarbig?
Ist es möglich einem Item einer ListBox einen zweifarbigen Brush zu geben?
Ich möchte gerne, dass das selektierte Item immer einen ~5px breiten, sich rechts befindlichen, andersfarbigen Balken hat. Etwa so: [Caption |] Die Pipe | soll der andersfarbige Teil sein. Der Rest (unter der Caption) ist bei mir blau
Delphi-Quellcode:
TListBox(Control).Canvas.Brush.Color ...
|
AW: ListBox Items Brush zweifarbig?
OnDrawItem -> ListBox.Canvas.irgenwelcherbeliebigerscheiß
|
AW: ListBox Items Brush zweifarbig?
Liste der Anhänge anzeigen (Anzahl: 1)
Du verstehst mich falsch :P
ich zeichne meine Items alle schon selber das ist nicht das Problem. Aber ich möchte gerne das selektierte Item zweifarbig haben. Ich hänge mal ein Bild an. Das obere ist ja immer so wenn man Brush setzt und das untere ist mein Ziel. |
AW: ListBox Items Brush zweifarbig?
Das geht so nicht! Du musst den rechten Streifen zusätzlich drüber malen.
|
AW: ListBox Items Brush zweifarbig?
Das dachte ich mir irgendwie schon.
Ich würde dafür ein Shape erzeugen und es einfach dort platzieren oder ist das eher nicht so gut? |
AW: ListBox Items Brush zweifarbig?
Dann mal doch einfach rechts den grünen Streifen/Rectangle hin. :zwinker:
Ein Brush hat eine gewisse Größe ... soooooo groß, dass er über die gesamte Breite des des Items reicht, wird er nicht sein dürfen. |
AW: ListBox Items Brush zweifarbig?
Ist der Brush denn nicht genau so groß wie das Item selber?
Das mit dem Rectangle verstehe ich nicht. Also im Prinzip doch ein Shape oder sowas? Edit: sehe gerade ich kann ja die Größe von Rect ändern... ok das klappt dann ja schonmal. Und dann noch ein Shape? Warte ich habs jetzt kapiert. Ich kann den grünen Streifen nicht einfach rechts dran malen denn mein Rect ist (ich habs nicht geändert) so groß wie das Item selber. Das sehe ich wenn ich Rect.Width := Rect.Width-5; mache. Mein Rect brauche ich um die Hintergrundfarbe des items zu setzen. DAS ist ja das Problem :P |
AW: ListBox Items Brush zweifarbig?
Kannst du nicht einfach mal deinen Code zum Zeichnen eines Items zeigen? Dann könnte man gezielt einen Hinweis geben, wie es am einfachsten gehen könnte.
|
AW: ListBox Items Brush zweifarbig?
Hier ein Beispiel
Delphi-Quellcode:
// aListBoxBrushColor: array [Boolean] of TColor = (clRed, clWhite);
// aListBoxFontColor: array [Boolean] of TColor = (clInactiveCaptionText, clBlack); procedure TForm3.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var oldFontColor: TColor; oldFontName: string; oldFontS: Byte; aLBCanvas: TCanvas; begin aLBCanvas := TListBox(Control).Canvas; if odSelected in State then begin aLBCanvas.Brush.Color := aListBoxBrushSelectedColor; aLBCanvas.Font.Color := aListBoxFontSelectedColor; end else begin aLBCanvas.Brush.Color := aListBoxBrushColor[Odd(Index)]; aLBCanvas.Font.Color := aListBoxFontColor[(Enabled)]; end; aLBCanvas.FillRect(Rect); oldFontColor := aLBCanvas.Font.Color; oldFontS := aLBCanvas.Font.Size; oldFontName := aLBCanvas.Font.Name; aLBCanvas.TextOut(Rect.Left + 5, Rect.Top + (Rect.Height div 2) - 5, TListBox(Control).Items[Index]); if odFocused in State then begin aLBCanvas.Brush.Color := TListBox(Control).Color; aLBCanvas.DrawFocusRect(Rect); end; aLBCanvas.Font.Color := oldFontColor; aLBCanvas.Font.Size := oldFontS; aLBCanvas.Font.Name := oldFontName; end; |
AW: ListBox Items Brush zweifarbig?
Setz doch mal folgenden Code hinter das TextOut:
Delphi-Quellcode:
if odSelected in State then
begin aLBCanvas.Brush.Color := aListBoxBrushSelectedColor2; // die Farbe des rechten Streifens aLBCanvas.FillRect(Rect.SplitRect(srRight, 5)); // 5 Pixel am rechten Rand end; |
AW: ListBox Items Brush zweifarbig?
Danke vielmals.
SplitRect, darauf muss man erstmal kommen. Verstehe ich den Ablauf richtig? 1) Brush wird gesetzt (Farbe1) 2) Text wird ausgegeben 3) Brush wird erneut gesetzt (Farbe2) 4) Rect wird aufgeteilt? Wie kann das Rect denn dann noch Farbe1 behalten, wenn ich sie doch bei 4) neu setze? Oder wird die festgesetzt, sobald ich FillRect ausführe? |
AW: ListBox Items Brush zweifarbig?
Zitat:
SplitRect gibt ein neues Rechteck zurück - in diesem Fall eins, daß nur die rechten 5 Pixel Breite des Originals enthält. |
AW: ListBox Items Brush zweifarbig?
Ok gut zu wissen. Ich wäre jetzt sonst mit einem Shape rangegangen :D
ich stelle mir nur noch eine Frage: permanent den Fokus eines Items (dotted Umrandung) bekommt man keines Falls weg oder? Ich meine den vorher/irgendwann mal wegbekommen zu haben aber ich weiß nicht mehr wie :( |
AW: ListBox Items Brush zweifarbig?
Zitat:
Delphi-Quellcode:
in deinem Quellcode?
aLBCanvas.DrawFocusRect(Rect);
|
AW: ListBox Items Brush zweifarbig?
Also was ich jetzt genau meine auf deine Frage bezogen weiß ich nicht.
Aber der Fokusrahmen wird ab und zu doch eingeblendet, obwohl er doch ausgeblendet bleiben sollte (das war schon vorher so). Nur wie bekomme ich den Fokusrahmen komplett weg? |
AW: ListBox Items Brush zweifarbig?
Er erscheint nur ab und zu?
|
AW: ListBox Items Brush zweifarbig?
Genau. Warum auch immer das passiert, ich weiß es nicht.
|
AW: ListBox Items Brush zweifarbig?
Kommentiere doch einfach die Zeile mit DrawFocusRect aus. Das wird intern mit XOR gezeichnet und kann zusammen mit dem Rest des Draw-Codes zu merkwürdigen Effekten führen.
|
AW: ListBox Items Brush zweifarbig?
Ich habe gar keine Zeile mit DrawFocusRect :P
Ich hab nur den Code von Seite + die Änderung. |
AW: ListBox Items Brush zweifarbig?
Zitat:
Zitat:
|
AW: ListBox Items Brush zweifarbig?
Zitat:
Zitat:
|
AW: ListBox Items Brush zweifarbig?
Zitat:
|
AW: ListBox Items Brush zweifarbig?
Ich habe
Delphi-Quellcode:
jetzt einfach noch einmal hinzugefügt.
aLBCanvas.DrawFocusRect(Rect);
Es ist nun deine Änderung drin, als auch aLBCanvas.DrawFocusRect(Rect); drunter. Der Fokusrahamen taucht jetzt deutlich seltener auf. Er taucht nur noch dann auf, wenn ich entweder mit TAB in das Control tabbe oder von einem anderen Fenster zurück in mein Programm tabbe und das Control den Focus zurückbekommt. Sobald ich in der ListBox aber rumklicke, verschwindet es (wie gewollt). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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