Вопрос по .net – Затемнение неактивных форм

1

При открытии диалоговой формы с помощью Form.ShowDialog () я хочу затемнить остальную часть приложения с оттенком серого.

Из моего собственного исследования кажется, что способ сделать это состоит в том, чтобы открыть форму без полей с черным фоном и непрозрачностью менее 100%, но я не собрал все части вместе, как это будет работать, или если это лучший способ сделай это.

Любые предложения будут полезны. Благодарю.

Ваш Ответ

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 - небольшая ошибка.

Спасибо, это оно. Есть ли ссылка для - чуть-чуть глючит? Nezreli
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();

Что будет перерисовывать форму, все элементы управления останутся прежними, но серый исчезнет.

Надеюсь это поможет!

Например, при щелчке по окнам выключения весь экран будет затемнен, когда вас спросят, хотите ли вы выключить, перезапустить или выйти из системы. Nezreli
@Nezreli Если вы воспользуетесь приведенным выше кодом, приложение станет серым, я не уверен, что вы пытаетесь сделать, кроме этого.
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;
    }
}

Похожие вопросы