加载之前的空白窗口

时间:2014-02-08 09:57:45

标签: c# window-load

如何在加载整个表单之前编写空白窗口like this?我试过在Window_Load和Window_Shown上拖动窗口上的白色图片框,但是没有用。有什么想法吗?

2 个答案:

答案 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设置为无