【发布时间】:2011-09-22 18:23:32
【问题描述】:
我已经接受了,或者至少我认为我已经接受了我在previous question 中得到的建议。
总而言之,我将 TMS 中的 THTMLTreeList 替换为 TTreeList 并在其中创建了两列。我将第一列设置为 150 像素,并使用以下代码覆盖了 AdvancedCustomDrawItem 事件:
procedure TForm1.trXMLAdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
var hContext: HDC;
s: PChar;
iLength: Integer;
uRect: TRect;
begin
DefaultDraw := False;
hContext := trXML.Canvas.Handle;
s := PChar(Node.Text);
iLength := Length(Node.Text);
uRect := Node.DisplayRect(True);
DrawText(hContext, s, iLength, uRect, DT_END_ELLIPSIS);
end;
得到了我期望的结果,就是当我画树的时候,第一列的文字被剪掉了。当我更改第一列的大小时,文本会被适当地剪裁。但是当 TreeList 不够宽并且底部有一个滚动条并且我向右滚动时,文本现在延伸到第二列的量与移动滚动条的量相同。这就像文本是相对于 TreeList 的客户区域而不是部分隐藏的第一列绘制的,因此它总是将 150 像素扩展到 TreeList。
在我看来,我对设备上下文句柄或 TRect 使用了错误的东西,但我很少进行图形类型编程,所以我不知道要更改什么。任何帮助,将不胜感激。
【问题讨论】:
-
你不应该使用发件人的句柄吗?
-
我的意思是 Sender.Handle 而不是 Sender.Canvas.Handle。
-
我不知道。那可能是对的。好的。我尝试过这个。我得到了同样的结果。如果您将 TTreeList 放在表单上并使用上面的代码覆盖其 AdvancedCustomDrawItem 事件,您将明白我的意思。这对我来说有点像黑匣子,所以我会尝试任何方法,但这并没有解决问题。
-
@Jerry:
Sender.Handle是HWND,但DrawText()需要HDC。Sender.Canvas.Handle会更合适。在这种情况下,Sender和trXML是同一个对象。 -
@jrodenhi:你所描述的听起来像
TRect包含滚动树时的错误坐标。
标签: delphi