我接受了这个建议,或者至少我认为我已经接受了previous question 总而言之,我用TreeList替换了TMS中的THTMLTreeList,并在其中创建了两列。我将第一列设置为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使用了错误的东西,但是我做了很少的图形类型编程,所以我不知道要改变什么。任何帮助,将不胜感激。
答案 0 :(得分:2)
我刚检查了TMS的源代码和
TTreeList
已使用DT_END_ELLIPSIS
标记
并在DefaultDraw
参数设置为True
时对绘制文本进行每列剪裁,因此您无需手动绘制文本。