2011-08-10 3 views
2

VirtualStringTree의 노드가 multiline (Node.States의 vsMultiline) 인 경우 해당 노드의 모든 열 (다중 행 제외)에 대해 텍스트를 세로 가운데에 배치하려면 어떻게해야합니까?VirtualStringTree - 수직으로 여러 줄로 된 노드 및 중심선

나는 (TargetCanvas.TextOut()을 사용하여) OnBeforeCellPaint을 사용해 보았지만, 텍스트를 전혀 그려 내지 않습니다. 기본적으로 다중 선 노드의 텍스트는 항상 노드의 맨 위에 그려집니다.

(다중 행이 아닌 노드의 경우 텍스트는 세로로 가운데에 칠해집니다.)

답변

1

덕분에, 나는 거의 모든 가능한 조합 커버이 솔루션을 마련 할 수 있었다 :

procedure TForm1.TreeDrawText(
    Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; 
    Column: TColumnIndex; const Text: WideString; const CellRect: TRect; 
    var DefaultDraw: Boolean); 
var DrawFormat : Cardinal; 
R : TRect; 
s : WideString; 
NodeWidth,EllipsisWidth : Integer; 
Size: TSize; 
begin 
    if not (Column in [yourmultilinecolumns]) then 
    begin 
      DefaultDraw := False; 
      R := CellRect; 
      GetTextExtentPoint32W(TargetCanvas.Handle, PWideChar(Text), Length(Text), Size); 
      NodeWidth := Size.cx + 2 * Tree.TextMargin; 
      GetTextExtentPoint32W(TargetCanvas.Handle, '...', 3, Size); 
      EllipsisWidth := Size.cx; 
      if ((NodeWidth - 2 * Tree.TextMargin) > R.Right - R.Left) then 
       s := EllipseString(TargetCanvas.Handle, Text, R.Right - R.Left, EllipsisWidth) 
      else s := Text; 
      DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE; 
      Windows.DrawTextW(TargetCanvas.Handle, PWideChar(s), Length(s), R, DrawFormat); 
    end; 
end; 

EllipseString() 메소드는 VirtualTrees.pas에서 VirtualTrees.ShortenString()와 매우 유사하다 .

유일하게 다른 열에 여러 줄 문자를 그릴 수 없습니다. 다중 행 집합을 지정해야하므로 여러 행을 세로로 가운데에 그리는 기능이 없습니다.

+1

그게 훌륭한 해결책입니다! – XBasic3000

3

는 사각형의 Cellrect를 사용

등 중간 당신은 왼쪽, 오른쪽, 위쪽으로의 텍스트 정렬을 추가 할 수 있습니다

DrawText에 (..)를 사용하여보십시오.

당신의 경우에 나는 OnDrawtext에서 작동한다고 생각합니다. DefaultText : = False; XBasic3000에

+0

+1 감사합니다. 솔루션을 찾을 수 있도록 도왔습니다. (거의) – Simon

관련 문제