如何在加载整个表单之前编写空白窗口like this?我试过在Window_Load和Window_Shown上拖动窗口上的白色图片框,但是没有用。有什么想法吗?
答案 0 :(得分:2)
Windows使用画家的算法绘制,它从后面到前面。所以你的PictureBox技巧无法工作,因为它是最后一个被绘制的。技术术语是它在Z顺序中最高。使它在Z顺序中最低也不起作用,它不再涵盖缓慢的控制。
尝试覆盖控件一般不会起作用,移除封面强制控件重新绘制自己,你会再次看到慢速重绘。从技术上讲,您可以使用其他无边框格式覆盖它,但这不适用于较旧的Windows版本或已关闭Aero的版本。
你还需要另一个技巧,仍然可以控制绘画,但不要让用户看到它。使用Opacity属性轻松完成。像这样:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.Opacity = 0;
}
protected override void OnShown(EventArgs e) {
this.Update();
this.Opacity = 0.99;
base.OnShown(e);
}
}
你的窗户当然不会更快出现,但它现在会卡在屏幕上,给人以速度的感觉。不要错误地将不透明度分配更改为1.0,这会使其再次变慢,因为窗口需要重新创建和重新绘制。
答案 1 :(得分:1)
我已经创建了一个自定义窗口,所以当它出现时它会显示为带有自定义外观的消息框,当加载完成时我会关闭此窗口
CMessageBox cmb = new CMessageBox("Loading...");
cmb.Show(this);
//Do the heavy work here
//after the heavy work finish call cmb.close()
cmb.Close();
当然cmb是你必须自己制作的自定义窗口
实际上它只是一个表格,我已经删除了它的边框,并在中间给它“加载”文字!
好的我会添加自定义表单的代码
创建新表单并将此代码添加到其中
public CMessageBox(string message)
{
InitializeComponent();
this.lblMessage.Text = message;
}
private void CMessageBox_Load(object sender, EventArgs e)
{
this.lblMessage.Top = (this.Height - this.lblMessage.Height) / 2;
this.lblMessage.Left = (this.Width - this.lblMessage.Width) / 2;
}
private void lblMessage_TextChanged(object sender, EventArgs e)
{
this.lblMessage.Top = (this.Height - this.lblMessage.Height) / 2;
this.lblMessage.Left = (this.Width - this.lblMessage.Width) / 2;
this.Refresh();
}
public string _Caption
{
get { return this.lblMessage.Text; }
set { this.lblMessage.Text = value; }
}
之后你就像我在开头给你看的那样打电话给你。
我已经设置了窗口,因此它只有一个小的宽度和高度来包含消息,如果你想改变它,你可以忽略这两个事件
private void CMessageBox_Load(object sender, EventArgs e)
{
this.lblMessage.Top = (this.Height - this.lblMessage.Height) / 2;
this.lblMessage.Left = (this.Width - this.lblMessage.Width) / 2;
}
private void lblMessage_TextChanged(object sender, EventArgs e)
{
this.lblMessage.Top = (this.Height - this.lblMessage.Height) / 2;
this.lblMessage.Left = (this.Width - this.lblMessage.Width) / 2;
this.Refresh();
}
您需要在设计中添加标签并为其命名lblMessage,您还需要将BorderStyle设置为无