Location und Width einer WinForm in einem atomic step ändern



  • Hallo!

    Bin gerade dabei ein Autoresize für eine WinForm zu schreiben.
    D.h. Wenn ich den Mauszeiger aus der Winform bewege resized die Winform zu einem schmalen Balken. Fahre ich mit der Maus erneut über diesen Balken wird die Form wieder in der Ursprünglichen Größe angezeigt.
    Aber am besten schaut ihr es euch mal selber an(animated gif):
    http://farm3.static.flickr.com/2665/3820012919_9b65e58553_o.gif
    Das ganze wird mit einem Speed von 40% angezeigt, damit ist auch das Flickern schön zu sehen.

    Und hier der Code dazu:

    private void PropertyForm_MouseLeave(object sender, EventArgs e)
    {
    
        Point ptCursor = Cursor.Position;
        ptCursor = PointToClient(ptCursor);
        if (!ClientRectangle.Contains(ptCursor))
        {
            if (this._AutoHide)
            {
                this.ResizeBox.Visible = false;
                this.Location = new Point(this.Location.X + (this.Width - this._AutoHideWidth), this.Location.Y);
                this.Width = this._AutoHideWidth;
                ParentC.Focus();
            }
        }
    
    }
    
    private void PropertyForm_MouseEnter(object sender, EventArgs e)
    {
        if (this.Width == this._AutoHideWidth)
        {
            this.Width = this._OldWidth;
            this.Location = new Point(this.Location.X - (this.Width - this._AutoHideWidth), this.Location.Y);
            this.ResizeBox.Visible = true;
            this.Focus();
        }
    }
    

    Wie kann ich es machen dass Width und Location in einem atomic step geändert werden ohne das dazwischen das Bild erneuert wird.

    mit SuspendLayout und ResumeLayout gehts nicht.->http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/b8633a9f-2c55-41ca-8872-0e28b1400e86



  • Control.SetBounds?



  • Danke das hilft, auf jedenfall besser als vorher, fast kein flickern mehr zu sehen.
    Habe jetzt aber noch vor dem Ändern Visible auf false gesetzt und danach wieder auf true.

    this.Visible = false;
    this.ResizeBox.Visible = false;
    this.SetBounds(this.Location.X + (this._OldWidth - this._AutoHideWidth), this.Location.Y, this._AutoHideWidth, this.Height);               
    this.Visible = true;
    

    Nun ist überhaupt kein flickern mehr zu sehen.
    Danke noch mal für deine Hilfe! Lg THE_ONE


Anmelden zum Antworten