Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - OnDrawItem bei anderen Komponeten, bzw selbst machen ?
F34r0fTh3D4rk - Sa 30.07.05 19:25
Titel: OnDrawItem bei anderen Komponeten, bzw selbst machen ?
Hallo, bei der Listbox, werden die Items immer so schön neu gezeichnet, wenn sich zB die größe verändert, wie kann ich das zB bei einer image komponente machen ?
Erstmal sag ich, was ich vor habe:
Ich möchte einen text anzeigen lassen (wie ein label halt), wenn der text zu lang ist, soll er durch '...' gekürzt werden, das funzt mit ner image komponente schonmal einwandfrei, wenn ich diese jetzt aber in der größe verändere, ändert sich das bild nicht, also der text wird nicht neu gezeichnet, bzw die pünktchen wandern nicht weiter nach hinten an den text, man sieht nicht mehr als vorher.
Kleines Beispiel:
Aus
"Iron Maiden - Can I Play With Madness"
wird
"Iron Maiden - Can I ..."
wenn das Formular breiter wird steht dann da zB:
"Iron Maiden - Can I Play ..."
Wie mache ich des ? Mit der Listbox geht's perfekt, aber so halt nicht :?
F34r0fTh3D4rk - So 31.07.05 12:12
das ondraw von meiner listbox sieht so aus (ok da wird jetzt noch ein bild eingefügt und geprüft, ob eine scrollbar angezeigt wird, der rest dient dann zum kürzen des textes auf die maximale länge die ins canvas passt):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TMainForm.LB_PlaylistDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var str: string; len: integer; i: integer; begin str := LB_Playlist.Items[index]; with LB_Playlist.Canvas do begin len := Textwidth(str) + IMG_Icon.width + 1; if LB_PLaylist.ItemHeight * LB_Playlist.Count > LB_Playlist.ClientHeight then len := len + 17 + 1; if len > LB_Playlist.width then for i := length(str) downto 1 do begin str := copy(str, 1, i); str := str + '...'; len := Textwidth(str) + IMG_Icon.width + 2; if LB_PLaylist.ItemHeight * LB_Playlist.Count > LB_Playlist.ClientHeight then len := len + 17 + 1; if len <= LB_Playlist.width then break else if i = 1 then str := ''; end; FillRect(Rect); bitblt(LB_Playlist.Canvas.Handle, Rect.left + 1, Rect.Top + 1, IMG_Icon.width, IMG_Icon.height, IMG_Icon.Canvas.Handle, 0, 0, SRCAnd); TextOut(Rect.Left + 1 + IMG_Icon.Width + 1, Rect.Top, str); end; end; |
@Lannes: Bei dem Link wird ja auch ein OnDrawItem benutzt, aber bei einem image habe ich das ja nicht :?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!