Płynne wysuwanie formy z dołu ekranu

0

Witam. Jestem początkujący jeśli chodzi o programowanie.
Chcę, aby moje okno wysuwało się płynnie z dołu ekranu przy tray'u. Sposób jaki na to wymyśliłem jest zapewne trochę prymitywny, ale o tym za chwilę.

Problem polega na tym, że gdy program ma wyświetlić formę i przesunąć ją, uwidacznia się tylko efekt końcowy. Nie widać jak forma się przesuwa, ale dopiero jak jest na miejscu. Próbowałem już zwiększyć opóźnienie, ale o dziwo to samo, tylko, że dłużej czekam na ten końcowy efekt. Jeśli jest taka możliwość to prosiłbym o wskazanie mi, co robię źle.

Kod poniżej:

public partial class AppForm : Form
    {
        
        int x, y, i;
        public AppForm()
        {
            InitializeComponent();

        }

        private void Loc()
        {
            
            x = Screen.PrimaryScreen.Bounds.Width - this.Width;
            y = Screen.PrimaryScreen.Bounds.Height - 30;
            this.Location = new Point(x, y);
            
            for (i = 0; i < 200; i++)
            {
                y = y - 1;
                this.Location = new Point(x, y);
                System.Threading.Thread.Sleep(2);
            }
        }

        private void Wysuw(int czas)
        {
            //for (i = 0; i < 5; i++)
            //{   
            //    y = y - 40;
            //    this.Location = new Point(x, y);
            //    System.Threading.Thread.Sleep(czas);
            //}
        }

        private void AppForm_Load(object sender, EventArgs e)
        {
            Loc();    
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;            
        }

    } 

Wcześniej starałem się to wykonać tworząc do tego metodę, ale, gdy zobaczyłem ten problem pomyślałem, że warto zacząć od wykonania tego w inny sposób. Z góry dziękuję :)

0
  1. Wstawiając kod stosuj znacznika danego języka, żeby kolorować składnię.
  2. Wywołujesz to w evencie ładowania się formy. Póki ten kod się nie skończy nie zostanie ona załadowana. Czyli efekt Twojego przesunięcia będziesz mógł zobaczyć dopiero po tym jak skończysz przesuwać.
0

Jeśli masz VS2012 lub nowsze, możesz zamiast Thread.Sleep użyć await Task.Delay.

A jeśli nie, to dodaj do formy Timer, i w jego evencie przesuwaj formę.

Ten pierwszy sposób jest łatwiejszy o tyle, że twój kod tylko nieznacznie się zmienia:

        private async Task Loc()
        {
            ...
            await Task.Delay(2);
            ...
        }

        private async void AppForm_Load(object sender, EventArgs e)
        {
            await Loc();
        }

(pisane z głowy, bo pod ręką mam tylko 2010).

1 użytkowników online, w tym zalogowanych: 0, gości: 1