我正在尝试使用以下格式在列表框中显示来自 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;
这是我得到的输出:
问题
Unicode 文本绘制速度太慢,并且在滚动列表框或调整窗体大小时闪烁太多。
笔记
- 字体已设置为@Microsoft NeoGothic
- 项目高度 =70;样式 = ownerdrawfixed
- 在第一个屏幕截图中发布的 firemonkey 应用程序中绘制相同的 unicode 文本没有问题。
- 上面发布的代码对于普通的英文文本来说工作得很好,根本没有闪烁。该问题仅存在于 Unicode 文本。
更新: 似乎问题出在DrawText方法的DT_WORDBREAK标志中。每当我删除此标志时,虽然闪烁可见,但在绘制文本时会有显着改进。
示例 Unicode 文本
तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई झुलायो झुलाओ ह्स्द्जिः स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द