Question

J'ai un formulaire IMD avec une image d'arrière-plan centrée.
Chaque fois que l'utilisateur modifie la taille ou l'état du formulaire, l'image n'est pas du tout mise à jour. Il reste à l’ancienne place (non plus centré) et est même perdu lorsque la forme est trop petite.

Comment gérer correctement cette situation?
Dois-je vraiment appeler "this.Refresh ()"? dans tous les gestionnaires d'événements liés à la taille et à l'état du formulaire?

L'application est réalisée en .net 3.5SP1 C # avec Windows.Forms.

Était-ce utile?

La solution

Malheureusement, il ne semble pas y avoir de moyen très rapide de le faire, mais voici ma solution et au moins, ne semble pas reposer sur des coïncidences.

Dans le constructeur mdi, gérez le redimensionnement:

this.ResizeEnd += delegate { this.Refresh(); };

Et ensuite ce remplacement pour gérer les événements de maximisation / restauration

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Win32.WM_SYSCOMMAND)
        {
            int test = m.WParam.ToInt32() & 0xFFF0;
            switch (test)
            {
                case Win32.SC_MAXIMIZE:
                case Win32.SC_RESTORE:
                    this.Invalidate();  // used to keep background image centered
                    break;
            }
        }
        base.WndProc(ref m);
    }

Les valeurs constantes sont définies comme suit:

    public const int WM_SYSCOMMAND =                    0x0112;
    //wparam for WM_SYSCOMMAND should be one of these after masking with 0xFFF0:
    public const int SC_RESTORE =                       0xF120;
    public const int SC_MINIMIZE =                      0xF020;
    public const int SC_MAXIMIZE =                      0xF030;

Autres conseils

Vous pouvez faire tout cela ou simplement insérer un me.refresh dans l'événement redimensionner du MDI.

Appelez la méthode PositionContainersToParentMiddle dans l’événement Resize de votre formulaire MDI. Je ne l'ai pas testé, mais ça devrait marcher. Vous devrez peut-être définir des conditions dans l'événement Resize pour arrêter le changement d'emplacement de l'image à chaque redimensionnement.

   private void YourMDI_Resize(object sender, EventArgs e)
    {
        PositionContainersToParentMiddle();
    }

    private void PositionContainersToParentMiddle()
    {
        int iInitX = (ParentOfImage.Size.Width - YourImage.Size.Width) / 2;
        int iInitY = ( ParentOfImage.Location.Y + YourImage.Size.Height ) / 2;
        YourImage.Location = new Point( iInitX, iInitY ) ;

    }
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    Me.BackgroundImage = My.Resources.YourBackgroundImageName
    Me.Refresh()
 End Sub
    private void Change_BackgroundImage(string _path)
  {
    string imagepath = _path;
    System.IO.FileStream fs;
 // MDI Form image background layout change her`enter code here`e     
 //(Remember control imagebakground layout take default form background layount )
          this.BackgroundImageLayout = ImageLayout.Center;
            // Checking File exists if yes go --->
            if (System.IO.File.Exists(imagepath))
            {
              // Read Image file
              fs = System.IO.File.OpenRead(imagepath);
                fs.Position = 0;
                // Change MDI From back ground picture
                foreach (Control ctl in this.Controls)
                {
                    if (ctl is MdiClient)
                    {
                      //ctl.BackColor = Color.AntiqueWhite;
                       ctl.BackColor = Color.FromArgb(31, 26, 23);
                       ctl.BackgroundImage = System.Drawing.Image.FromStream(fs);
                      break;
                       }
                  }
             }
          }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top