2010-06-23 18 views
1

Je travaille avec Delphi.
J'ai une boîte de défilement dans laquelle je mets le contrôle TImage. Maintenant, je voulais zoomer l'image rendue dans le contrôle TImage. Donc, j'utilise la méthode stretchDraw de TCanvas. Mon code est -Problème avec TImage et TScrollBox

if sbZoom.Down then begin 
     rct := imgmain.Picture.Bitmap.Canvas.ClipRect; 
     rct := Rect(rct.Left * 2,rct.Top * 2,rct.Right * 2,rct.Bottom * 2); 
     imgmain.Picture.Bitmap.Canvas.StretchDraw(rct,imgmain.Picture.Bitmap); 
     imgmain.Repaint; 
    end; 

Il est zoomant correctement l'image, mon problème est que je veux la taille de la boîte de défilement doit être changé aussi avec le zoom de l'image.
Also explain me parameters of Canvas.StretchDraw method. I am little confused with it.
Merci.

Répondre

1

Uwe Raabe vous donne la bonne façon de le faire. Voici pourquoi votre chemin ne fonctionne pas: Une boîte de défilement affiche les barres de défilement et vous aide à voir les commandes entières. Dans votre cas, il affichera uniquement les barres de défilement lorsque l'objet TImage devient plus grand que la Scrollbox. La Scrollbox ne peut pas connaître les internes de TImage, donc TImage.Picture ne se soucie pas du contrôle. Et un TImage qui a AutoSize = False ne se soucie pas de son image, sa taille reste la même à tout moment.

Votre code repeint le bitmap de base sur lui-même. Le problème est que le bitmap a fixé Largeur et Hauteur: si vous peignez en dehors de la zone du bitmap, vous êtes fondamentalement ignoré. Lorsque vous "zoomez" en StretchDrawing le bitmap sur lui-même (et je suis surpris que cela a fonctionné pour commencer!) Vous ne faites pas le bitmap plus grand et les choses qui ne correspondent pas sont réduites silencieusement. Si vous voulez que le bitmap interne change de taille, vous devez d'abord créer un nouveau bitmap plus grand, dessiner votre image agrandie sur le nouveau bitmap, puis affecter le bitmap à votre TImage. Si vous faites cela, assurez-vous que TImage.AutoSize = True.

+0

OK bonne réponse ... En fait j'avais déjà essayé mais ça ne marchait pas aussi bien que je m'y attendais. Mais le problème était les paramètres que j'ai passés dans la fonction strechDraw. Je prenais un bitmap plus grand et passais le même bitmap qu'un paramètre de StrechDraw. Mon autre question concernait les paramètres de StrechDraw, que personne n'explique. De toute façon maintenant je l'avais compris. – Himadri

0

Vous devez définir la taille du contrôle d'image sur la taille de l'image bitmap.

+0

Ils sont déjà identiques ... – Himadri

3

Vous pouvez le faire assez facilement sans appeler StretchDraw:

if Zoomed then begin 
    Image1.AutoSize := false; 
    Image1.Stretch := true; 
    Image1.Width := 2*Image1.Width; 
    Image1.Height := 2*Image1.Height; 
    end 
    else begin 
    Image1.Stretch := false; 
    Image1.AutoSize := true; 
    end; 

AutoSize: = true assure que le TImage est la même taille que l'image à l'intérieur. Pendant le zoom, nous désactivons la fonction AutoSize et la fonction Stretch on, donc l'image est redimensionnée à la taille TImage (qui est toujours la même ici). Ensuite, nous doublons la taille de la TImage pour faire l'effet de zoom. Comme le TImage est maintenant plus grand, la scrollbox peut fonctionner correctement.

+0

Mais cela ne changera pas la valeur de Image1.Picture.Bitmap.Width et Image1.Picture.Bitmap.Height ... – Himadri

+0

Ce n'est pas le cas, mais la Scrollbox ne s'en soucie pas à propos de Image1.Picture.BitmapWidth, il ne se soucie que de Image1.Width. Pourquoi voudriez-vous redimensionner le bitmap réel quand vous pouvez montrer l'image plus grande/plus petite sans réellement détruire l'information? +1 –

+0

@Cosmin Je veux la même taille de bitmap parce que je dois faire d'autres processus avec l'image sur l'événement mousedown et changer plusieurs points de l'image. – Himadri