4 votes

Zoom à l'aide de deux formulaires

J'ai plusieurs formulaires dans mon projet. Form1 contient une pictureBox qui affiche un jpeg. Dans la Form2, j'ai une trackBar que j'aimerais contrôler le niveau de zoom de l'image dans la Form1. Pour rester simple, je n'ai besoin que de 2 ou 3 niveaux de zoom. J'ai défini la pictureBox comme étant publique dans la vue du concepteur. Cependant, lorsque j'essaie de référencer la pictureBox dans le formulaire 2, on me dit qu'elle n'existe pas. Voici le code que j'utilise pour appeler Form2 dans Form1

Form2 dataWindow = new Form2();
dataWindow.ShowDialog();

En résumé, les deux choses pour lesquelles j'ai besoin d'aide sont les suivantes :

1) Modifier les propriétés de pictureBox1 à partir d'un formulaire séparé. 2) Création d'une simple formule de zoom.

3voto

Servy Points 93720

Permettre à d'autres classes de modifier les contrôles internes du formulaire est considéré comme une mauvaise conception. Le formulaire doit être responsable de tous ses composants. Les contrôles internes ne doivent jamais être rendus publics. Il est également considéré comme une mauvaise pratique qu'un formulaire enfant ait une référence au formulaire parent.

La meilleure façon d'aborder ce problème est de recourir à des événements. Le formulaire de l'enfant, Form2 devrait définir un événement public :

public event Action<int> TrackBarMoved;

Form2 peut déclencher cet événement lorsque la barre de progression est déplacée et passer, comme paramètre, la position de la barre de progression (s'il est logique de passer quelque chose d'autre, comme le niveau de zoom, ou ce que vous voulez, c'est très bien aussi).

Form1 peut s'abonner à cet événement lorsqu'il crée From2 et modifier le zoom sur l'image (en interne, à partir de l'écran de l'ordinateur). Form1 ) en fonction de la position du trackbar.

2voto

Jeremy Thompson Points 14428

1) Passer une référence au formulaire 1 dans le constructeur du formulaire 2 :

Form2 dataWindow = new Form2(this);
dataWindow.Show();

...

private form1 as Form1;
public Form2(Form1 frm1)
{
  form1 = frm1;
}

Ensuite, dans l'événement TrackBar_Scroll de Form2, la PictureBox est référencée par la variable membre privée form1 : form1.PictureBox1.Property

2) Agrandissez vos images à l'aide d'une PictureBox afin de pouvoir zoomer à l'aide de la molette de la souris.


Le meilleur moyen est l'organisation d'événements :

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.TrackBarMoved += new Action<int>(ZoomPictureBox);
        form2.ShowDialog();
        form2.TrackBarMoved -= new Action<int>(ZoomPictureBox);

    }

    private void ZoomPictureBox(int zoomFactor)
    {
        pictureBox1.Width = 100 * zoomFactor;
        pictureBox1.Height = 100 * zoomFactor;
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public event Action<int> TrackBarMoved;

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        TrackBarMoved(trackBar1.Value);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X