Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Select in TreeView


Автор: Chydik 6.6.2009, 18:48
Народ помогите пожалусто с определением выделенного елемент в TreeView в режиме OwnerDraw.

Мой код:
Код

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

bm:=TBitmap.Create;
bm.Width:=4;
bm.Height:=16;
    ImageList2.Draw(bm.Canvas,0,0,2,true);

  DefaultDraw := False;
  NodeRect := Node.DisplayRect( false );
  NodeRect.Left := NodeRect.Left + ( Node.Level * TreeView1.Indent );
  TreeView1.Canvas.Brush.Style:=bsClear;

  TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
if cdsselected in state then
Begin
      TreeView1.Font.Style := [fsBold,fsUnderline];
      TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
end
      else
      Begin
      TreeView1.Font.Style := [fsBold];
           TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
      end;
end;




Данный  вариант не помогает.
Код

if cdsselected in state then

Надо определить выделен ли елемент и нарисоваеть его с подчеркиванием

Автор: Keeper89 6.6.2009, 20:03
Код

if TreeView1.Selected = Node then
  // Подчеркиваем

?

Автор: Chydik 6.6.2009, 20:30
Немного не правильно выразился.
Виноват Сорри.

Дело в том что если определяется выделенный елемент то идет зацикленная перерисовка.

А если енто все использовать OnClick (т.е установка стиля для выделения), то стиль меняется для всех елементов.

У меня стоит темносиний цвет текста и при клике, без опредиления выбранного елемента

Код

if cdsselected in state then
Begin
      TreeView1.Font.Style := [fsBold,fsUnderline];
      TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
end
      else
      Begin
      TreeView1.Font.Style := [fsBold];
           TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
      end;

, текст становиться черным
Но где происходит даная обработка выделения я никак не пойму.

Автор: Keeper89 6.6.2009, 20:52
У меня выделение работает просто вот так:
Код

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if cdsSelected in State then
    Sender.Canvas.Font.Style := [fsBold,fsUnderline];
end;

Автор: Chydik 6.6.2009, 21:01
Да но енто при условии что DefaultDraw := True;, а меня в False т.к. не нашел другого выхода для прозоачности текста(в TreeView используется заливка фона)

Автор: Keeper89 6.6.2009, 21:44
Опиши задачу подробнее, может есть способ получше, чем у тебя.

Автор: Chydik 6.6.2009, 22:09
В принципе весь основной код я написал.

Еще использую

Код

 procedure TTreeView.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
 begin
   Msg.Result := 1;           // Prevent background from getting erased
end;



Чтоб небыло мерцаний при перерисовке елементов

В Событии TreeView1CustomDraw просто канва заливается градиентой

Вот в принципе и все.

Код

 TreeView1.Canvas.Brush.Style:=bsClear;


Использую для прозрачности заливки елементов(при DefaultDraw=ture) енто никак не смог осущетвить.

И хотелось бы чтоб при клике на елемент он подчеркивался.
(Енто то счем хотелось бы пока разобраться, т.к енто самый простой вариант выделения.)

Автор: Keeper89 7.6.2009, 16:20
Вот, выделяется как нужно:
Код

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  var
  NodeRect : TRect;
  bm:TBitmap;
begin
  with Sender.Canvas do
  begin
    bm := TBitmap.Create;
    bm.Width := 4;
    bm.Height := 16;
    //ImageList2.Draw(bm.Canvas,0,0,2,true);
    DefaultDraw := False;
    NodeRect := Node.DisplayRect( false );
    NodeRect.Left := NodeRect.Left + ( Node.Level * TreeView1.Indent );
    Brush.Style := bsClear;
    //TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
    if cdsSelected in State then
    begin
      Font.Color := clBlack;
      Font.Style := [fsBold,fsUnderline];
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end
    else
    begin
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end;
  end;
end;


Автор: Chydik 7.6.2009, 17:35
Огромное спасибо. smile 
ЗАработало. smile 
Т.е. получается проьлема у меня была в том что параметры шрифта я менял не для канвы, а не посредственно шрифта ТриВиьюва.

Добавлено через 10 минут и 15 секунд
ДА и еще

Код

    if cdsSelected in State then
    begin
      Font.Color := clBlack;
      Font.Style := [fsBold,fsUnderline];
          TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end
    else
    begin
        TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end;

имеджы надо добавлять при проверки выделения.
Код


TreeView1.Images.Draw(TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );


Автор: Keeper89 7.6.2009, 19:23
Цитата(Chydik @  7.6.2009,  18:35 Найти цитируемый пост)
имеджы надо добавлять при проверки выделения.

Их я просто закомментировал, т.е. иконок не было. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)