Пытаюсь реализовать соственную отрисовку  . Сейчас у меня есть два варанта. Первый, работает, и почти правельно, но, при наличии нескольких колонок в VST, фокусы в различнвх стольбцах отрисовываються по-разному. Пожалуйста, помогите это исправить. Вот мой код: | Код |
procedure TForm1.VSTAfterCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect); var S: string; len,eps:integer; NA: TNodeArray; I: Integer; begin len:=StrToInt(Panel1.Caption); Inc(len); Panel1.Caption:=IntToStr(len); S :=IntToStr(CellRect.BottomRight.X); len:=Column; CellRect.Left := 22 + len*VST.Header.Columns[len].Width; // Отдаление от начала CellRect.Right := CellRect.Left + TargetCanvas.TextWidth(S) + 8; TargetCanvas.FillRect(CellRect); if vsSelected in Node.States then TargetCanvas.Brush.Color := VST.Colors.UnfocusedSelectionColor //VST.Colors.FocusedSelectionColor else TargetCanvas.Brush.Color := VST.Color; Inc(CellRect.Top, 22); TargetCanvas.TextRect(CellRect, CellRect.Left + 4, CellRect.Top + 2, S);
eps:=(CellRect.Left mod 2)+((CellRect.Right-CellRect.Left) mod 2); if eps>1 then eps:=1;
len:=CellRect.Left +((CellRect.Right-CellRect.Left) div 2) -(ImageList1.Width div 2) +eps;
if vsSelected in Node.States then ImageList1.Draw(TargetCanvas, len, CellRect.Top - 18, 0, dsSelected, itImage) else ImageList1.Draw(TargetCanvas, len, CellRect.Top - 18, 0); if vsSelected in Node.States then Windows.DrawFocusRect(TargetCanvas.Handle, CellRect); end;
procedure TForm1.FormCreate(Sender: TObject); begin VST.DefaultNodeHeight:=40; VST.RootNodeCount:=10; end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); begin //CellText:='w-|-w'; end;
procedure TForm1.VSTClick(Sender: TObject); var P:TPoint; begin GetCursorPos(P); P:=VST.ScreenToClient(P); VST.Selected[VST.GetNodeAt(P.X,P.Y)]:=true; end;
procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Caption:='0'; end;
|
Второе, что я пытался сделать, это использовать VirtualDrawTree вместо VirtualStringTree. Но я не смог понять даже азов работы с VirtualDrawTree  . Пытался разобрать пример из Demos, но у меня ничего не работает... Расскажите, как правильно работать с этим типом дерева. Вот что делеа я: | Код |
type PShellObjectData = ^TShellObjectData; TShellObjectData = record Name: WideString; Image: TBitMap; end;
//********************************************
procedure TForm1.VDT1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Data: PShellObjectData; begin Data := Sender.GetNodeData(Node); Data.Image.Free; Finalize(Data^); end;
procedure TForm1.VDT1GetNodeWidth(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; var NodeWidth: Integer); var Data: PShellObjectData; AMargin: Integer; begin with Sender as TVirtualDrawTree do AMargin := TextMargin; begin Data := Sender.GetNodeData(Node); if Assigned(Data.Image) then NodeWidth := Max(Canvas.TextWidth(Data.Name)+2*AMargin ,Data.Image.Width); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin VDT1.NodeDataSize:= SizeOf(TShellObjectData); end;
procedure TForm1.Button1Click(Sender: TObject); var RootNode:PVirtualNode; Data:PShellObjectData; i:integer; begin RootNode:=VDT1.AddChild(VDT1.RootNode); if not (vsInitialized in RootNode.States) then VDT1.ReinitNode(RootNode,false); Data:=VDT1.GetNodeData(RootNode); Data.Name:='dfdf'; // Рисунок уже загружен в Image1 Data.Image := TBitmap.Create; Data.Image:=Image1.Picture.Bitmap; end;
procedure TForm1.VDT1DrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo); var Data: PShellObjectData; X: Integer; S: WideString; R: TRect; begin with Sender as TVirtualDrawTree, PaintInfo do begin Data := Sender.GetNodeData(Node); Canvas.Font.Color := clHighlightText; SetBKMode(Canvas.Handle, TRANSPARENT); R := PaintInfo.ContentRect; InflateRect(R, -TextMargin, 0); Dec(R.Right); Dec(R.Bottom); S := Data.Name; if Length(S) > 0 then begin with R do begin if (NodeWidth - 2 * Margin) > (Right - Left) then S := ShortenString(Canvas.Handle, S, Right - Left, False); Left:=Left+20; //Right:=Right+20; //Bottom:=Bottom+20; end; DrawTextW(Canvas.Handle,PWideChar(S), Length(S), R , DT_BOTTOM or DT_LEFT or DT_VCENTER or DT_SINGLELINE, False); end; if Assigned(Data.Image) then begin X := ContentRect.Left; BitBlt(Canvas.Handle, X, ContentRect.Top + 2, Data.Image.Width, Data.Image.Height, Data.Image.Canvas.Handle, 0, 0, SRCCOPY); end; end; end;
|
P.S. Спасибо за помощь! Это сообщение отредактировал(а) Red Wind - 12.10.2005, 15:26
|