我有一个启动画面,当我从智能卡加载数据时,我正在使用它,因为我需要大约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;
}
}
答案 0 :(得分:2)
这是猜测,但我认为你最好在主应用程序线程(消息泵所在的位置)上创建所有表单,并在单独的线程上旋转实际的工作
我的猜测是因为你的表单没有处理到windows事件(因为它在错误的线程上),Windows基本上将其标记为“没有响应”并停止进一步呈现它。
答案 1 :(得分:0)
Tick
类上的System.Windows.Forms.Timer
事件发生在UI线程上。这意味着如果你在tick方法中有长时间运行的代码,它将挂起应用程序重绘界面的能力。发生这种情况时,Windows可能会将其绘制为黑色。