Hallo,
der Vorschlag, freie Bereiche mit einer ungenutzten Farbe zu belegen, wäre mir zu aufwändig. Außerdem nutze ich die Icons auch schon in anderen Progs.
Ich habe es nach einigen Versuchen geschafft, den Markierungsbalken zu Kürzen.
Dann störte mich, dass der Focusrahmen immer noch die volle Breite einnimmt. Nach weiteren Versuchen habe ich auch den auf die Breite des gekürzten Markierungsbalken gebracht.
Das Zeichnen des FocusRect ist eine XOR-Zeichnung. Ein 2. DrawFocusRect löscht den Rahmen wieder.
Ich zeichne am Schluss den Focusrahmen, der frei bleiben soll. Wird anschließend vom System der volle Rahmen gezeichnet, bleibt wegen XOR nur der kleine Rahmen übrig.
Jetzt bleibt das Icon frei und nur der Text wird markiert.
Die wichtigen Stellen habe ich mal als Source aufgelistet (Ich hoffe, ich werde jetzt nicht gesteinigt: da ich beruflich in C, C++ programmiere, mache ich das auch privat mit Borland C++. Ich habe versucht, den SourceCode in Pascal zu übersetzen, Fehler bitte ich zu entschuldigen):
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:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
with (Control as TListBox) do begin if odSelected in State then begin Canvas.FillRect(Bounds(Rect.Left +<OffsetBisAnfangHighLight>, Rect.Top, Rect.Width -<OffsetBisAnfangHighLight>, Rect.Height())); end else begin Canvas.FillRect(Rect); end; Canvas.Draw(<OffsetBisIcon>, Rect.Top, Bitmap); Canvas.TextOut (<OffsetBisIcon> +<Iconbreite> +<Abstand bis Text>, Rect.Top +2, ListBox.Items.Strings[Index]); if odFocused in State then begin Canvas.DrawFocusRect(Bounds(Rect.Left, Rect.Top, <OffsetBisAnfangHighLight>, Rect.Height())); end; end;
end; |
Edit:
code optimiert, Erklärung zum Verkleinern des FocusRahmens ergänzt
Gruß DiBagger