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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView - прорисовка заднего фона, наисовать фон - картинку 
:(
    Опции темы
Lence
Дата 20.2.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



У меня есть TreeView и картинка -
поделитесь примером как на фоне treeView  нарисовать картинку...  поиск чтото не помог, а с Virtual TreeView связываться не хочется ...  
Спасибо!
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Beltar
Дата 20.2.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 7



Я как-то рисовал так:

Код

procedure TForm1.TV1AdvancedCustomDraw(Sender: TCustomTreeView;
  const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin
if VisNode=nil then exit;
if Stage<>cdPostPaint then exit;
DrawVisNode;
end;

procedure TForm1.DrawVisNode;
var Rect:TRect;
begin
if VisNode=nil then exit;
if VisNode.IsVisible then
  begin
  Rect:=VisNode.DisplayRect(true);
  ilTVImages.Draw(TV1.Canvas,Rect.Left-19,Rect.Top,3,true);
  end;
end;

procedure TForm1.TV1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);

begin
{Без этой, даже пустой процедуры отрисовка видимого
 узла не работает }
end;


Рисует поверх картики узла VisNode еще одну. У меня это была просто галочка.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Lence
Дата 21.2.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Я совсем ничего не понял из примера  smile  что к чему ?  smile  как мне лежащую в папке картинку засунуть в фон Treeview ? 

--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Yanis
Дата 21.2.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Сделай на основе примера, который идёт вместе с Delphi.
$(BDS)\Demos\DelphiWin32\VCLWin32\CustomDraw
или
$(Delphi)\Demos\CustomDraw

Это сообщение отредактировал(а) Yanis - 21.2.2007, 09:13


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Beltar
Дата 21.2.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 7



2 Lence:

А к тому все это, что ключевое слово тут Stage и его значение.

Код

if Stage<>cdPostPaint then exit;//Рисует поверх дефолтной отрисовки


А вот так:

Код

procedure TForm1.TVAdvancedCustomDraw(Sender: TCustomTreeView;
  const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var R:TRect;
begin
if Stage<>cdPrePaint then exit;
TV.Canvas.Brush.Color:=clBlue;
TV.Canvas.Pen.Color:=clRed;
R.Left:=0;
R.Top:=0;
R.Right:=TV.Width;
R.Bottom:=TV.Height;
TV.Canvas.FillRect(R);
TV.Canvas.LineTo(100,100);
end;


До дефолтной. Однако есть одно большое НО. Надо найти способ не прорисовывать фон узлов, в примере который приводит Yanis такая лажа тоже присутствует.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Yanis
Дата 21.2.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Цитата(Beltar @  21.2.2007,  11:48 Найти цитируемый пост)
в примере который приводит Yanis такая лажа тоже присутствует. 

В примерах, которые привожу я, я стараюсь не допускать "лаж". Глюки имеются в демо от Borland. smile

Добавлено @ 11:03 
И что вообще за глюк-то? Вроде всё нормально рисуется. В том числе и фон у Item-ов. Просто нуна им CustomDraw отрубить smile 

Это сообщение отредактировал(а) Yanis - 21.2.2007, 11:03


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Lence
Дата 21.2.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Код

procedure TForm1.TreeView1CustomDraw(Sender: TCustomTreeView;
  const ARect: TRect; var DefaultDraw: Boolean);
begin
  TreeView1.Canvas.StretchDraw(ARect, Image1.Picture.Bitmap);

end;


фон узлов не прорисовывается из примера Yanis'a ...  дорисовать как ?

и здесь только заливается цветом... без фона узлов... 
Код

procedure TForm1.TreeView1AdvancedCustomDraw(Sender: TCustomTreeView;
  const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);

 var R:TRect;
begin
if Stage<>cdPrePaint then exit;
TreeView1.Canvas.Brush.Color:=clBlue;
TreeView1.Canvas.Pen.Color:=clRed;
R.Left:=0;
R.Top:=0;
R.Right:=TreeView1.Width;
R.Bottom:=TreeView1.Height;
TreeView1.Canvas.FillRect(R);
TreeView1.Canvas.LineTo(100,100);
end;


 smile  криво зарисовывает
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Yanis
Дата 21.2.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Цитата(Lence @  21.2.2007,  12:42 Найти цитируемый пост)
фон узлов не прорисовывается из примера Yanis'a ...  дорисовать как ?

Всё там есть smile Смотри внимательней пример "Custom Drawind -> Default Drawing -> OnCustomDrawItem" smile

Это сообщение отредактировал(а) Yanis - 21.2.2007, 11:47


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Lence
Дата 21.2.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Yanis, спасибо! Буду ковырять ...   Надо просто не использовать  OnCustomDrawItem
Beltar спасибо!


Сделаю выложу... 

Это сообщение отредактировал(а) Lence - 21.2.2007, 12:35
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Lence
Дата 21.2.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Mне нужен вариант ....  smile 

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  pic2.jpg 61,21 Kb
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Beltar
Дата 21.2.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 7



Цитата

Смотри внимательней пример "Custom Drawind -> Default Drawing -> OnCustomDrawItem"


Прикол в том, что отключив DefaultDraw получаем просто залитый каким-то там фоном контрол, надо самому делать отрисовку узлов. Потому они в примере и нестандартные при выключенном DefaultDraw. Так что подбная методика не стольо для украшения, сколько для радикальной переделки.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Lence
Дата 21.2.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Всем большое спасибо !!!  
Beltar, спасибо !
Yanis, спасибо за пример ! 
Я его поковырял - чутку исправил и вот то что мне нужно было.... еще немного танцев с бубном вокруг кода и все будет супер !  smile 


Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    TV: TTreeView;
    ImageList: TImageList;
    Image1: TImage;
    procedure TVCollapsed(Sender: TObject; Node: TTreeNode);
    procedure TVCustomDraw(Sender: TCustomTreeView; const ARect: TRect;
      var DefaultDraw: Boolean);
    procedure TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
      State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure TVExpanded(Sender: TObject; Node: TTreeNode);
    procedure TVGetImageIndex(Sender: TObject; Node: TTreeNode);
    procedure TVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
    procedure FormCreate(Sender: TObject);
  private
    FButtonSize: Integer;
    FDefaultDraw,
    FDefaultDrawItem: Boolean;
    FBackgroundColor: TColor;
    FBrushStyle: TBrushStyle;
    procedure DrawButton(ARect: TRect; Node: TTreeNode);
    procedure DrawImage(NodeRect: TRect; ImageIndex: Integer);
    procedure SetCustomDraw(Value: Boolean);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure Tform1.SetCustomDraw(Value: Boolean);
begin
  if not Value then
  begin
    TV.OnCustomDraw := nil;
    TV.OnCustomDrawItem := nil;
  end else
  begin
    TV.OnCustomDraw := Self.TVCustomDraw;
    TV.OnCustomDrawItem := Self.TVCustomDrawItem;
  end;

  TV.Repaint;
end;

procedure Tform1.DrawButton(ARect: TRect; Node: TTreeNode);
var
  cx, cy: Integer;
begin
  cx := ARect.Left + TV.Indent div 2;
  cy := ARect.Top + (ARect.Bottom - ARect.Top) div 2;
  with TV.Canvas do
  begin
     if Node.HasChildren then
    begin
      PenPos := Point(cx+FButtonSize, cy);
      LineTo(ARect.Left + TV.Indent + FButtonSize, cy);
    end else
    begin
      PenPos := Point(cx, cy);
      LineTo(ARect.Left + TV.Indent + FButtonSize, cy);
    end;

    //draw half vertical line, top portion.
    PenPos := Point(cx, cy);
    LineTo(cx, ARect.Top-1);

    if ((Node.GetNextVisible <> nil) and (Node.GetNextVisible.Level = Node.Level))
    or (Node.GetNextSibling <> nil) then
    //draw bottom portion of half vertical line.
    begin
      PenPos := Point(cx, cy);
      LineTo(cx, ARect.Bottom+1);
    end;  

    if Node.HasChildren then
    begin
      //Let's try a circular button instead
      Ellipse(cx-FButtonSize, cy-FButtonSize, cx+FButtonSize, cy+FButtonSize);

      //draw the horizontal indicator.
      PenPos := Point(cx-FButtonSize+2, cy);
      LineTo(cx+FButtonSize-2, cy);
      //draw the vertical indicator if the node is collapsed
      if not Node.Expanded then
      begin
        PenPos := Point(cx, cy-FButtonSize+2);
        LineTo(cx, cy+FButtonSize-2);
      end;
    end;
        //now connect vertical lines of higher level nodes.
    Node := Node.Parent;
    while Node <> nil do
    begin
      cx := cx - TV.Indent;
      if Node.GetNextSibling <> nil then
      begin
        PenPos := Point(cx, ARect.Top);
        LineTo(cx, ARect.Bottom);
      end;
      Node := Node.Parent;
    end;
  end;
end;

procedure Tform1.DrawImage(NodeRect: TRect; ImageIndex: Integer);
var
  cy: Integer;
begin
  cy := NodeRect.Top + (NodeRect.Bottom - NodeRect.Top) div 2;
  //center image in NodeRect.
  ImageList.Draw(TV.Canvas, NodeRect.Left, cy - TV.Images.Height div 2,
                 ImageIndex, True);
end;


procedure TForm1.TVCollapsed(Sender: TObject; Node: TTreeNode);
begin
TV.Repaint;
end;

procedure TForm1.TVCustomDraw(Sender: TCustomTreeView; const ARect: TRect;
  var DefaultDraw: Boolean);
begin
//This event should be used to draw any background colors or images.
//ARect represents the entire client area of the TreeView.
//Use the TreeView's canvas to do the drawing.
//Note that drawing a background bitmap is not really supported by CustomDraw,
//so scrolling can get messy. Best to subclass the TreeView and handle scrolling
//messages.
  with TV.Canvas do
  begin
      StretchDraw(ARect, Image1.Picture.Bitmap);
    end;
     
  DefaultDraw := FDefaultDraw;
end;

procedure TForm1.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
  State: TCustomDrawState; var DefaultDraw: Boolean);
  var
  NodeRect: TRect;
begin

 with TV.Canvas do
  begin
    //If DefaultDraw it is true, any of the node's font properties can be
    //changed. Note also that when DefaultDraw = True, Windows draws the
    //buttons and ignores our font background colors, using instead the
    //TreeView's Color property.
    if cdsSelected in State then
    begin
    //  Font.Assign(SelectedFontDialog.Font);
    //  Brush.Color := SelBkgColorDialog.Color;
    end;

    DefaultDraw := FDefaultDrawItem;
    //DefaultDraw = False means you have to handle all the item drawing yourself,
    //including the buttons, lines, images, and text.
    if not DefaultDraw then
    begin
      //draw the selection rect.
      if cdsSelected in State then
      begin
        NodeRect := Node.DisplayRect(True);
        FillRect(NodeRect);
      end;
      NodeRect := Node.DisplayRect(False);
      Brush.Style := bsClear;

      NodeRect.Left := NodeRect.Left + (Node.Level * TV.Indent);
      //NodeRect.Left now represents the left-most portion of the expand button
      DrawButton(NodeRect, Node);

      NodeRect.Left := NodeRect.Left + TV.Indent + FButtonSize;
      //NodeRect.Left is now the leftmost portion of the image.
      DrawImage(NodeRect, Node.ImageIndex);

      NodeRect.Left := NodeRect.Left + ImageList.Width;
      //Now we are finally in a position to draw the text.

      TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
    end;
  end;
end;

procedure TForm1.TVExpanded(Sender: TObject; Node: TTreeNode);
begin
  TV.Repaint;
end;

procedure TForm1.TVGetImageIndex(Sender: TObject; Node: TTreeNode);
begin
  if Node.HasChildren then
    if Node.Expanded then
      Node.ImageIndex := 3
    else
      Node.ImageIndex := 0
  else
    Node.ImageIndex := 1;
end;

procedure TForm1.TVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
begin
  Node.SelectedIndex := Node.ImageIndex;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FBackgroundColor := clWindow;
  FDefaultDraw := True;
  FDefaultDrawItem := True;
  FBrushStyle := bsSolid;
  FButtonSize := 5;
  FDefaultDrawItem := not FDefaultDrawItem;
  TV.Repaint;
  TV.Color := clWindow;
  TV.Color := clHighlight;
  TV.Font.Assign(TV.Font);
  TV.Font.Assign(TV.Font);
  TV.Font.Color := clHighlightText;
  TV.Color := clHighlight;
  TV.Color := TV.Color;
end;

end.


--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Lence
Дата 21.2.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



С прорисовкой фона проблему решили ...  а что делать с плюсиками и линиями ??? 

нжно чтоб было 

TreeView1.ShowLines := false;
TreeView1.Showroot := false;
TreeView1.SelectionPen.Color := clBtnShadow;

и при выделении итема - выделялась вся строка, а не коряво обрубая по размеру шрифта .... 

может кто скажет куда воткнутть свои глаза в коде и изменить это ? и если можно с примером 
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Yanis
Дата 22.2.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Цитата(Lence @  22.2.2007,  00:17 Найти цитируемый пост)
выделялась вся строка

Код
  TV.ShowLines := False;
  TV.RowSelect := True;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Lence
Дата 22.2.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



Yanis, где имено это писать ?   smile 
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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