TREEVIEW AVEC ALPHABLENDING

cs_pepitto Messages postés 22 Date d'inscription jeudi 13 novembre 2003 Statut Membre Dernière intervention 25 juin 2008 - 20 févr. 2006 à 23:03
cs_lav Messages postés 1 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 7 mars 2006 - 7 mars 2006 à 19:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36154-treeview-avec-alphablending

cs_lav Messages postés 1 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 7 mars 2006
7 mars 2006 à 19:42
Pour optimiser les performances, on peut aussi utiliser scanline (assez recommande quand on fait des manips de ce genre) et qui permet de récuperer directement les valeurs RGB de chaque pixel pour chaque "ligne"
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 févr. 2006 à 02:59
Ha content de voir que l'optimisation ne degrade pas les performances.

pour le clipping ... je regarderais mais je te promet rien ... c'est surrement une erreur de methode employée a premiere vue ... un truc qui ne doit pas etre a sa place ou un manque de control pour eviter une reaction en chaine.
Gaadek Messages postés 16 Date d'inscription mardi 28 juin 2005 Statut Membre Dernière intervention 20 juillet 2007
22 févr. 2006 à 16:59
Bon Fowi, testé et approuvé!!! Pas de ralentissement notable, et le code en est d'autant plus lisible, donc c'est adopté.

par contre, t'aurais pas une astuce pour l'effet de clipping???
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 févr. 2006 à 15:27
heu je vois pas ou est le probleme, dans ta version tu appel de nombreuse fois d'autres fonctions que j'ai supprimer dans ma proposition.

maintenant tu as raison, mieux vaux tester.
Gaadek Messages postés 16 Date d'inscription mardi 28 juin 2005 Statut Membre Dernière intervention 20 juillet 2007
22 févr. 2006 à 11:19
Merci pour vos commentaires!

Concernant celui de pepitto, le problème de la routine, c'est qu'en masquant le controle puis en la réaffichant, on force le redessinage de la form, dans l'appel à la procédure, qui masque puis affiche le controle, et donc qui rappel le redessinage de la form, qui rappel la procédure etc...

Du coup, clipping permanent sur le controle, donc pas possible à utiliser en l'état. Sinon, l'idée semble bonne, car on récupère directement le canvas de la form, donc tous les controles, même les boutons etc.

Pour f0xi, c'est sur que ce serait plus propre niveau lisibilité du code, mais faire appel à une fonction déclenche une procédure dans la pile d'appel (comme tout appel à une fonction), et donc risque d'entraîner un ralentissement du dessin. Bon, c'est sur, je pense qu'en utilisant un buffer ou un truc comme ça, il faut utiliser une fonction, mais en l'état actuel des choses, ça ne risque pas de faire gagner grand chose, au contraire même. Je teste ça et je vous tiens au courant!
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 févr. 2006 à 07:03
petite modification :

procedure TAlphaTreeView.CustomPaint;
function Alpha(const pixcolor,tmpcolor : byte) : byte;
begin
result := (pixcolor*AlphaBlendValue+(100-AlphaBlendValue)*tmpcolor) div 100;
end;
var img:TBitmap;
X,Y: integer;
pixcol : tcolor;
begin
if (FAlphaBlend) then begin
img:=CopyControlsImage(FParentForm);
if (BorderStyle=bsSingle) then
BitBlt(Canvas.Handle, 0, 0, Width, Height,img.Canvas.Handle, left+2, top+2, SrcCopy)
else
BitBlt(Canvas.Handle, 0, 0, Width, Height,img.Canvas.Handle, left, top, SrcCopy);
img.free;
for Y := 0 to Height - 1 do
for X := 0 to Width - 1 do begin
pixcol := Canvas.Pixels[X,Y];
Canvas.Pixels[X,Y] := RGB(
alpha(byte(pixcol),byte(color)),
alpha(byte(pixcol shr 8),byte(color shr 8)),
alpha(byte(pixcol shr 16),byte(color shr 16)),
);
end;
end;
end;

procedure TAlphaTreeView.CustDrawButton(ARect: TRect; Node: TTreeNode);
var
C1,C2 : TPoint;
begin
C1 := Point(ARect.Left,ARect.Top);
with Canvas do begin
Pen.Color := clGray;
if Node.HasChildren then begin
C2 := Point(C1.X+5,C1.Y+2);
PenPos := C2;
LineTo(C2.X,C2.Y+8);
LineTo(C2.X+8,C2.Y+8);
LineTo(C2.X+8,C2.Y);
LineTo(C2.X,C2.Y);
Pen.Color := clBlack;
PenPos := Point(C2.X+2,C2.Y+4);
LineTo(C2.X+7,C2.Y+4);
if not Node.Expanded then begin
PenPos := Point(C2.X+4, C2.Y+2);
LineTo(C2.X+4,C2.Y+7);
end;
Pen.Color := clGray;
if Node.Parent <> nil then begin
C2 := point(C1.X+9,C1.Y-2);
while (C2.Y < C2.Y+2) do begin
PenPos := C2;
LineTo(C2.X,C2.Y+1);
Inc(C2.Y,2);
end;
end;
end else begin
if (Node.AbsoluteIndex = 0) then C2 := Point(C1.X+9,C1.Y+6) else C2 := Point(C1.X+9,C1.Y-2);
if (Node.getNextSibling <> nil) then begin
while (C2.Y < ARect.Bottom+3) do begin
PenPos := C2;
LineTo(C2.X,C2.Y+1);
Inc(C2.Y,2);
end;
end
else begin
while (C2.Y < C1.Y+5) do begin
PenPos := C2;
LineTo(C2.X,C2.Y+1);
Inc(C2.Y,2);
end;
end;
end;
if Node.HasChildren then C2 := Point(C1.X+15,C1.Y+6) else C2 := Point(C1.X+9,C1.Y+6);
while (C2.X < C1.X+18) do begin
PenPos := C2;
LineTo(C2.X+1,C2.Y);
Inc(C2.X,2);
end;
if ((Node.GetNextVisible <> nil) and (Node.GetNextVisible.Level = Node.Level))
or (Node.GetNextSibling <> nil) then begin
C2 := point(C1.X+9,C1.Y+12);
while (C2.Y < C1.Y+18) do begin
PenPos := C2;
LineTo(C2.X,C2.Y+1);
Inc(C2.Y,2);
end;
end;
Node := Node.Parent;
if Node <> nil then begin
C2 := point(9,ARect.Top-2);
while (C2.Y < ARect.Bottom-1) do begin
PenPos := C2;
LineTo(C2.X, C2.Y+1);
Inc(C2.Y,2);
end;
end;
end;
inherited
end;
cs_pepitto Messages postés 22 Date d'inscription jeudi 13 novembre 2003 Statut Membre Dernière intervention 25 juin 2008
20 févr. 2006 à 23:03
Petite idée pour avoir le caneva de ton <> tu peux utiliser se truc mais c'est pas sur que ça fonctionne à tous les coups (non testé avec ton code)


Result:=TBitmap.Create;
Result.Height:=Parent.Height;
Result.Width:=Parent.Width;
Visible := False;
Parent.Repaint;
Result.Canvas.Handle := GetDC(Parent.Handle);
Visible := True;
ReleaseDc(Result.Handle,Parent.Handle);
Rejoignez-nous