2011-09-22 28 views
0

我接受了我的建議,或者至少我認爲我擁有我的previous question。總之,我用TreeList替換了TMS中的THTMLTreeList,並在其中創建了兩列。我的第一列設置爲150個像素和我推翻這個代碼AdvancedCustomDrawItem事件:如何在TTreeview中剪輯文本(續)

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使用了錯誤的東西,但我做了很少的圖形類型編程,所以我不知道要更改什麼。任何幫助,將不勝感激。

+1

您不應該使用發件人的句柄嗎? –

+0

我的意思是Sender.Handle而不是Sender.Canvas.Handle。 –

+0

我不知道。這可能是對的。好。我嘗試過這個。我得到了同樣的結果。如果您在表單上放置TTreeList並使用上面的代碼覆蓋它的AdvancedCustomDrawItem事件,您將明白我的意思。對我來說這是一個黑匣子,所以我會嘗試任何事情,但這並沒有解決它。 – jrodenhi

回答

2

我只是檢查TMS的源代碼和 TTreeList已經使用了DT_END_ELLIPSIS標誌 並執行每列剪裁繪製文本時DefaultDraw參數設置爲True,這樣你就不需要自己手動繪製的文本。

+0

+1優秀的毅力 –

+0

+1我同意卓越的毅力。我知道這些東西沒有無限的供應,我很抱歉已經使用了這麼多東西。 – jrodenhi