我使用OwnerDraw
绘制列表视图项,但我有错误:请调整列的大小 - >你将有一个水平条,滚动它 - >项目在可见区域绘制:(
请帮我编辑下面的代码。感谢您的关注和帮助!!!
我检查,Rect.Right和Rect.Left在滚动时增加/减少。例如。我们向右滚动50 px,Rect.Right将是Rect.Right + 50, Rect.Left将是-50 (0-50)
普通视图:
错误:
procedure TDownloadFrame.DownloadListDrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
i: integer;
x1, x2: integer;
R: TRect;
s: string;
const
DT_ALIGN: array [TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
if odSelected in State then
begin
Sender.Canvas.Font.Color := clWhite;
Sender.Canvas.Brush.Color := $00FF8000;
end
else
begin
Sender.Canvas.Font.Color := clBlack;
Sender.Canvas.Brush.Color := clWhite;
end;
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.FillRect(Rect);
x1 := 0;
x2 := 0;
R := Rect;
Sender.Canvas.Brush.Style := bsClear;
MainForm.Icons_16x16.Draw(DownloadList.Canvas, 3, R.Top + (R.Bottom - R.Top - 16) div 2, 1, true);
for i := 0 to DownloadList.Columns.Count - 1 do
begin
Inc(x2, ListView_GetColumnWidth(DownloadList.Handle,
DownloadList.Columns[i].Index));
R.Left := x1;
R.Right := x2;
if i = 0 then
begin
s := Item.Caption;
R.Left := 16 + 6;
end
else
s := Item.SubItems[i - 1];
if i <> 3 then
DrawText(Sender.Canvas.Handle, s, length(s), R, DT_SINGLELINE or
DT_ALIGN[DownloadList.Columns[i].Alignment] or DT_VCENTER or
DT_END_ELLIPSIS);
x1 := x2;
end;
end;
答案 0 :(得分:1)
我最近遇到了VCL中的一个错误,如果我在带有图像列表的ListItem上绘制,那么listview的画布将不再支持Sender.Canvas.Font
的任何字体颜色,字体大小或字体面更改:< / p>
Sender.Canvas.Font.Color := clHighlightText;
Sender.Canvas.Font.Size := 14;
Sender.Canvas.Font.Name := 'Consolas';
......一切都行不通。如果我首先使用:
绘制画布,这只会停止工作imageList.Draw(Sender.Canvas, ....);
如果我删除了imageList.Draw
,一切都很好。
我被迫直接使用GDI设置字体和颜色:
savedDC := SaveDC(Sender.Canvas.Handle);
try
SetTextColor(Sender.Canvas.Handle, clHighlightText); //don't use clWhite, use the correct color
newfont := TFont.Create;
try
newFont.Assign(Sender.Canvas.Font);
newFont.Name := 'Consolas';
newfont.Size := 14;
SelectObject(Sender.Canvas.Handle, newFont.Handle);
szText = 'Hello, world!';
TextOut(Sender.Canvas.Handle, 0, 0, PChar(szText), Length(szText));
finally
newFont.Free;
end;
finally
RestoreDC(Sender.Canvas.Handle, savedDC);
end;
注意:任何代码都会发布到公共域中。无需归属。
答案 1 :(得分:1)
变化:
x1 := 0;
x2 := 0;
到
x1 := Rect.Left;
x2 := Rect.Left;
MainForm.Icons_16x16.Draw(DownloadList.Canvas, 3, R.Top + (R.Bottom - R.Top - 16) div 2, 1, true);
到
MainForm.Icons_16x16.Draw(DownloadList.Canvas, R.Left+3, R.Top + (R.Bottom - R.Top - 16) div 2, ImgIndex, true);
if i = 0 then
begin
s := Item.Caption;
R.Left := 16 + 6;
end
到
if i = 0 then
begin
s := Item.Caption;
R.Left := R.Left + 16 + 6;
end