调暗不活动的表格

时间:2012-04-28 09:55:58

标签: .net winforms

使用Form.ShowDialog()打开Dialog表单时,我想用灰色阴影调暗应用程序的其余部分。

从我自己的研究看来,这样做的方法似乎是打开一个黑色背景和不透明度低于100%的无边框形式,但我没有将所有部分放在一起如何工作或者它是最好的方式去做吧。

任何建议都会有所帮助。 感谢。

3 个答案:

答案 0 :(得分:5)

最好通过将打开的表单与另一个无边框且大小相同的表单重叠来完成。这允许您确保禁用整个表单,包括控件和标题栏。在项目中添加一个新类并粘贴此代码:

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

class DialogOverlay : IDisposable {
    public DialogOverlay() {
        var cnt = Application.OpenForms.Count;
        for (int ix = 0; ix < cnt; ++ix) {
            var form = Application.OpenForms[ix];
            var overlay = new Form { Location = form.Location, Size = form.Size, FormBorderStyle = FormBorderStyle.None,
                ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, AutoScaleMode = AutoScaleMode.None };
            overlay.Opacity = 0.3;
            overlay.BackColor = Color.Gray;
            overlay.Show(form);
            forms.Add(overlay);
        }
    }
    public void Dispose() {
        foreach (var form in forms) form.Close();
    }
    private List<Form> forms = new List<Form>();
}

并像这样使用它:

    private void DialogButton_Click(object sender, EventArgs e) {
        using (new DialogOverlay()) 
        using (var dlg = new Dialog()) {
            if (dlg.ShowDialog(this) == DialogResult.OK) {
                // etc...
            }
        }
    }

调整“不透明度”和“BackColor”属性以调整效果。它适用于任何类型的对话框,包括OpenFileDialog等内置对象,以及应用程序中的任何开放表单集。请注意Application.OpenForms是一个小小的错误。

答案 1 :(得分:0)

我不确定你的“应用程序的其余部分”是什么意思,但我会告诉你如何使用不透明度小于100%的灰色阴影为应用程序着色。

代码(我假设你正在使用c#):

Graphics g = this.CreateGraphics(); // Creating graphics for this form.
g.FillRectangle(Color.FromArgb(80, 102, 90, 95), 0, 0, this.Width, this.Height); 
// Draws a gray rectangle with an opacity of 30% over the whole form.

然后摆脱你可以使用的灰色矩形:

this.Invalidate();

将重绘表单,所有控件都保持不变,但灰色会消失。

希望这有帮助!

答案 2 :(得分:0)

此方法的替代方法是使用隐藏showDialog的继承表单实例。然后,您可以禁用/启用所有表单栏当前的表单。虚拟表单的代码是处理此处描述的问题; Cannot fire form activate event - issue with disabled forms

这种方法的一个优点是它不需要改变showDialog方法的正常处理。就这样称呼它;

if (dlg.ShowDialog(this) == DialogResult.OK) {
            // etc...
        }

以您的继承形式

public abstract class MyBaseForm : XtraForm
{
    private DialogResult setFormsToBackground(Form fParent)
    {
        Form dummyForm = new Form();
        dummyForm.ShowInTaskbar = false;
        dummyForm.FormBorderStyle = FormBorderStyle.None;
        dummyForm.Load += ((object sender, EventArgs e) => { (sender as Form).Size = new Size(0, 0); });

        List<Form> lstFormsToEnable = new List<Form>();
        for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
        {
            try
            {
                Form checkfrm = Application.OpenForms[i];
                if (checkfrm != this && dummyForm != this && checkfrm.Enabled)
                {
                    lstFormsToEnable.Add(checkfrm);
                    checkfrm.Enabled = false;
                }
            }
            catch (Exception ex)
            {

            }
        }
        dummyForm.Show();
        DialogResult result = DialogResult.None;
        if (fParent == null) result = base.ShowDialog();
        else result = base.ShowDialog(fParent);
        for (int i = lstFormsToEnable.Count - 1; i >= 0; i--)
        {
            try
            {
                Form checkfrm = Application.OpenForms[i];
                checkfrm.Enabled = true;
            }
            catch (Exception ex)
            {

            }
        }
        dummyForm.Close();
        return result;
    }
}