- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 OnCustomDrawItem 事件来绘制一个 TTreeView,如下所示:
这是我的代码:
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 时,我得到:
节点的宽度似乎是用我不使用的字体计算的。
我尝试更改 Canvas 的字体、使用 Windows API、使用 OnAdvancedCustomDrawItem,但没有结果。
谢谢。
最佳答案
我使用Delphi 7。我将ComCtrls.pas复制到我的应用程序的文件夹中。我更改了过程 TCustomTreeView.CNNotify(var Message: TWMNotify);
。从 Result := Result or CDRF_SKIPDEFAULT
到 Result := Result or CDRF_SKIPDEFAULT;
的第 8979 行,我注释了第 8980 行 else if FCanvasChanged then
以便模拟 DefaultDraw=True
和 FCanvasChanged
即使我在事件中将 DefaultDraw 设置为 False 并且不更改字体。经过大量测试,我没有看到任何警告。
关于delphi - TTreeView自定义绘制项宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387212/
我想将选定的节点及其所有后代从一个 TTreeView 复制到另一个 TTreeView。 实现这一目标的最佳、最有效的方法是什么? 最佳答案 最简单的方法是递归地执行此操作,如下所示: proced
使用 Borland C++ Builder 我有一个带有自行创建的 Breadcrumb 控件的应用程序,位于 TTreeView 控件之上,带有 TListView 控件(alClient 在 T
A.创建一个 Delphi VCL Forms 应用程序。 B.在窗体上放置一个 TTreeView,将其命名为 tvTest 并用项目填充它并设置 Treeview 的大小,以便滚动条在 TreeV
是否可以使用标准 TTreeView 来更改展开和折叠图像? 我指的不是节点图像,而是有子节点旁边的小箭头,如下所示: 理想情况下,我希望箭头显示为 + 和 - 符号,就像 Delphi 组件结构树一
我有一个 TreeView,其中包含项目、客户、运营商和区域等信息组。它们的子项是数据库中每个组的行。每当我双击一个项目时,它都会更改屏幕另一侧的表格,通过我刚刚在 TreeView 中选择的项目过滤
如果 Name 列太窄,Delphi IDE Locals 窗口会剪切局部变量的名称,如下所示: 我想在我的程序中做同样的事情。目前我正在使用 TMS THTMLTreeList,我得到的结果如下所示
我试图在 TreeView 中获取所选节点的所有子节点,但遇到了一些问题。 以这个 TreeView 为例: 我想将所有子节点变为黄色突出显示的“文件夹”节点,这将是旁边有一条蓝线的子节点。 这是我尝
如果我有一个 TTreeView,并且我调用如下内容: myTreeView.Select(nodeIWantSelected); 它被选中,但除非该节点恰好位于当前可见的树部分内,否则我看不到它,并
我使用的是 Delphi 10 Starter 版本。我正在研究如何使用Delphi的TTreeView组件。 一切正常,没有任何问题。我剩下的唯一问题是: 向节点添加对象后,删除该项目及其对象的正确
我有一个对话框,上面有一个 TTreeView 控件以及一个“确定”和“取消”按钮。这些按钮的 Default 和 Canel 属性分别设置为 true,并且 ModalResult 已正确设置。 用
我正在使用Zarko Gajic's Store More (Custom) Data Into The Tree Node Of A Tree View为每个节点项添加额外的字符串,但我发现如果我的
我发现了一个与 TTreeView 相关的错误。 获取一个包含 TTreeView 的表单,并将 HideSelection 设置为 True。 使 TreeView 多选并在 TreeView 中选
我有一个 TTreeView,它可以有很多节点,当展开很多节点时,树会使用大量屏幕空间。 现在假设我想将 TreeView 底部附近的节点拖到顶部,但我实际上看不到 TreeView 的顶部部分,因为
我正在为 TTreeView 实现拖放功能。在其 OnStartDrag 事件中,我正在创建派生类的 DragOcject: TTreeDragControlObject = class(TDra
当这样监听TTreeView事件的AdvancedCustomDraw事件时: if Stage = cdPrePaint then begin // modify some Sender.C
我有一个 TTreeView,它可以有很多节点,当展开很多节点时,树会使用大量屏幕空间。 现在假设我想将 TreeView 底部附近的节点拖到顶部,但我实际上看不到 TreeView 的顶部部分,因为
我想在我的安装程序中的页面中添加一个 TreeView 控件并搜索了 inno setup help对于 TTreeView 类,但只找到了 TFolderTreeView 和 TStartMenuF
我的表单上有一个 TTreeView,它有很多 TTreeViewItem 节点。 我想仅在用户展开其中一个TTreeViewItem节点时调用某些函数(这并不一定意味着用户“选择”了其中一个节点)
我有一个包含可编辑项目的 TreeView。当我在选择后按 F2 或单击任何项目时,就地编辑器出现。 如何在显示之前更改该编辑器中显示的文本?例如,我的树项的文本是 Point 1 (300, 4
使用 TreeNode.MoveTo(...) 方法有时无法正常工作并引发“访问冲突”异常。 大多数时候有效,有时无效。 大多数情况下,“COMCTL32.DLL 模块中存在访问冲突”。读取地址 FE
我是一名优秀的程序员,十分优秀!