Мне нужно показать заставку в начале приложения в течение нескольких секунд. Кто-нибудь знает, как это реализовать?
Будем очень благодарны за помощь.
Мне нужно показать заставку в начале приложения в течение нескольких секунд. Кто-нибудь знает, как это реализовать?
Будем очень благодарны за помощь.
Во-первых, создайте свой заставку как безграничную, неподвижную форму с изображением на ней, настроенную на первоначальное отображение в центре экрана, по цвету, как вы хотите. Все это можно установить в дизайнере; в частности, вы хотите:
Затем вам нужно решить, где его показать и куда его отклонить. Эти две задачи должны выполняться с разных сторон основной логики запуска вашей программы. Это может быть в вашей программе main() приложения или, возможно, в вашей основной форме приложения Load handler; везде, где вы создаете большие дорогие объекты, читаете настройки с жесткого диска и обычно занимаете много времени, чтобы делать вещи за кулисами, пока не отобразится основной экран приложения.
Затем все, что вам нужно сделать, это создать экземпляр вашей формы, Show() и сохранить ссылку на него во время инициализации запуска. Как только ваша основная форма загрузится, закройте().
Если на вашем заставке будет отображаться анимированное изображение, окно должно быть также "двойным буфером", и вам нужно быть абсолютно уверенным, что вся логика инициализации происходит за пределами потока графического интерфейса (что означает, что вы не можете иметь основную логику загрузки в обработчике нагрузки mainform, вам нужно будет создать BackgroundWorker или какую-нибудь другую поточную процедуру.
В приведенном ниже примере из Telerik используется элемент управления ShapedForm, но измените его на обычную форму Windows. Это самый легкий и лучший способ, который я видел.
Ниже приведены некоторые ориентиры...
Отдайте это, и если вы застряли, вернитесь и задайте более конкретные вопросы, касающиеся ваших проблем.
простое и простое решение для создания заставки
теперь установите таймер в таймере:
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if (progressBar1.Value == 100) timer1.Stop();
}
добавьте новое имя использования формы "FORM-1" и используйте следующую команду в FORM 1.
Примечание. Форма всплеска работает до открытия формы1
добавить эту библиотеку
using System.Threading;
создать функцию
public void splash()
{
Application.Run(new splash());
}
используйте следующую команду при инициализации, как показано ниже.
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();
}
}
создать всплеск
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();
Другие ответы здесь хорошо освещены, но стоит знать, что в Visual Studio встроены функциональные возможности для экранов заставки. Если вы откроете свойства проекта для приложения формы Windows и посмотрите вкладку "Приложение", Опция "Заставка:" внизу. Вы просто выбираете, какую форму в своем приложении вы хотите отображать в качестве экрана заставки, и он позаботится о том, чтобы показывать его, когда приложение запускается и скрывается после отображения основной формы.
Вам все равно нужно настроить форму, как описано выше (с правильными границами, позиционированием, размером и т.д.).
В CodeProject есть Довольно хороший экран заставки.
Он поставляется с
Недавно автор просмотрел и обновил код. Это действительно очень полезная работа, и это сотрудничество между разными разработчиками с хорошими идеями.
Сначала вы должны создать форму с или без границы (для этих целей предпочтительнее использовать border-less)
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();
}
}
На Main вы должны использовать это
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashForm());
}
}
Мне нужен экран всплеска, который будет отображаться до тех пор, пока основная форма программы не будет готова к отображению, поэтому таймеры и т.д. Мне не нужны. Я также хотел, чтобы это было максимально простым. Мое приложение начинается с (сокращенно):
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;
}
Может быть, я что-то упустил, но это кажется намного проще, чем прореживание нитей и таймеров.
Может быть, немного поздно ответить, но я хотел бы поделиться своим путем. Я нашел простой способ с потоками в основной программе для приложения winform.
Допустим, у вас есть "splashscreen" вашей формы с анимацией и ваш "основной", который имеет весь ваш код приложения.
[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();
}
Таким образом, заставка будет длиться только для загрузки основной формы.
Форма вашего экрана должна иметь собственный способ анимации/отображения информации. В моем проекте мой заставку запускает новый поток, и каждые х миллисекунд он меняет основное изображение на другое, которое представляет собой немного другую передачу, дающую иллюзию вращения.
пример моего заставки:
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();
}
}
Надеюсь, это поможет некоторым людям. Извините, если я допустил некоторые ошибки. Английский не мой первый язык.
Попробуйте этот код
public partial class ssplashscreen : Form
{
public ssplashscreen()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if (progressBar1.Value == 100)
{
timer1.Stop();
this.Hide();
Form frm = new login();
frm.Show();
}
}
}
Попробуй это:
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();
}
}
}
}