1

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

从我自己的研究来看,这样做的方法似乎是打开一个黑色背景和不透明度小于 100% 的无边界表单,但我还没有把所有的部分放在一起,它是如何工作的,或者它是否是最好的方法.

任何的意见都将会有帮助。谢谢。

4

3 回答 3

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...
            }
        }
    }

调整 Opacity 和 BackColor 属性以调整效果。它适用于任何类型的对话框,包括 OpenFileDialog 等内置对话框,以及应用程序中的任何打开表单集。请注意,Application.OpenForms 有点错误。

于 2012-04-28T15:27:25.883 回答
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();

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

希望这可以帮助!

于 2012-04-28T10:20:41.473 回答
0

这种方法的一种替代方法是使用一个继承的表单实例,它隐藏了 showDialog。然后,您可以禁用/启用当前表单栏的所有表单。虚拟表单的代码用于处理此处描述的问题; 无法触发表单激活事件 - 禁用表单的问题

这种方法的优点之一是它不需要更改 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;
    }
}
于 2017-05-14T03:47:29.793 回答