[VCL] TBitmap.Canvas.CopyRect : bugs connus ?!

TBitmap.Canvas.CopyRect : bugs connus ?! [VCL] - Delphi/Pascal - Programmation

Marsh Posté le 18-02-2003 à 17:52:28    

bonjour !
 
j'utilise cette fonction assez souvent dans mon prog et il arrive à peu près une fois sur 50 que le copy rect ne copie rien du tout....
 
pour vous situer un peu la chose, ouala à quoi ressemble mon ti code :
 

Code :
  1. with bmpScroll do begin
  2.          Height := BMP_HEIGHT;
  3.          width := BMP_WIDTH*bmpList.Count;
  4.       end;
  5.       with destRect do begin
  6.          Top := 0;
  7.          Bottom := BMP_HEIGHT;
  8.       end;
  9.       sourceRect := destRect;
  10.       with sourceRect do begin
  11.          Top := 0;
  12.          Bottom := BMP_HEIGHT;
  13.          Left := 0;
  14.          Right := BMP_WIDTH;
  15.       end;
  16.       // le scroll se limite aux nbMax dernières passes.
  17.       if bmpList.count-1 > nbMax then i := (bmpList.count-1)-nbMax
  18.       else i := 0;
  19.       for i:=i to bmpList.Count - 1 do begin
  20.          with destRect do begin
  21.             Left := i*BMP_WIDTH;
  22.             Right := Left + BMP_WIDTH;
  23.          end;
  24.          bmpScroll.Canvas.CopyRect(destRect, TBitmap(bmpList.Items[i]).Canvas, sourceRect);
  25.       end;


 
 
j'ai vérifié que bmpList.Items contenait bien des bitmap "valide" et c'est bel est bien le cas. Il n'y a aucun doute, c'est CopyRect qui foire... vs avez déjà vu ça ??!!
 
notez que ce phénomène arrive bp plus souvent sur winXP, un petit peu moins sous Win2K et quasiment jamais sous win98...

Reply

Marsh Posté le 18-02-2003 à 17:52:28   

Reply

Marsh Posté le 18-02-2003 à 17:59:26    

procedure TCanvas.CopyRect(const Dest: TRect; Canvas: TCanvas;
  const Source: TRect);
begin
  Changing;
  RequiredState([csHandleValid, csFontValid, csBrushValid]);
  Canvas.RequiredState([csHandleValid, csBrushValid]);
  StretchBlt(FHandle, Dest.Left, Dest.Top, Dest.Right - Dest.Left,
    Dest.Bottom - Dest.Top, Canvas.FHandle, Source.Left, Source.Top,
    Source.Right - Source.Left, Source.Bottom - Source.Top, CopyMode);
  Changed;
end;


 
voici le code de CopyRect il emballe l'appel à l'api windows en s'assurant que les handle sur les objets graphiques sont valides, donc si ça marche pas c peut-etre qu'a ce moment ils sont pas bon, regarde en utilisant directement l'api...

Reply

Marsh Posté le 25-02-2003 à 16:05:41    

bon, déjà, c'est pas le RequiredState, puisque ça me renverrerais une exception et ce n'est pas le cas :/.
Sinon, en lisant la doc, j'ai vu que BitBlt était plus adapté à mes besoin que StretchBlt (surface dest et source de taille identique). J'utilise donc cette fonction directement.
Mais j'ai toujours le même pb : BitBlt n'échoue jamais (renvoie toujours true) mais la surface n'est pas toujours copiée...
Dans une autre partie de l'application, j'utilise TransparentBilt (pour supprimer une couleur sur un bitmap) et j'ai exactement le même problème et ce une fois sur 20 a peu près...  
bon, je vais encore chercher mais si vous avez une idée, n'hésitez surtout pas ! :jap:

Reply

Marsh Posté le 28-09-2007 à 11:22:16    

Je relance cette discution car j'ai actuellement le même problème.
Y a-t-il une solution?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed