在加载整个表单之前,如何编写一个像这样的空白窗口?我尝试在 Window_Load 和 Window_Shown 的窗口上拖动一个白色图片框,但没有成功。有任何想法吗?
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,因为需要重新创建和重新绘制窗口,这会再次使其变慢。
我制作了一个自定义窗口,因此当它显示时,它会显示为具有自定义外观的消息框,并且在加载完成后,我会像这样关闭此窗口
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 设置为 none