Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ViewStyle в VirtualStringTree 
:(
    Опции темы
Red Wind
Дата 9.10.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Я использую TVirtualStringTree как таблицу, т.е. с несколькими колонками и отрисованной сеткой. У меня возникла проблема поддержки ViewStyle=vsIcon. В общем, сам принцип я представляю, но как узнать все необходимые отступы и размеры, что бы моя реализация максимально походила на стандартную? Благодарю за помощь!
PM MAIL ICQ   Вверх
Quadr0
Дата 9.10.2005, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 01:36
  Вверх
Red Wind
Дата 9.10.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Где находиться этот форум?
PM MAIL ICQ   Вверх
AriX
Дата 9.10.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 16.6.2003

Репутация: 5
Всего: 19



Red Wind
http://soft-gems.net/support/forums/

А вообще, не совсем понял, что ты хочешь сделать?
Если не понятно, как рисовать иконки - посмотри help, там про написано (используй OnGetImageIndex).
PM MAIL   Вверх
Red Wind
Дата 11.10.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Пытаюсь реализовать соственную отрисовку smile . Сейчас у меня есть два варанта. Первый, работает, и почти правельно, но, при наличии нескольких колонок в 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 smile . Пытался разобрать пример из 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. Спасибо за помощь! smile

Это сообщение отредактировал(а) Red Wind - 12.10.2005, 15:26
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.