Newsgroup: it.comp.lang.delphi
Titolo: Sfondo di un TreeView

Salve a tutti,
è possibile modificare lo sfondo di un TreeView inserendo un immagine
invece che impostare un colore di sfondo (proprietà color)?
Grazie mille
ciao
Matteo

> modificare lo sfondo di un TreeView inserendo un immagine...
CERTO. come al solito canvas !
var Rect : TRect; BM: TBitmap;
begin
// Ti crei l'immagine del tipo bm := TBitmap.Create; etc. etc.
Rect.Left:=0; Rect.Right:=TreeView1.Width;
Rect.Top:=0; Rect.Bottom:=TreeView1.Height;
TreeView1.Canvas.Brush.Bitmap:=BitBtn1.Glyph;
TreeView1.Canvas.FillRect(Rect);
Nell'esempio uso un Glyph di un bottone.
Ciao
--- posted by geoForum on 
http://www.delphiedintorni.it


Grazie mille!
Ho fatto in questo modo e ho messo il codice nell'evento
OnCustomDrawItem del TreeNode dove facevo già l'impostazione di
immagini e font in base al tipo di nodo (livello nell'albero).
Però mi trovo che lo sfondo è caricato correttamente ma vedo solo un
nodo (diciamo quello selezionato), se poi con il mouse mi muovo sopra
agli altri vengono visualizzati ma poi scompaiono.
Come faccio a "metterli tutti sopra allo sfondo"?
Devo fare il caricamento dello sfondo in un altro punto e non
nell'evento OnCustomDrawItem?
Grazie ancora
Ciao
Matteo

>nodi scompaiono.
Credo che non sia presente l'allineamento (classico cascarci dentro)..
Prova a mettere negli eventi GetImageIndex e Change quanto sotto.
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
// NECESSARIO - Riallinea Items e Immagini !!!
Node.SelectedIndex:=Node.ImageIndex;
end;
procedure TForm1.TreeView1GetImageIndex(Sender: TObject;
  Node: TTreeNode);
begin
// NECESSARIO - Riallinea Items e Immagini !!!
Node.SelectedIndex:=Node.ImageIndex;
end;
Fammi sapere.



Grazie della pronta risposta,
ci avevo pensato all'allineamento e nel mio metodo OnCustomDrawItem
c'era già l'istruzione Node.SelectedIndex=Node.ImageIndex.
L'ho messa anche nei 2 eventi detti da te ma non è migliorata la cosa,
per capire succede solo con la bitmap di sfondo non succedeva prima
con uno sfondo impostato a design di un colore.
Riporto per far capire il mio metodo OnCustomDrawItem:
procedure TFormMRV.TreeViewEsamiCustomDrawItem(Sender:
TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  Rect : TRect;
  Bm:TBitmap;
begin
  Bm:=nil;
  try
       with TreeViewEsami.Canvas do
        begin
         Rect.Left:=0;
          Rect.Right:=TreeViewEsami.Width;
          Rect.Top:=0;
          Rect.Bottom:=TreeViewEsami.Height;
          bm:=TBitmap.Create;
          bm.LoadFromResourceID(HInstance,1);
          TreeViewEsami.Canvas.Brush.Bitmap:=Bm;
          TreeViewEsami.Canvas.FillRect(Rect);
          DefaultDraw:= True;
          if (Node.ClassType=TTreeNodeEsame) then
          begin
            if  TTreeNodeEsame(Node).NodoEsameAssociato then
            begin
                Font.Name:= 'MS Sans Serif';
                Font.Style:= [fsBold];
                Node.ImageIndex:=1;
            end
            else
            begin
                Node.ImageIndex:=2;
            end;
          end;
          if ((Node.ClassType=TTreeNodeModalita) or
(Node.ClassType=TTreeNodeRichiesta))then
          begin
                Node.ImageIndex:=3;
          end;
          Node.SelectedIndex:=Node.ImageIndex;
        end;
  finally
      Bm.Free;
  end;
end;
Spero in un aiutino :-)  grazie ancora


Passa a TVirtualStringTree...
ciao
S

Mi spiace, non i viene in mente nulla.
Sicuramente bisogna giocare sugli eventi e sul refresh (ma dico cosa ovvia).
Se la cosa è così complessa magari qualche componente già fatto o qualcuno
che ne sa più di me.



Risolto!!
Alla fine ho messo il caricamento dello sfondo nel metodo OnCustomDraw
e non in OnCustomDrawItem.
Questa cosa insieme al settaggio corretto degli indici ha risolto il
fatto che lo sfondo copriva i nodi non selezionati.
Grazie ancora per l'aiuto
Ciao

>Risolto!!
Lo metto da parte anche io per il futuro... 
Ciao ;-)
