6秒后,启动画面变为黑色

时间:2011-08-17 08:51:12

标签: c# winforms splash-screen

我有一个启动画面,当我从智能卡加载数据时,我正在使用它,因为我需要大约35秒来获取数据,我的加载屏幕有白色背景,我将TransparencyKey设置为白色以使屏幕透明。 它工作正常,但约6秒后,背面颜色变为黑色 这是加载屏幕的代码:

partial class LoadingForm : Form
{
    int tickcount = 0;
    public bool CloseIt = false;
    public string Message = "من فضلك إنتظر قليلا ...";
    public Point LocationPoint;
    public LoadingForm()
    {
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.DoubleBuffer, true);
        InitializeComponent();
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.DoubleBuffer, true);
        LocationPoint = new Point();
        LocationPoint.X = -300;
        LocationPoint.Y = -300;
        lblMessage.Text = Message;

    }

    private void LoadingForm_Load(object sender, EventArgs e)
    {
        Left = LocationPoint.X;
        Top = LocationPoint.Y;
        timer1.Start();

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (Created)
        {
            if (tickcount++ == 1)
            {
                LocationPoint.X = Screen.PrimaryScreen.Bounds.Width / 2 - 240;
                LocationPoint.Y = Screen.PrimaryScreen.Bounds.Height / 2 - 140;
                lblMessage.Text = Message;

                Left = LocationPoint.X;
                Top = LocationPoint.Y;
                Width = 480;
                Height = 185;
            }
            if (CloseIt)
            {
                pictureBox1.Image = null;
                Close();
                Application.ExitThread();
            }
        }
    }

    private void LoadingForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        timer1.Stop();
        timer1.Dispose();
    }
}

这是创建一个线程来运行表单的类:

public class LoadingProgress
{
    LoadingForm frm = new LoadingForm();
    string Message = "من فضلك إنتظر قليلا ...";
    Thread th;

    public void StartProgress()
    {
        th = new Thread(new ThreadStart(ShowForm));
        if (frm == null)
            frm = new LoadingForm();
        frm.Message = Message;
        th.Start();
    }

    public void Set_Message(string msg)
    {
        Message = msg;
        frm.Message = Message;
    }

    void ShowForm()
    {
        frm.ShowDialog();

        frm.Dispose();
        frm = null;

        if (th.ThreadState == ThreadState.Running)
            th.Abort();
    }

    public void Stop()
    {
        frm.CloseIt = true;
    }

    public void Set_Position(System.Drawing.Point p)
    {
        frm.LocationPoint = p;
    }
} 

2 个答案:

答案 0 :(得分:2)

这是猜测,但我认为你最好在主应用程序线程(消息泵所在的位置)上创建所有表单,并在单独的线程上旋转实际的工作

我的猜测是因为你的表单没有处理到windows事件(因为它在错误的线程上),Windows基本上将其标记为“没有响应”并停止进一步呈现它。

答案 1 :(得分:0)

Tick类上的System.Windows.Forms.Timer事件发生在UI线程上。这意味着如果你在tick方法中有长时间运行的代码,它将挂起应用程序重绘界面的能力。发生这种情况时,Windows可能会将其绘制为黑色。