【发布时间】:2016-01-13 23:22:07
【问题描述】:
我正在尝试使用以下格式在列表框中显示来自 RSS 的新闻,如下图所示。屏幕截图上的应用程序是通过设置列表框样式在 firemonkey 中开发的。我需要在我的 VCL 应用程序中显示相同的内容。
这种布局的要求是:
- 新闻标题应为粗体
- 简短的描述应该位于底部,并且应该是 如果它不适合单行,则包裹(如图所示); font-style 应该是正常的
- 每条新闻都应该有一张图片
到目前为止我的代码:
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; style = ownerdrawfixed
- 在中绘制相同的unicode文本没有问题 firemonkey 应用程序发布在第一个屏幕截图中。
- 上面发布的代码对于普通的英文文本和 根本没有闪烁。问题只存在于 Unicode 文本。
更新: 似乎问题出在 DrawText 方法的 DT_WORDBREAK 标志中。每当我删除此标志时,虽然闪烁可见,但在绘制文本时会有显着改进。
示例 Unicode 文本
तिम्रोतिम्रोत्योबोलिबोलिलेमलाईमिठोतिम्रोत्योमुस्कानमुस्कानमाझुलायोझुलाओह्स्द्जिःसह्स्ध्फद्जह्स्ध्फद्जद्श्जड्सफगस्द्फ़गस्द्फ्गफसफसग्स्द्फ़ग्स्द्फ़ग्दस्फ्गत्योबोलिलेमलाईमलाईबोलायोबोलायोमिठोमुस्कानमामलाईसह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जह्स्ध्फद्जसगग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द
【问题讨论】:
-
我很困惑为什么您要构建一个与 FMX 应用程序分开的 VCL 应用程序。我很好奇你为什么需要这样做?这只是为了测试吗?
-
@JerryDodge 实际上,我正在编写一个具有多种功能的 VCL 应用程序。新闻阅读器是其中之一,仅待实施。我试图搜索可以显示所有重要部分的自定义绘图。第一次尝试是stackoverflow.com/questions/33057500/…,但我无法得到正确的答案。我猜,为这个单一模块混合 firemonkey 不是一个好主意。
-
好吧,我的意思是,如果您首先在 Firemonkey 中编写此代码,我假设您这样做是为了实现多平台。好吧,Windows 是受支持的平台之一。为什么不只保留一个代码库?
-
我正在为使用 VCL 的 Windows 编写此应用程序。您看到的 firemonkey 屏幕截图实际上是一个测试应用程序。我在玩列表框样式,没有别的。
-
好吧,那是有道理的。我假设您正在构建同一事物的 FMX 和 VCL 版本。
标签: delphi winapi delphi-xe8 drawtext tlistbox