Как правильно обрабатывать центрированное фоновое изображение формы MDI - PullRequest
0 голосов
/ 14 сентября 2009

У меня есть форма MDI с центрированным фоновым изображением.
Каждый раз, когда пользователь изменяет размер или состояние формы, изображение вообще не обновляется. Он остается на старом месте (больше не по центру) и даже теряется, когда форма становится слишком маленькой.

Как правильно решить эту ситуацию?
Действительно ли мне нужно вызывать this.Refresh () во всех обработчиках событий, связанных с размером и состоянием формы?

Приложение реализовано в .net 3.5SP1 C # с Windows.Forms.

Ответы [ 5 ]

2 голосов
/ 23 декабря 2009

К сожалению, кажется, что не существует сверхбыстрого способа сделать это, но следующее - мое решение, и, по крайней мере, кажется, не основано на совпадениях.

В конструкторе mdi измените размер ручки:

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

И затем это переопределение для обработки событий максимизации / восстановления

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

Постоянные значения определяются как:

    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;
1 голос
/ 14 января 2010

Вы можете сделать все это, или вы можете просто вставить me.refresh в событие MDI resize.

0 голосов
/ 22 марта 2015
    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;
                       }
                  }
             }
          }
0 голосов
/ 19 июля 2013
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    Me.BackgroundImage = My.Resources.YourBackgroundImageName
    Me.Refresh()
 End Sub
0 голосов
/ 14 сентября 2009

Вызовите метод PositionContainersToParentMiddle в событии Resize вашей формы MDI. Я не проверял это, но это должно работать. Возможно, вам придется поместить условия в событие «Изменить размер», чтобы остановить изменение местоположения изображения при каждом изменении размера.

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

    }
...