Pergunta

Eu tenho um formulário MDI uma imagem de fundo centrado com.
Cada vez que o usuário altera o tamanho ou estado de forma, a imagem não é atualizada em tudo. Ele permanece no antigo lugar (não centrado mais) e ainda é perdido quando o formulário é feito muito pequeno.

Como pode esta situação corretamente ser tratado?
Eu realmente tenho de chamar de "this.Refresh ()" em todos os manipuladores de eventos relacionados ao tamanho do formulário e do estado?

Aplicação é realizado em .net 3.5SP1 C # com Windows.Forms.

Foi útil?

Solução

Infelizmente não parece ser uma maneira super-rápida de fazer isso, mas a seguir é minha solução e, pelo menos não parece confiar em coincidências.

No construtor de MDI, alça de redimensionamento:

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

E então essa substituição para maximizar a alça / restore 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);
    }

Os valores constantes são definidas 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;

Outras dicas

Você poderia fazer tudo isso, ou você pode apenas colocar um me.refresh no evento resize do MDI.

método Chamada PositionContainersToParentMiddle em Resize evento do seu formulário MDI. Eu não testei, mas deve funcionar. Você pode ter que colocar condições no evento Resize para a paragem mudança localização Imagem em cada redimensionamento.

   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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top