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を非表示にする継承されたフォームインスタンスを使用することもできます。次に、現在のフォームを除くすべてのフォームを無効/有効にすることができます。ダミーフォームのコードは、ここで説明する問題に対処するためのものです。 フォームアクティブ化イベントを発生させることができません-無効化されたフォームで問題が発生します

このアプローチの利点の1つは、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 に答える