gpt4 book ai didi

delphi - TTreeView自定义绘制项宽度

转载 作者:行者123 更新时间:2023-12-03 15:32:20 24 4
gpt4 key购买 nike

我使用 OnCustomDrawItem 事件来绘制一个 TTreeView,如下所示:

image1

这是我的代码:

procedure Tform1.trvArbreCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
vRect : TRect;
vBmp : TBitmap;
vBmpRect : TRect;
vTreeView : TTreeView;
vBarreInfo : TScrollInfo;
vDeltaX : Integer;
begin
DefaultDraw := False;
vTreeView := TTreeView(Sender);

vRect := Node.DisplayRect(False);

vBmp := TBitmap.Create();

FillChar(vBarreInfo, SizeOF(vBarreInfo), 0);

vBarreInfo.cbSize := SizeOf(vBarreInfo);
vBarreInfo.fMask := SIF_RANGE or SIF_POS;

if GetScrollInfo(trvArbre.Handle, SB_HORZ, vBarreInfo) then
begin
if vBarreInfo.nMax > vRect.Right - vRect.Left then
begin
vBmp.Width := vBarreInfo.nMax + 1;
vBmp.Height := vRect.Bottom - vRect.Top;

vDeltaX := vBarreInfo.nPos;
end
else
begin
vBmp.Width := vRect.Right - vRect.Left;
vBmp.Height := vRect.Bottom - vRect.Top;

vDeltaX := 0;
end;
end
else
begin
vBmp.Width := vRect.Right - vRect.Left;
vBmp.Height := vRect.Bottom - vRect.Top;

vDeltaX := 0;
end;

vBmpRect := Rect(0, 0, vBmp.Width, vBmp.Height);

if cdsSelected in State then
begin
vBmp.Canvas.Brush.Color := cMenuDownFond;
vBmp.Canvas.Pen .Color := cMenuDownBordure;
end
else if cdsHot in State then
begin
vBmp.Canvas.Brush.Color := cMenuSurvolFond;
vBmp.Canvas.Pen .Color := cMenuSurvolBordure;
end
else
begin
vBmp.Canvas.Brush.Color := clWhite;
vBmp.Canvas.Pen .Color := clwhite;
end;

vBmp.Canvas.Rectangle(vBmpRect);

vBmpRect.Left := vBmpRect.Left + 3;

vBmpRect.Left := vBmpRect.Left + (Node.Level * vTreeView.Indent);

if Node.StateIndex >= 0 then
begin
vTreeView.StateImages.Draw(vBmp.Canvas, vBmpRect.Left, vBmpRect.Top, Node.StateIndex);
end;

vBmpRect.Left := vBmpRect.Left + 18;

vTreeView.Images.Draw(vBmp.Canvas, vBmpRect.Left, vBmpRect.Top, Node.ImageIndex);

vBmpRect.Left := vBmpRect.Left + 18 + 3;

vBmp.Canvas.Font := vTreeView.Font;

DrawText
(
vBmp.Canvas.Handle,
PChar(Node.Text),
Length(Node.Text),
vBmpRect,
DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOPREFIX or DT_END_ELLIPSIS
);

BitBlt
(
Sender.Canvas.Handle,
vRect.Left,
vRect.Top,
vRect.Right - vRect.Left,
vRect.Bottom - vRect.Top,
vBmp.Canvas.Handle,
vDeltaX,
0,
SRCCOPY
);

FreeAndNil(vBmp);
end;

我的问题是节点“我的最后一个节点不太长”并不太长,不足以证明水平滚动条的存在。

当我将 DefaultDraw 设置为 true 时,我得到:

image2

节点的宽度似乎是用我不使用的字体计算的。

我尝试更改 Canvas 的字体、使用 Windows API、使用 OnAdvancedCustomDrawItem,但没有结果。

谢谢。

最佳答案

我使用Delphi 7。我将ComCtrls.pas复制到我的应用程序的文件夹中。我更改了过程 TCustomTreeView.CNNotify(var Message: TWMNotify);。从 Result := Result or CDRF_SKIPDEFAULTResult := Result or CDRF_SKIPDEFAULT; 的第 8979 行,我注释了第 8980 行 else if FCanvasChanged then 以便模拟 DefaultDraw=TrueFCanvasChanged 即使我在事件中将 DefaultDraw 设置为 False 并且不更改字体。经过大量测试,我没有看到任何警告。

关于delphi - TTreeView自定义绘制项宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com