- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用以下格式在列表框中显示来自 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 文本绘制太慢,并且在滚动列表框或调整表单大小时闪烁太多。
注意
更新:问题似乎出在 DrawText 方法的 DT_WORDBREAK 标志中。每当我删除此标志时,尽管闪烁是可见的,但绘制文本的效果却有显着改善。
Unicoide 文本示例
तिम्रोत्योबोलिलेमलाईबोलायोमिठोतिम्रोत्योमु स्कान मा मलाई झुलायो झुलाओ ह्स्द्जिः स ह्स्ध्फद्ज द्श्जड् स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द तत म्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्का न मा मलाई स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग
最佳答案
如果您真的真的想使用标准列表框来显示 RSS 提要,我建议您使用双缓冲。这意味着您可以在内存中的位图上绘制内容,然后将其绘制到 ListView 中。我从您的源代码中制作了一个小演示,向您展示如何操作。我并没有解决所有问题,但我相信这是使用标准 VCL 组件可以获得的最佳效果。
unit Unit12;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ImgList;
type
TForm12 = class(TForm)
ListBox1: TListBox;
ImageList1: TImageList;
procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
MemBitmap: TBitmap;
OldListBoxWP: TWndMethod;
procedure NewListBoxWP(var Message: TMessage);
public
{ Public declarations }
end;
var
Form12: TForm12;
implementation
{$R *.dfm}
const
NewsStr = 'तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई झुलायो झुल' +
'ाओ ह्स्द्जिः स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द';
procedure TForm12.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ListBox1.WindowProc := OldListBoxWP;
MemBitmap.Free;
end;
procedure TForm12.FormCreate(Sender: TObject);
var
i: Integer;
begin
OldListBoxWP := ListBox1.WindowProc;
ListBox1.WindowProc := NewListBoxWP;
MemBitmap := TBitmap.Create;
MemBitmap.SetSize(Width, Height);
ListBox1.Items.BeginUpdate;
for i := 0 to 10 do
ListBox1.Items.Add(NewsStr);
ListBox1.Items.EndUpdate;
end;
procedure TForm12.FormResize(Sender: TObject);
begin
MemBitmap.SetSize(Width, Height);
end;
procedure TForm12.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
R: TRect;
begin
MemBitmap.Canvas.Font.Color := clBlack;
MemBitmap.Canvas.Font.Style := [fsBold];
MemBitmap.Canvas.Font.Size := 9;
if Odd(Index) then
MemBitmap.Canvas.Brush.Color := clWhite
else
MemBitmap.Canvas.Brush.Color := clBtnFace;
MemBitmap.Canvas.FillRect(Rect);
MemBitmap.Canvas.Pen.Color := clHighlight;
if (odSelected in State) then
begin
MemBitmap.Canvas.Font.Color := clHighlightText;
MemBitmap.Canvas.Brush.Color := clHighlight;
MemBitmap.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
if (odFocused in State) then
DrawFocusRect(MemBitmap.Canvas.Handle, Rect);
end;
ImageList1.Draw(MemBitmap.Canvas, Rect.Left + 2, Rect.Top + (ListBox1.ItemHeight - ImageList1.Height) div 2, Index, true);
MemBitmap.Canvas.TextOut(Rect.Left + 70, Rect.Top + 4, 'कान्तिपुर समाचारआजकोपत्रिकामाकेहिछैन');
MemBitmap.Canvas.Font.Style := MemBitmap.Canvas.Font.Style - [fsBold];
R := Rect;
R.Left := R.Left + 70;
R.Top := R.Top + 32;
R.Height := 30;
DrawText(MemBitmap.Canvas.Handle, PChar(NewsStr), Length(NewsStr), R, DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
MemBitmap.Canvas.TextOut(Rect.Right - 80, Rect.Top + 4, '5 mins ago');
BitBlt(ListBox1.Canvas.Handle, Rect.Left - 1, Rect.Top - 1, Rect.Right - Rect.Left + 2, Rect.Bottom - Rect.Top + 2, MemBitmap.Canvas.Handle, Rect.Left - 1, Rect.Top - 1, SRCCOPY);
end;
procedure TForm12.NewListBoxWP(var Message: TMessage);
begin
if Message.Msg = WM_ERASEBKGND then
Message.Result := 0
else
OldListBoxWP(Message);
end;
end.
关于delphi - 在列表框 Canvas 上绘制 unicode 文本太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149592/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!