Canvas indépendant pour Composant

cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 - 25 mai 2013 à 12:14
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 - 25 mai 2013 à 17:57
Re

Dans mon composant descendant de TWinControl,j'ai besoin de garder en mémoire un Bitmap de l'ensemble du dessin qui sera sauvegardé en tant qu'élément d'une Liste de pages (ça sera un sous-composant).

Ce dessin sera destiné également à plusieurs usages :

1. Affichage avec le bon dimentionnement, 2. Sauvegarde fichier de l'original dans son format maximum
3. Création de vignettes
4. Aperçus avant impressions

Le dessin de l'original ne pose pas de problème spécifique même s'il s'agit de calculs multiples en arithmétique...
mais je me pose des questions sur la méthode d'affichage selon les propriétés de dimensions et Zoom demandé

Au départ, je me suis dit:

Bon je dessine dans un bitmap aux dimensions maximum pour garder une bonne précision

Puis je définis un TRect d'affichage qui calulera le ratio en fonction de l'affichage demandé

Constructor TQuest.Create(AOwner : TComponent);
Begin
  inherited Create(AOwner);
  inherited Width := 200;
  inherited Height:= 300;
  ...
  _PageCanvas := TCanvas.Create;
  _RectScr    := Rect(0,0,_DimScrBmp.X,_DimScrBmp.Y);
  _RectDest   := f_SizeToRectZoom(FZoomVal,FZoomState);
  ...
  BmpPage  := TBitmap.Create;
  With BmpPage do // Original
  begin
    Width := _DimScrBmp.Right;
    Height:= _DimScrBmp.Bottom;
  end;



Mes rectangles RectScr et RectDest sont définis et commencent à (0,0,...) et je les définis en fonction des paramètres. l'origine du Point Supérieur gauche de Mon Rect de destination sont également calculés dans paint:

Procedure TQuest.Paint;
Begin
  inherited paint;
  if Assigned(Parent) then
  begin
    _RectDest := Parent.BoundsRect;
    _O := f_OrgRect(_RectScr,_RectDest,FZoomVal,FZoomState);
  end else
  begin
    _RectDest := Parent.BoundsRect;
    _O := Point(0,0);


mais c'est là que je me pose des questions car je n'arrive pas à centrer mon dessin à l'échelle:

1. Est-il préférable d'utiliser CopyRect en travaillant sur les Rectangles d'origine et de Destination?

Canvas.CopyRect(_RectDest,BmpPage.Canvas,_RectScr);

2. Ou Bien de travailler sur des Bitmap différents en utilisant :

BmpZoom.Canvas.StretchDraw(_RectDest,BmpPage);

Mon image reste toujours en (0,0) sur la fenêtre parent!

yo, les PiraDelph!

Jean_Jean

4 réponses

cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
25 mai 2013 à 15:45
j'utilise ce code de paint qui commence à se rapprocher de ce que je veux avec deux Bitmap au lieu d'un seul :

DrawBackPage(BmpScr.Canvas);
SetStretchBltMode(BmpScr.Canvas.Handle,Halftone);
StretchBlt(BmpPage.Canvas.Handle,0,0,BmpPage.Width,BmpPage.Height,      BmpSrc.Canvas.Handle,0,0,BmpSrc.Width,BmpSrc.Height,SRCCOPY);
Canvas.Draw(0,0,BmpPage);


Je préférerai jouer avec des rectangles!
Mais bon, c'est un début!



Jean_Jean
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
25 mai 2013 à 16:36
Si ça te chagrine d'utiliser deux Bitmaps, tu peux passer par un bitmap temporaire pour la réduction puis le libérer :
procedure StretchThisBitmap(var Bmp: TBitmap; NewWidth, NewHeigth: Integer);
var
  TmpBmp: TBitmap;
begin
  TmpBmp := TBitmap.Create;
  try
    TmpBmp.Width := NewWidth;
    TmpBmp.Height := NewHeigth;
    SetStretchBltMode(TmpBmp.Canvas.Handle, HALFTONE);
    StretchBlt(TmpBmp.Canvas.Handle, 0, 0, NewWidth, NewHeigth,
               Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
               SRCCOPY);
    Bmp.Assign(TmpBmp);
  finally
    TmpBmp.Free;
  end;
end;
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
25 mai 2013 à 17:12
Merci korgis

Oui, mais justement je voulais éviter de le faire en ne me basant que sur des calculs de Rect plus rapide à mon sens que des créations et destructions!
Bien que ça ne soit pas vraiment un logiciel demandant un temps de réaction très rapide...

En fait, j'ai créé un Canvas que je voulais affecter à mon dessin à partir duquel je pourrai charger mon Bitmap pour ses différentes utilisations.

Or en faisant des essais, je me suis rendu compte que dans Paint, quand j'écris :

Canvas.Draw(...), ça n'est pas le Canvas que j'ai créé sur lequel il dessine mais le canvas du bitmap d'une procédure de Dessin.

Donc finalement, comment affecter un canvas créé en tant que TCanvas à un Bitmap qui a déjà un Canvas.
Pourquoi faire simple quand on peut faire compliqué?! Je regarde du côté des méthodes Copy...

A+

Jean_Jean
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
25 mai 2013 à 17:57
Tu ne peux pas assigner un TCanvas à un autre TCanvas.
Mais tu peux copier le contenu d'un TCanvas dans un autre avec CopyRect.
0
Rejoignez-nous