Как построить заставку в приложении Windows Forms? - PullRequest
56 голосов
/ 31 октября 2011

Мне нужно показать заставку на старте моего приложения в течение нескольких секунд. Кто-нибудь знает, как это реализовать?

Буду очень признателен за помощь.

Ответы [ 11 ]

76 голосов
/ 31 октября 2011

Во-первых, создайте заставку в виде неподвижной неподвижной формы с изображением на ней, изначально настроенной на отображение в центре экрана и окрашенной так, как вы хотите.Все это может быть установлено в дизайнере;в частности, вы хотите:

  • Установить для свойств формы ControlBox, MaximizeBox, MinimizeBox и ShowIcon значение «False»
  • Установить для свойства StartPosition значение «CenterScreen»
  • Установите для свойства FormBorderStyle значение «Нет»
  • Установите для MinimumSize и MaximumSize формы значение, равное ее начальному размеру.

Затем необходимо решить, где и где его показать.отклонить это.Эти две задачи должны выполняться на противоположных сторонах основной логики запуска вашей программы.Это может быть в подпрограмме main () вашего приложения или, возможно, в обработчике загрузки основной формы приложения;где бы вы ни создавали большие дорогие объекты, читали настройки с жесткого диска и, как правило, занимали много времени за кулисами, пока не появился главный экран приложения.

Затем все, что вам нужно сделать, это создатьэкземпляр вашей формы, Show (), и сохраните ссылку на него во время инициализации при запуске.Как только ваша основная форма загрузится, закройте ее ().

Если на вашем заставке будет анимированное изображение, окно также должно быть «с двойной буферизацией», и вам нужно будетабсолютно уверен, что вся логика инициализации происходит вне потока GUI (то есть у вас не может быть основной логики загрузки в обработчике загрузки основной формы; вам нужно будет создать BackgroundWorker или какую-либо другую потоковую подпрограмму.

7 голосов
/ 31 октября 2011

Вот несколько рекомендаций ...

  1. Создание формы без полей (это будет ваш заставка)
  2. При запуске приложения запустить таймер (с интервалом в несколько секунд)
  3. Показать всплеск
  4. При событии Timer.Tick, остановке таймера и закрытии формы Splash - затем покажите основную форму приложения

Дайте ему знать, и если вы застряли, вернитесь и задайте более конкретные вопросы, касающиеся ваших проблем

5 голосов
/ 09 сентября 2015

простое и удобное решение для создания заставки

  1. откройте новую форму, используйте имя "SPLASH"
  2. измените фоновое изображение, как хотите
  3. выберите индикатор выполнения
  4. выберите таймер

теперь установите отметку таймера в таймере:

private void timer1_Tick(object sender, EventArgs e)
{
    progressBar1.Increment(1);
    if (progressBar1.Value == 100) timer1.Stop();        
}

добавьте новую форму, используйте имя «ФОРМА-1» и используйте следующую команду в ФОРМЕ 1.

примечание: всплывающая форма работает до открытия формы1

  1. добавить эту библиотеку

    using System.Threading;
    
  2. создать функцию

    public void splash()
    {     
        Application.Run(new splash());
    }
    
  3. используйте следующую команду при инициализации, как показано ниже.

    public partial class login : Form
    {     
        public login()
        {
            Thread t = new Thread(new ThreadStart(splash));
            t.Start();
            Thread.Sleep(15625);
    
            InitializeComponent();
    
            enter code here
    
            t.Abort();
        }
    }
    

http://solutions.musanitech.com/c-create-splash-screen/

3 голосов
/ 17 июля 2014

Есть Довольно хороший экран-заставка на CodeProject.

Поставляется с

  • Fade In
  • Индикатор выполнения
  • Метка состояния
  • Исчезает
  • Двойной щелчок, чтобы уволить

Автор недавно прошел и обновил код. Это действительно довольно сложная работа, в которой участвуют разные разработчики с хорошими идеями.

2 голосов
/ 06 мая 2014

Другие ответы здесь охватывают это хорошо, но стоит знать, что в Visual Studio есть встроенная функциональность для заставок: если вы откроете свойства проекта для приложения формы Windows и посмотрите на вкладку «Приложение», появится Опция "Заставка:" внизу. Вы просто выбираете, какую форму в своем приложении вы хотите отобразить в качестве заставки, и он позаботится о том, чтобы показывать ее при запуске приложения и скрывать ее после отображения основной формы.

Вам все еще нужно настроить форму, как описано выше (с правильными границами, расположением, размером и т. Д.)

2 голосов
/ 11 сентября 2012

создать всплеск

private void timer1_Tick(object sender, EventArgs e)
{
    counter++;
    progressBar1.Value = counter *5;
    // label2.Text = (5*counter).ToString();
    if (counter ==20)
    {
        timer1.Stop();
        this.Close();
    }
}
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.ClientSize = new System.Drawing.Size(397, 283);
this.ControlBox = false;
this.Controls.Add(this.label2);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.label1);
this.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Splash";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.ResumeLayout(false);
this.PerformLayout();

Тогда в вашем приложении

sp = new Splash();
sp.ShowDialog();
1 голос
/ 06 сентября 2018

Я хотел, чтобы экран-заставка отображался до тех пор, пока форма основной программы не была готова для отображения, поэтому таймеры и т. Д. Были для меня бесполезны. Я также хотел сделать это как можно более простым. Моя заявка начинается с (сокращенно):

static void Main()
{
    Splash frmSplash = new Splash();
    frmSplash.Show();
    Application.Run(new ReportExplorer(frmSplash));
}

Тогда ReportExplorer имеет следующее:

public ReportExplorer(Splash frmSplash)
{
    this.frmSplash = frmSplash;
    InitializeComponent();
}

Наконец, после завершения инициализации:

if (frmSplash != null) 
{
     frmSplash.Close();
     frmSplash = null;
}

Может быть, я что-то упускаю, но это кажется намного проще, чем копаться с потоками и таймерами.

1 голос
/ 31 октября 2011

Сначала вы должны создать форму с границей или без нее (для этих целей предпочтительнее использовать без рамки)

public class SplashForm : Form
{
    Form _Parent;
    BackgroundWorker worker;
    public SplashForm(Form parent)
    {
         InitializeComponent();
         BackgroundWorker worker = new BackgroundWorker();
         this.worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.worker _DoWork);
         backgroundWorker1.RunWorkerAsync();
         _Parent = parent;
    }
    private void worker _DoWork(object sender, DoWorkEventArgs e)
    {
         Thread.sleep(500);
         this.hide();
         _Parent.show();
    }     
}

В основном вы должны использовать эту строку

   static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new SplashForm());
            }
        }
0 голосов
/ 03 декабря 2018

Может быть, немного поздно, чтобы ответить, но я хотел бы поделиться своим путем.Я нашел простой способ с потоками в основной программе для приложения winform.

Допустим, у вас есть форма "заставка" с анимацией и ваша "главная", в которой есть весь код приложения.

 [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Thread mythread;
        mythread = new Thread(new ThreadStart(ThreadLoop));
        mythread.Start();
        Application.Run(new MainForm(mythread));           
    }

    public static void ThreadLoop()
    {
        Application.Run(new SplashScreenForm());           
    }

В вашей главной форме в конструкторе:

 public MainForm(Thread splashscreenthread)
    {
        InitializeComponent();

        //add your constructor code

        splashscreenthread.Abort();            
    }

Таким образом, заставка будет работать только время загрузки вашей главной формы.

Ваша форма заставки должна иметьего собственный способ анимировать / отображать информацию.В моем проекте мой экран-заставка запускает новый поток, и каждые x миллисекунд он меняет свою основную картинку на другую, которая немного отличается, создавая иллюзию вращения.

пример моего экрана-заставки:

int status = 0;
private bool IsRunning = false;
    public Form1()
    {
        InitializeComponent();
        StartAnimation();
    }

    public void StartAnimation()
    {
        backgroundWorker1.WorkerReportsProgress = false;
        backgroundWorker1.WorkerSupportsCancellation = true;
        IsRunning = true;
        backgroundWorker1.RunWorkerAsync();
    }


    public void StopAnimation()
    {
        backgroundWorker1.CancelAsync();
    }

    delegate void UpdatingThreadAnimation();
    public void UpdateAnimationFromThread()
    {

        try
        {
            if (label1.InvokeRequired == false)
            {
                UpdateAnimation();
            }
            else
            {
                UpdatingThreadAnimation d = new UpdatingThreadAnimation(UpdateAnimationFromThread);
                this.Invoke(d, new object[] { });
            }
        }
        catch(Exception e)
        {

        }
    }

 private void UpdateAnimation()
    {
    if(status ==0) 
    {
    // mypicture.image = image1
     }else if(status ==1)
     {
    // mypicture.image = image2
     }
    //doing as much as needed

      status++;
        if(status>1) //change here if you have more image, the idea is to set a cycle of images
        {
            status = 0;
        }
        this.Refresh();
    }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        while (IsRunning == true)
        {
            System.Threading.Thread.Sleep(100);
            UpdateAnimationFromThread();
        }
    }

Надеюсь, это поможет некоторым людям.Извините, если я сделал несколько ошибок.Английский не мой родной язык.

0 голосов
/ 16 августа 2018

Попробуйте:

namespace SplashScreen
{
    public partial class frmSplashScreen : Form
    {
        public frmSplashScreen()
        {
            InitializeComponent();
        }

        public int LeftTime { get; set; }

        private void frmSplashScreen_Load(object sender, EventArgs e)
        {
            LeftTime = 20;
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (LeftTime > 0)
            {
                LeftTime--;
            }
            else
            {
                timer1.Stop();
                new frmHomeScreen().Show();
                this.Hide();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...