Pregunta

Tengo un formulario MDI con una imagen de fondo centrada.
Cada vez que el usuario cambia el tamaño o el estado del formulario, la imagen no se actualiza en absoluto. Permanece en el lugar anterior (ya no está centrado) e incluso se pierde cuando el formulario se hace demasiado pequeño.

¿Cómo se puede manejar esta situación correctamente?
¿Realmente tengo que llamar a " this.Refresh () " en todos los controladores de eventos relacionados con el tamaño y el estado del formulario?

La aplicación se realiza en .net 3.5SP1 C # con Windows.Forms.

¿Fue útil?

Solución

Desafortunadamente no parece haber una forma súper rápida de hacer esto, pero la siguiente es mi solución y al menos no parece depender de coincidencias.

En el constructor mdi, maneje el cambio de tamaño:

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

Y luego esta anulación para manejar maximizar / restaurar eventos

    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);
    }

Los valores constantes se definen como:

    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;

Otros consejos

Podría hacer todo eso, o simplemente podría poner un me.refresh en el evento resize del MDI.

Llame al método PositionContainersToParentMiddle en el evento Resize de su formulario MDI. No lo he probado, pero debería funcionar. Es posible que tenga que poner condiciones en el evento Resize para detener el cambio de ubicación de la imagen en cada cambio de tamaño.

   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;
                       }
                  }
             }
          }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top