Frage

Ich habe ein MDI-Formular mit einem zentrierten Hintergrundbild.
Jedes Mal, wenn der Benutzer die Größe oder Zustand der Form ändert, wird das Bild nicht aktualisiert. Es bleibt in der alten Stelle (nicht mehr zentriert) und ist auch verloren, wenn das Formular zu klein gemacht wird.

Wie kann diese Situation korrekt gehandhabt werden?
Muss ich wirklich „This.Refresh ()“ in allen Event-Handler aufrufen bezogenen Größe und Zustand zu bilden?

Die Anwendung ist in .net 3.5SP1 C # mit Windows.Forms realisiert.

War es hilfreich?

Lösung

Leider es scheint nicht zu einem super-schnellen Weg, dies zu tun, aber die folgende ist meine Lösung und zumindest scheint nicht auf Zufälle angewiesen.

Im mdi Konstruktor Griff Größe ändern:

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

Und dann diese Überschreibung zu handhaben maximieren / wiederherstellen Ereignisse

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

Konstante Werte sind wie folgt definiert:

    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;

Andere Tipps

Sie könnten all das tun, oder Sie könnten nur einen me.refresh in der resize Veranstaltung MDI setzen.

Aufruf PositionContainersToParentMiddle Methode in Resize-Ereignis des MDI-Formular. Ich habe es nicht getestet, aber es sollte funktionieren. Sie könnten setzen Bedingungen in Resize-Ereignisse haben das Bild Standort Wechsel an jeder Größe ändern zu stoppen.

   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;
                       }
                  }
             }
          }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top