我正在尝试TListView根据NGLN对另一个SO问题的答案在Delphi中自定义绘制进度条.除了使用Vista中引入的新资源管理器主题绘制时与热跟踪的交互之外,此工作正常.
热跟踪绘画和Delphi自定义绘图事件似乎互相干扰.例如,我看到的那种输出看起来像这样:

第1列中的文字应为第3项,但已删除.它看起来像列表视图控件的Delphi包装中的一个错误,但同样可能是我做错了!
虽然我一直在XE2中开发这个,但是在2010年也发生了同样的行为,大概是XE.
这是重现此行为的代码:
Pascal文件
unit Unit1;
interface
uses
Windows, Classes, Controls, Forms, CommCtrl, ComCtrls;
type
TForm1 = class(TForm)
ListView: TListView;
procedure FormCreate(Sender: TObject);
procedure ListViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ListView.RowSelect := True;
ListView.Items.Add.Caption := 'Item 1';
ListView.Items.Add.Caption := 'Item 2';
ListView.Items.Add.Caption := 'Item 3';
end;
procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: …Run Code Online (Sandbox Code Playgroud) 我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.
TMyProgressBar = class(TCustomControl)
Run Code Online (Sandbox Code Playgroud)
我继承了控件TCustomControl,因为我需要Handle和一些TWinControl事件.控件(最多64个项目)是动态创建的,并放在ScrollBox上.当进度更新时,我先打电话InvalidateRect.
所有的绘画工作(一组矩形,DrawText等等 - 从这里启发)都在存储器DC中执行,然后BitBlt在控制器的DC上执行.它无论如何都在闪烁,似乎组件消失并重新出现.恕我直言,它是由背景擦除引起的.
在这个无闪烁的绘图建议中,它是WM_ERASEBKGND按以下方式编写的:
type
TMyProgressBar = class(TCustomControl)
procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;
procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)
但是在另一个组件中,通过TMS(TAdvProgressBar),Result设置0为相同的消息.
现在Windows文档说明:
如果应用程序删除背景,则应返回非零值; 否则,它应该返回零.
我测试了两种变体(结果= 0,1),令我惊讶的是都避免了闪烁.
那么现在,我需要在Delphi代码中加入什么?什么是正确的方法?
使用Delphi 2010和TStringGrid组件,我目前显示数据库查询中的五个fild.
这是我正在做的一个简单的例子
//设置网格
procedure TGriddata.FormCreate(Sender: TObject);
begin
grdMain.Rows[0].commatext:='"One","Two","Three","Four","Five"';
grdMain.ColWidths[0]:= 50;
grdMain.ColWidths[1]:= 175;
grdMain.ColWidths[2]:= 175;
grdMain.ColWidths[3]:= 100;
grdMain.ColWidths[4]:= 300;
end;
Run Code Online (Sandbox Code Playgroud)
//显示网格中的数据//注意,我没有显示查询的创建,执行或销毁
procedure TGriddata.load;
begin
...
grdMain.Cells[0,row]:= FieldByName('one').AsString;
grdMain.Cells[1,row]:= FieldByName('two').AsString;
grdMain.Cells[2,row]:= FieldByName('three').AsString;
grdMain.Cells[3,row]:= FieldByName('four').AsString;
//draw progress bar here
...
end;
Run Code Online (Sandbox Code Playgroud)
其中一列("五")需要在col中显示海军蓝色水平条.它还应该显示一些以栏为中心的文本.我没有使用自定义绘图的经验.我设置的哪些属性只能自定义绘制一列并使用其他列的默认绘图?
delphi ×3
custom-draw ×1
delphi-2010 ×1
delphi-7 ×1
delphi-xe2 ×1
flicker ×1
gdi ×1
stringgrid ×1
winapi ×1