我正在尝试在Delphi TListView
中自定义绘制进度条,正如NGLN在另一个SO问题的答案建议的那样。这个方法很好,但是在使用Vista引入的新资源管理器主题来绘制时与热跟踪交互存在问题。
热跟踪绘画和Delphi自定义绘制事件似乎会互相干扰。例如,我看到的输出结果如下:
列1中的文本应该显示为"Item 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: Boolean);
var
R: TRect;
begin
DefaultDraw := False;
ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @R);
Sender.Canvas.MoveTo(R.Left, R.Top);
Sender.Canvas.LineTo(R.Right-1, R.Bottom-1);
end;
end.
表单文件
object Form1: TForm1
Caption = 'Custom Draw List View Bug'
ClientHeight = 290
ClientWidth = 554
OnCreate = FormCreate
object ListView: TListView
Align = alClient
Columns = <
item
Caption = 'Column 1'
Width = 250
end
item
Caption = 'Column 2'
Width = 250
end>
ViewStyle = vsReport
OnCustomDrawSubItem = ListViewCustomDrawSubItem
end
end
SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
放到TForm1.ListViewCustomDrawSubItem
中有帮助吗? - Sertac Akyuz