cs_pepitto
Messages postés22Date d'inscriptionjeudi 13 novembre 2003StatutMembreDernière intervention25 juin 2008
-
20 févr. 2006 à 23:03
cs_lav
Messages postés1Date d'inscriptionjeudi 5 juin 2003StatutMembreDerniè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.
cs_lav
Messages postés1Date d'inscriptionjeudi 5 juin 2003StatutMembreDerniè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és4204Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 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és16Date d'inscriptionmardi 28 juin 2005StatutMembreDernière intervention20 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és4204Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 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és16Date d'inscriptionmardi 28 juin 2005StatutMembreDernière intervention20 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és4204Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 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és22Date d'inscriptionjeudi 13 novembre 2003StatutMembreDernière intervention25 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)
7 mars 2006 à 19:42
25 févr. 2006 à 02:59
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.
22 févr. 2006 à 16:59
par contre, t'aurais pas une astuce pour l'effet de clipping???
22 févr. 2006 à 15:27
maintenant tu as raison, mieux vaux tester.
22 févr. 2006 à 11:19
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!
21 févr. 2006 à 07:03
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;
20 févr. 2006 à 23:03
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);