Autor Beitrag
[WOL]Azrael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 20.09.04 15:53 
moin,
Ich hab in meiner TreeView Komponente ein Hintergrundbild eingefügt mit:

ausblenden Delphi-Quelltext
1:
2:
 TreeView1.Brush.Bitmap := Image1.Picture.Bitmap;
 TreeView1.FillRect(ARect);


Das Problem, dass ich jetz habe: Wenn nun Icons+Schrift in dem TreeView angezeigt werden und über dem Bild liegen ragt ein Teil des Bildes hervor, der andere hingegen wird von der Schrift verdeckt. Eine Lösung wäre jetzt die Schrift transaprent zu machen, aber leider bekomme ich das nicht hin.

Ich hoffe mir kann da jemand helfen :)

schonmal vielen Dank!
OlliWausD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: Mo 20.09.04 16:05 
versuch mal

treeview1.Repaint

mfg

OlliW

_________________
Take it easy
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 20.09.04 16:15 
mhm das bringt nicht viel, das zeichnet ja nur die TreeView Komponente neu, das Bild liegt aber immer noch unter der Schrift...
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: Mo 20.09.04 17:08 
Zitat:
Eine Lösung wäre jetzt die Schrift transaprent zu machen
habe dein Problem nicht wirlich verstanden, willst du wirklich die Schrift transparent machen ode rnur deren Untergrund, oder was?

mfg
GSE

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 20.09.04 17:12 
Naja den Hintergrund der Schrift, zu lesen sein soll sie noch, doch das Bild soll von unten "durchschimmern".
Also praktisch, dass was auch bei Labesl von Delphi eingesetzt wird: "label1.transparate:=True;"
:)
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Di 21.09.04 13:44 
Ich glaube deine Problemstellung ist auch in den Delphi Beispielen mit drin (Ordner TTreeview oder so).
Aber da war das meiner Meinung nach auch nicht gelöst ;)
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Di 21.09.04 15:06 
versuchs mal mit "OnCustomDrawItem" bei der treeview.
dort müsste dann ein
ausblenden Delphi-Quelltext
1:
SetBkMode (Tree.Canvas.Handle, TRANSPARENT);					

helfen. danach mit DrawText deinen text ausgeben und abschliessendes
ausblenden Delphi-Quelltext
1:
SetBkMode (Tree.Canvas.Handle, OPAQUE);					

nicht vergessen.
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Di 21.09.04 15:27 
iKilledKenny hat folgendes geschrieben:
versuchs mal mit "OnCustomDrawItem" bei der treeview.
dort müsste dann ein
ausblenden Delphi-Quelltext
1:
SetBkMode (Tree.Canvas.Handle, TRANSPARENT);					

helfen. danach mit DrawText deinen text ausgeben und abschliessendes
ausblenden Delphi-Quelltext
1:
SetBkMode (Tree.Canvas.Handle, OPAQUE);					

nicht vergessen.



Wo kommt denn das DrawText her?
Als Eigenschaft der Komponente bekomme ich nur:

TreeView1.DrawTextBiDiModeFlags()
TreeView1.DrawTextBiDiModeFlagsReadingOnly

angezeigt...

Trotzdem schonmal Danke! :)
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Di 21.09.04 15:48 
aus der windows api...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TFormMain.TreeViewCustomDrawItem
    (Sender: TCustomTreeView; 
     Node: TTreeNode; 
     State: TCustomDrawState;
     var DefaultDraw: Boolean);

var   rc : TRect;

begin
  rc := Node.DisplayRect (True);
  SetBkMode (TreeView.Canvas.Handle, TRANSPARENT);
  DrawText (TreeView.Canvas.Handle, PChar (Node.Text), -1, rc, DT_LEFT or DT_TOP);
  SetBkMode (TreeView.Canvas.Handle, OPAQUE);
  DefaultDraw := False;
end;


ungetestet, aber so müsste es gehen...
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Di 21.09.04 16:13 
mhm, ne leider nicht.
Wenn das DefaultDraw auf false steht werden meine Icons nicht mitgezeichnet. Wenn ich das auf True stelle bekomme ich nur ne dicke Schrift :(

Was mache ich denn da falsch?
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 22.09.04 07:45 
wenn das DefaultDraw auf True steht, dann malt die vcl selbst nochmal. d.h. im klartext das du deine icons auch selber malen musst. diese stehen ja wahrscheinlich in einer imagelist.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TFormMain.TreeViewCustomDrawItem  
    (Sender: TCustomTreeView;   
     Node: TTreeNode;   
     State: TCustomDrawState;  
     var DefaultDraw: Boolean);  

var   rc : TRect;  
 
begin  
  rc := Node.DisplayRect (True);  
  SetBkMode (TreeView.Canvas.Handle, TRANSPARENT); 
  ImageList.Draw (TreeView.Canvas, (rc.Left - ImageList.Width - 2), rc.Top, IndexDeinesBildes);
  DrawText (TreeView.Canvas.Handle, PChar (Node.Text), -1, rc, DT_LEFT or DT_TOP);  
  SetBkMode (TreeView.Canvas.Handle, OPAQUE);  
  DefaultDraw := False;  
end;


eventuell musst du noch die ausgabeposition für das image anpassen, je nachdem, wie groß die images sind und wie groß die itemheight deines trees ist.

ist wiederum ungestestet...
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mi 22.09.04 08:51 
ah cool, das funktioniert zumindestens teilweise (mit den Bildern gibts noch probs), aber die Schrift wird tatsächlich transparent! Danke!


IEn Frage hab ich allerdings noch: Beim Scrollen wird das Bild immer nur halb oder gar nicht gezeichnet - wie kann man das unterbinden? Ich hätte jetzt gedacht mit einem TreeView.refresh bzw. TreeView.repaint, aber mir ist noch nicht ganhz klar welches das Scrollereignis ist - wo ich das also in den Code scrheiben muss.


Danke! :)


edit: Also ich muss gestehen dass ich das mit den Bildern noch nicht ganz verstehe. Iwe bekomme ich das denn hin, dass auch die eine Wurzel ein Bild erhält, die andere Wurzel ein anderes Bild und die Knoten auch verschiedene Bilder, die sich bei draufklicken ändern?
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 22.09.04 10:08 
Zitat:
IEn Frage hab ich allerdings noch: Beim Scrollen wird das Bild immer nur halb oder gar nicht gezeichnet


ich denke mal, du meinst hier dein hintergrundbild? wen dem so ist, probier mal im OnCustomDraw des trees dein hintergrundbild auf den canvas des trees in das übergebene rechteck zu malen. defaultdraw wieder auf false setzen.

Zitat:
edit: Also ich muss gestehen dass ich das mit den Bildern noch nicht ganz verstehe. Iwe bekomme ich das denn hin, dass auch die eine Wurzel ein Bild erhält, die andere Wurzel ein anderes Bild und die Knoten auch verschiedene Bilder, die sich bei draufklicken ändern?


da habe ich vorhin auch nicht weiter drüber nachgedacht. versuchs mal mit
ausblenden Delphi-Quelltext
1:
  ImageList.Draw (TreeView.Canvas, (rc.Left - ImageList.Width - 2), rc.Top, Node.ImageIndex);					

im OnCustomDrawItem des trees. das setzt natürlich voraus, das du im OnGetImageIndex, bzw. OnGetSelectedIndex den image index für die einzelnen nodes setzt.

as ever, untested...
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mi 22.09.04 15:00 
Zitat:

ich denke mal, du meinst hier dein hintergrundbild? wen dem so ist, probier mal im OnCustomDraw des trees dein hintergrundbild auf den canvas des trees in das übergebene rechteck zu malen. defaultdraw wieder auf false setzen.


Also das mach ich so...:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
with TreeView1.Canvas do
  begin
        Brush.Bitmap := Image1.Picture.Bitmap;
        FillRect(ARect);
  end;
 DefaultDraw:=True;

setz ich das DefaultDraw auf false, werden die Icons wiederum nicht mitgezeichnet.
Ich hatte dann versucht das ImageList.Draw auch da mitreinzuschreiben, allerdings gibt es in der Routine den Bezeichner "Node" nicht.

ausblenden Delphi-Quelltext
1:
  ImageList.Draw (TreeView.Canvas, (rc.Left - ImageList.Width - 2), rc.Top, Node.ImageIndex);					


Zitat:

im OnCustomDrawItem des trees. das setzt natürlich voraus, das du im OnGetImageIndex, bzw. OnGetSelectedIndex den image index für die einzelnen nodes setzt.


mhm wie denn?? (also die Icons werden inzwischen korrekt gezeichnet, allerdings fehlen auf einmal die gestrichelten Linien :shock: - und bei Click auf ein Icon verschwindet dessen Schrift)

Irgendwie begreife ich die Komponente noch nciht so ganz..!

as ever Vielen danke für deine Hilfe! ;)
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 22.09.04 15:48 
leider hab ich jetzt gerade keine zeit für ein testprojekt. ich werde mich aber heute abend mal hinsetzen und eins schreiben. du hörst von mir.

bis dahin: nicht verzweifeln :wink:
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mi 22.09.04 15:51 
iKilledKenny hat folgendes geschrieben:
leider hab ich jetzt gerade keine zeit für ein testprojekt. ich werde mich aber heute abend mal hinsetzen und eins schreiben. du hörst von mir.

bis dahin: nicht verzweifeln :wink:


super! Vielen Dank! :) :)

Du bist meine Rettung!
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Do 23.09.04 11:00 
hi, habs soweit hinbekommen, dass das hintergrundbild richtig gemalt wird, die schrift transparent ist und die icons stimmen. leider sind die linien und die plus/minus-zeichen nicht mehr da...

falls du das bisherige test-projekt haben willst, schick bitte eine mail an
mail[at]alex-stork.de

ich bleib aber dran, interessiert mich selber auch :D
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 23.09.04 11:04 
ok! Mail is raus! ;)
[WOL]Azrael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 04.10.04 08:45 
OK es Funktioniert inzwischne alles mit dem TreeView, doch am Wochenende ist mir noch ein höchst ärgerliches Problem aufgefallen. Bei der Reaktion auf die Message WM_Paint wird ein
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  If (Message.Msg = WM_Paint ) then
    begin
    Rect:=TreeView1.Selected.DisplayRect(TRUE);
    DC := GetDC( TreeView1.Handle );
    SetBkMode(DC,TRANSPARENT);
   with TreeView1.Canvas Do
    begin
     Brush.Color:= clyellow;
     FillRect(Rect);
     Font.Color:= clactivecaption;
     TextOut(Rect.Left, Rect.Top, TreeView1.selected.text);
     Font.Color:=clblack;
    end;
  end;

gemacht, allerdings erscheint das Bild nun unter WinXP im Vordergrund! Dass heisst der Baum ist nicht mehr zu sehen, was natürlich nicht so prickelnd ist.