Ich versuche, Nachrichten aus einem RSS in einer Listbox mit dem folgenden Format anzuzeigen, wie in der Abbildung unten gezeigt. Die Anwendung auf dem Screenshot wurde in Firefemonkey entwickelt, indem die Listbox formatiert wurde. Ich muss dasselbe in meiner VCL-Anwendung anzeigen.Zeichnen von Unicode Text auf Listbox Canvas ist zu langsam
Die Anforderungen dieses Layouts sind:
- Die Nachricht Titel fett gedruckten Text
- Die kurze Beschreibung sollte, wenn es am Boden, und es sollte sein gewickelt doesn befinden sollte‘ t passt in eine einzelne Linie (wie im Bild gezeigt); font-style sollte normal sein
- Es sollte
Mein Code bisher ein Bild für jede News sein:
procedure TfrmDatePicker.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
R: TRect;
begin
ListBox1.Canvas.Font.Color := clBlack;
ListBox1.Canvas.Font.Style := [fsBold];
ListBox1.Canvas.Font.Size := 9;
if Odd(Index) then ListBox1.Canvas.Brush.Color := clWhite
else ListBox1.Canvas.Brush.Color := clBtnFace;
ListBox1.Canvas.FillRect (Rect);
ListBox1.Canvas.Pen.Color := clHighlight;
if(odSelected in State) then
begin
ListBox1.Canvas.Font.Color := clHighlightText;
ListBox1.Canvas.Brush.Color := clHighlight;
ListBox1.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
if(odFocused in State) then DrawFocusRect(ListBox1.Canvas.Handle, Rect);
end;
ImageList1.Draw(ListBox1.Canvas, Rect.Left + 2,
Rect.top + (ListBox1.ItemHeight - ImageList1.Height) div 2, Index, true);
ListBox1.Canvas.TextOut(Rect.Left + 70, Rect.Top + 4, 'कान्तिपुर समाचारआजकोपत्रिकामाकेहिछैन');
ListBox1.Canvas.Font.Style := ListBox1.Canvas.Font.Style - [fsBold];
R := Rect;
R.Left := R.Left + 70;
R.Top := R.Top + 32;
R.Height := 30;
DrawText(ListBox1.Canvas.Handle, PChar(ss), Length(ss), R, DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
ListBox1.Canvas.TextOut(Rect.Right - 80, Rect.top + 4, '5 mins ago');
end;
Hier wird die Ausgabe erhalte ich:
Problem
Die Unicode-Textzeichnung ist zu langsam und es flackert zu sehr, wenn die Listbox gescrollt wird oder die Größe des Formulars geändert wird.
Hinweis
- Die Schriftart @microsoft neugotischen gesetzt wurde
- ItemHeight = 70; style = ownerdrawfixed
- Es gibt kein Problem beim Zeichnen des gleichen Unicode-Textes in der firemonkey Anwendung, die im ersten Screenshot gepostet wurde.
- Der oben geschriebene Code funktioniert ziemlich gut für normalen englischen Text und gibt es überhaupt kein Flackern. Das Problem besteht nur für Unicode-Text.
Update: Es scheint, das Problem ist in DT_WORDBREAK Flagge DrawText Methode. Immer wenn ich dieses Flag entferne, gibt es eine deutliche Verbesserung in der Zeichnung des Textes, obwohl das Flackern sichtbar ist.
Probe Unicoide Text
तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई झुलायो झुलाओ ह्स्द्जिः स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मम मलमलई स ह्स्ध्फद्ज द्श्जड्स हस फग ्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द
Ich bin verwirrt, warum Sie eine VCL-Anwendung getrennt von einer FMX-Anwendung erstellen. Ich bin neugierig, warum Sie das tun müssten? Ist das nur zum Testen? –
@JerryDodge Eigentlich schreibe ich eine VCL-Anwendung mit mehreren Funktionen. Newsreader ist einer von ihnen ist nur noch um zu implementieren. Ich habe versucht, nach benutzerdefinierten Zeichnungen zu suchen, die den wichtigen Teil anzeigen. Der erste Versuch ist http://stackoverflow.com/questions/33057500/displaying-items-on-the-dbctrlgrid-without-datasource-in-delphi, aber ich konnte nicht die richtige Antwort bekommen. Es ist keine gute Idee, für dieses einzelne Modul einen FireMonkey zu mischen. –
Nun, mein Punkt war, wenn Sie dies in Firemonkey schreiben, nehme ich an, dass Sie dies als Multi-Plattform getan haben. Nun, Windows ist eine der unterstützten Plattformen. Warum nicht nur eine Code-Basis behalten? –