【发布时间】:2011-08-31 16:14:58
【问题描述】:
我有一个表单,它本身有一些控件(btnCreateReport,pnlDarkLayer)。我有一个适合表单的面板(Dock = Fill),它位于所有控件的背面。当用户单击 btnCreateReport 按钮时,我调用 pnlDarkLayer BringToFront 方法,经过一些计算后,我调用按钮的 SendToBack() 方法。我想在表单控件上绘制一个深色层并禁用表单上的所有控件。 可能吗?谢谢。
也许这段代码可以帮助你理解我的目的:
private void btnCreateReport_Click(object sender, EventArgs e)
{
pnlDarkLayer.BackColor = Color.FromArgb(100, Color.Gray);
pnlDarkLayer.BringToFront();
btnCreateReport.Enabled = false;
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
pnlDarkLayer.SendToBack();
btnCreateReport.Enabled = true;
}
此代码隐藏了所有控件,但我不想隐藏窗体上的控件。我想在它们上绘制一个深色层。并且用户必须可以看到控件。 我需要一些类似不透明属性的表单来控制它们。
我已经测试过了:
pnlDarkLayer.CreateGraphics().CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceOver;
更新:我已经测试了这个:(使用表单而不是面板)
private void btnCreateReport_Click(object sender, EventArgs e)
{
btnCreateReport.Enabled = false;
frmProgress ProgressForm = new frmProgress();
ProgressForm.TopLevel = false;
ProgressForm.Parent = this;
ProgressForm.BringToFront();
this.Controls.Add(ProgressForm);
ProgressForm.Show();
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
ProgressForm.Close();
btnCreateReport.Enabled = true;
}
但我在表单中看不到 ProgressForm。
【问题讨论】:
-
除了与不透明度有关的任何事情之外,请不要使用那种循环调用
DoEvents。要么给ProcessingReport某种钩子,以便在它完成时调用一些代码,或者简单地将最后一段代码放在ProcessingReport方法的末尾,记住使用BeginInvoke以确保它在用户界面线程。在几乎所有情况下,您都应该避免使用Application.DoEvents。 -
那么线程完成工作后我该怎么做呢?
-
要禁用所有控件,您也可以尝试这样做:foreach (Controls in Controls){item.Enabled = false;}