Garder l'echelle lors d'un resize [Résolu]

Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 25 juil. 2006 à 20:02 - Dernière réponse :
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 11 sept. 2006 à 20:04
Bonjour,
Voila, je suis tomber sur un problème qui me fait m'arracher les cheveux

Je m'explique:

J'ai une pictureBox qui contient une grande image (SizeMode = Zoom), on va dire que c'est notre image de fond, et par dessus je peux déplacer une autre picturebox.
Le problème est que lorsque je passe en SizeMode = AutoSize, je voudrais que les coordonnées de la deuxieme picturebox soit mis- à l'echelle :s

J'ai bien essayer de jouer avec les pourcentage d'agrandissement ou de diminution, mais ça me sort des resultat farfelut !!!

Help!

Tuizi
Afficher la suite 

Votre réponse

36 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 15 août 2006 à 18:54
3
Merci
Oui c'est tout à fait possible, avec le TableLayoutPanel comme déjà dit 1000x !
Créer un nouveau projet (incorpore tes images comme dans le projet que tu as mis en téléchargement) puis ajoute ceci dans Form1 :

using

System;
using System.Windows.Forms;

namespace Test_Graphic
{
   public partial class Form1 : Form
  {
      private TableLayoutPanel _tableLayoutPanel = newTableLayoutPanel();
      private PictureBox _pBox = newPictureBox();      public Form1()
      {
         this.InitializeComponent();
         this.Init();
      }

      privatevoid Init()
      {
         this._pBox.Image = global::Test_Graphic.Properties.Resources.ram;
         this._pBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
         this._tableLayoutPanel.SuspendLayout();
         this._tableLayoutPanel.Anchor = System.Windows.Forms.AnchorStyles.Top 
         | System.Windows.Forms.AnchorStyles.Bottom
         | System.Windows.Forms.AnchorStyles.Left
         | System.Windows.Forms.AnchorStyles.Right;
         this._tableLayoutPanel.BackgroundImage = global::Test_Graphic.Properties.Resources.setup;
         this._tableLayoutPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
         this._tableLayoutPanel.ColumnCount = 2;
         this._tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 43.44704F));
         this._tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 56.55296F));
         this._tableLayoutPanel.Controls.Add(this._pBox, 0, 0);
         this._tableLayoutPanel.Location = new System.Drawing.Point(27, 30);
         this._tableLayoutPanel.Name = "tableLayoutPanel1";
         this._tableLayoutPanel.RowCount = 2;
         this._tableLayoutPanel.RowStyles.Add(newRowStyle(System.Windows.Forms.SizeType.Percent, 50F));
         this._tableLayoutPanel.RowStyles.Add(newRowStyle(System.Windows.Forms.SizeType.Percent, 50F));
         this._tableLayoutPanel.Size = new System.Drawing.Size(542, 383);
         this._tableLayoutPanel.TabIndex = 8;
         this._tableLayoutPanel.ResumeLayout(false);
         this.Controls.Add(this._tableLayoutPanel);
      }
   }
}

Voilà, essaye d'agrandir ta Form maintenant, ça marcheeeeee ;-)

VC# forever

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 25 juil. 2006 à 23:00
0
Merci
je sais pas si ca va faire exactement ce que tu voudras, mais bon

docker un composant de chaque coté (pannel), et docker la picturebox en "fill" au millieu de tous les pannels
Commenter la réponse de leprov
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 25 juil. 2006 à 23:04
0
Merci
ou alors tu as aussi la propriété anchor de tes controls...

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Commenter la réponse de sebmafate
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 25 juil. 2006 à 23:21
0
Merci
ah vi pas lhabitude dutiliser anchor, cest vrai....jy pense jamais...

bcp plus simple
Commenter la réponse de leprov
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 25 juil. 2006 à 23:24
0
Merci
Le truc c'est que l'utilisateur place par exemple son image où il veut sur la picturebox de fond.
Au début cette picturebox de fond est en SizeMode = Zoom, mais si on passe en AutoSize, il faut que la picturebox que l'utilisateur à placer où il voulé, s'agrandisse (ça c'est bon je l'ai fait) mais aussi qu'elle se mette aux coordonnés mise à l'echelle (la dessus je calle!).

Tuizi
Commenter la réponse de Tuizi
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 25 juil. 2006 à 23:31
0
Merci
Je n'arrive pas à voir comment la propriété Anchor marche, j'ai cliqué sur les 4 cotés pour voir, et là ça ne me déplace pas mon image ça m'agrandit la picturebox!!! :s

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 25 juil. 2006 à 23:40
0
Merci
Salut,
Euh, je ne sais pas si c'est ce que tu veux, mais une idée :

- S'abonner à l'event déclencher lors du resize
- Chercher si l'agrandissement a été plus grand en largeur ou hauteur
- Ajuster la largeur respectivement la hauteur en fonction du plus grand

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 25 juil. 2006 à 23:48
0
Merci
Sniff Bidou, c'est ce que je fais en ce moment et je me casse vraiment la tete dessus, donc je voudrais savoir si il y a pas un moyen de le faire automatiquement avant de me replonger dans les calculs

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 26 juil. 2006 à 09:32
0
Merci
Des calculs? Quels calculs?
Récupérer le plus grand, c'est sans calcul, suffit de contrôler les valeurs de Height et Width de ton image...

Ensuite, c'est une simple règle de trois : si x1 et y1 sont les valeurs de la lageur et hauteur de ton image et x2 et y2 les nouvelles valeurs, alors
 
si x2 > y2 : y2 = y1 * (x2 / x1)

si y2 > x2:  x2 = x1 * (y2 / y1)

si x2 = y2 : tu choisis un des deux cas plus haut aléatoirement

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 26 juil. 2006 à 13:06
0
Merci
Bidou c'est pour la taille que tu me donne ce principe?


Moi c'est surtout pour la position en faite, le principe que j'ai établit et qui ne marche pas fort c'est:


Je regarde le pourcentage d'agrandissement en largeur de mon image de fond, et j'applique ce poucentage sur la Position X de l'image qui est placé dessus.

Donc c'est pour ça que j'aimerai savoir si il y a une méthode qui fait ça en C#

Merci de vos réponses en tout cas

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 26 juil. 2006 à 14:29
0
Merci
Il semblerait qu'on ne parle pas de la même chose
J'ai peut-être pas bien compris la question...

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 26 juil. 2006 à 14:52
0
Merci
Erf, je m'en douté que ma question été pas forcément clair, je retente :
En faite, sur une image par exemple de 1000x1000, au début elle est en SizeMode Zoom, donc sa taille on va dire fait 500x500, là dessus je met une autre picturebox au coordonné 5:5, donc on est d'accord qu'a ce moment là si je repasse en SizeMode Autosize, j'ai donc mon image qui a doublé.

Donc normal, je double aussi la taille de l'image coller par dessus (pour l'echelle) mais aussi ça position. Et c'est donc la que je coince, je voudrais faire un truc propre donc voir si une métohde ou une propriété le fait

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 28 juil. 2006 à 10:27
0
Merci
Franchement, je visualise pas très bien.
Tu m'envoyer ton projet par e-Mail si tu veux, histoire que je vois de quoi ça parle

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 28 juil. 2006 à 16:30
0
Merci
Non je ne peux pas fournir le projet Bidou, désolé.

J'ai réussit a faire ce que je voulais malgrès un manque de précision dans les calculs, mais Bidou je vais prendre un exemple concret:

Tu vois par exemple dans internet explorer, les boutons genre "Réponse acceptée" (:p) quand tu agrandis ta fenetre ou que tu la resize, et bien il reste a l'echelle, si en taille réduite ils sont place au 3/4 de la page est bien quand la page va etre agrandit le bouton va rester au 3/4 de la page.

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 28 juil. 2006 à 19:50
0
Merci
Je ne suis pas sur de ce que tu veux.
Si tu créer une nouvelle form (taille 300; 300), tu mets un bouton en (150; 150).

Le but, c'est quoi? Si j'agrandis la form, il doit s'accrocher à un côté? C'est à dire par exemple rester à x pixel du bas de la fenetre, et y pixel de la droite, ou bien il doit garder la proportion? C'est à dire que s'il se trouvait à (150; 150) sur une fenetre de (300; 300) il doit se trouver à (400; 400) sur une fenetre de (800; 800) ?

Si t'es dans le premier cas, tu fais un anchor right, bottom.
Si t'es dans le second cas, faut calculer la position avant le resize, trouver la proportionnalité sur x et y (ici elle vaut 300/150 pour x et 300/150 sur y; c'est à dire 2 dans les deux cas) puis regarder la nouvelle grandeur à la fin du resize et faire le calcul à l'envers [nouvelles grandeur (800; 800) => (800/2; 800/2) => (400;400)]. Un peu moins facile à mettre en place...

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 29 juil. 2006 à 14:25
0
Merci
Voila Bidou, c'est le 2nd cas que je veux faire. Et donc oui j'ai du faire comme dit au message précédent les calculs que tu dis. Mais je perd de la précision de 2 ou 3 pixel, j'utilise pourtant du decimal mais bon c'est pas grave cela fait ce que je veux.

Mais donc j'aurai juste voulu savoir si y'avait une méthode ou une propriété qui fait ça automatiquement mais on dirait que non... tans pis ça me convient là mon truc :)

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 29 juil. 2006 à 15:04
0
Merci
Alors si tu travailles en .NET2, je pense que tu devrais pouvoir résoudre le problème assez proprement :
Pour cela, jettes un oeil du côté des Containers. Par exemple, avec un TableLayoutPanel j'ai réussi à faire ce que j'ai décrit ci-dessus sans ancun calcul...

VC# forever
Commenter la réponse de cs_Bidou
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 30 juil. 2006 à 17:51
0
Merci
J'essaye...


Interessant mais sa marche comment? J'ai mis un bouton dedans histoire de comprendre, j'ai essayer avec la propriété Anchor voir si il pouvez ce déplacer en fonction du redimentionnement mais rien... :s

Tuizi
Commenter la réponse de Tuizi
Messages postés
144
Date d'inscription
samedi 21 octobre 2000
Dernière intervention
7 mai 2009
- 30 juil. 2006 à 17:51
0
Merci
La propriété Dock par Anchor, je me suis tropé :)

Tuizi
Commenter la réponse de Tuizi
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 30 juil. 2006 à 18:09
0
Merci
Euh, tu poses un TableLayoutPanel sur ta form (la il te créer par défaut 4 quadrants) tu poses un bouton sur la cardrant tout en bas à droite par exemple, et c'est tout sauf erreur !

VC# forever
Commenter la réponse de cs_Bidou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.