Рисование текста Юникода на холсте списка слишком медленное
Я пытаюсь отобразить новости из RSS в списке, используя следующий формат, как показано на рисунке ниже. Приложение на скриншоте было разработано в Firemonkey с помощью стилизации списка. Мне нужно отобразить то же самое в моем приложении VCL.
Требования этого макета:
Название новости должно быть выделено жирным шрифтомКраткое описание должно быть расположено внизу, и оно должно быть обернуто, если оно не помещается в одну строку (как показано на рисунке); стиль шрифта должен быть нормальнымТам должно быть изображение для каждой новостиМой код до сих пор:
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;
Вот результат, который я получаю:
проблемаРисование текста в Юникоде происходит слишком медленно и слишком сильно мигает при прокрутке списка или изменении размера формы.
Заметка
Шрифт был установлен на@Microsoft NeoGothicВысота элемента = 70; style = ownerdrawfixedНет проблем с отображением того же текста Unicode в приложении Firemonkey, размещенном на первом скриншоте.Приведенный выше код работает довольно хорошо для обычного английского текста и не мерцает вообще. Проблема существует только для текста Unicode.Обновить: Кажется, проблема вDT_WORDBREAK флагDrawText метод. Всякий раз, когда я удаляю этот флаг, происходит значительное улучшение рисования текста, хотя мерцания видны.
Образец текста Unicoide
तिम्रो त्यो बोलि ले मलाई मिठो तिम्रो त्यो मलाई मलाई मलाई मलाई ह्स्द्जिः ह्स्द्जिः स हस हस हस हस स्द्फ़ स्द्फ्ग फस ग्दस्फ्ग बोलि बोलि बोलि ले सफग द्स्फग्द