Всплывающее окно в winform С#

Я работаю над проектом, где мне нужно всплывающее окно. Но дело в том, что я также хочу иметь возможность добавлять текстовые поля и т.д. В это всплывающее окно через конструктор форм.

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

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

Ответы

Ответ 1

Просто создайте другую форму (давайте назовем ее FormPopoup) с помощью Visual studio. В обработчике кнопок напишите код followng:

var form = new FormPopoup();
form.Show(this); // if you need non-modal window

Если вам нужно использовать немодальное окно: form.Show();. Если вам нужен диалог (так что ваш код будет зависать в этом вызове до закрытия открытой формы), используйте: form.ShowDialog()

Ответ 2

Формы в С# - это классы, наследующие базовый класс Form.

Вы можете показать всплывающее окно, создав экземпляр класса и вызвав ShowDialog().

Ответ 3

Это не так просто, потому что всплывающие окна не поддерживаются в формах Windows. Хотя формы окон основаны на win32 и в win32 всплывающие окна поддерживаются. Если вы примете несколько трюков, следующий код заставит вас всплывать. Вы решаете, хотите ли вы использовать его хорошо:

class PopupWindow : Control
{
    private const int WM_ACTIVATE = 0x0006;
    private const int WM_MOUSEACTIVATE = 0x0021;

    private Control ownerControl;

    public PopupWindow(Control ownerControl)
        :base()
    {
        this.ownerControl = ownerControl;
        base.SetTopLevel(true);
    }

    public Control OwnerControl
    {
        get
        {
            return (this.ownerControl as Control);
        }
        set
        {
            this.ownerControl = value;
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;

            createParams.Style = WindowStyles.WS_POPUP |
                                 WindowStyles.WS_VISIBLE |
                                 WindowStyles.WS_CLIPSIBLINGS |
                                 WindowStyles.WS_CLIPCHILDREN |
                                 WindowStyles.WS_MAXIMIZEBOX |
                                 WindowStyles.WS_BORDER;
            createParams.ExStyle = WindowsExtendedStyles.WS_EX_LEFT |
                                   WindowsExtendedStyles.WS_EX_LTRREADING |
                                   WindowsExtendedStyles.WS_EX_RIGHTSCROLLBAR | 
                                   WindowsExtendedStyles.WS_EX_TOPMOST;

            createParams.Parent = (this.ownerControl != null) ? this.ownerControl.Handle : IntPtr.Zero;
            return createParams;
        }
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr SetActiveWindow(HandleRef hWnd);

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_ACTIVATE:
                {
                    if ((int)m.WParam == 1)
                    {
                        //window is being activated
                        if (ownerControl != null)
                        {
                            SetActiveWindow(new HandleRef(this, ownerControl.FindForm().Handle));
                        }
                    }
                    break;
                }
            case WM_MOUSEACTIVATE:
                {
                    m.Result = new IntPtr(MouseActivate.MA_NOACTIVATE);
                    return;
                    //break;
                }
        }
        base.WndProc(ref m);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(SystemBrushes.Info, 0, 0, Width, Height);
        e.Graphics.DrawString((ownerControl as VerticalDateScrollBar).FirstVisibleDate.ToLongDateString(), this.Font, SystemBrushes.InfoText, 2, 2);
    }
}

Поэкспериментируйте с ним немного, вам нужно поиграть со своим положением и его размером. Используйте его неправильно, и ничего не отображается.

Ответ 4

Если вы хотите создать новую форму при нажатии кнопки, код ниже может вам пригодиться:

private void settingsButton_Click(Object sender, EventArgs e)
{
    // Create a new instance of the Form2 class
    Form2 settingsForm = new Form2();

    // Show the settings form
    settingsForm.Show();
}

Здесь вы также можете использовать метод "Показать диалог"

Ответ 5

"Но дело в том, что я также хочу иметь возможность добавлять текстовые поля и т.д. в это всплывающее окно через конструктор форм".

Это неясно из вашего описания на каком этапе процесса разработки вы находитесь. Если вы еще не поняли это, чтобы создать новую форму, нажмите Проект → Добавить Windows Form, затем введите имя для формы и нажмите кнопку "Добавить". Теперь вы можете добавить элементы управления в свою форму, как и следовало ожидать.

Когда придет время для его отображения, следуйте советам других сообщений, чтобы создать экземпляр, и вызовите Show() или ShowDialog(), если это необходимо.

Ответ 6

Я использую этот метод.

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

/* create new form instance. i am overriding constructor to allow the caller form to set the form header */ 
var t = new TextPrompt("Insert your message and click Send button");
// pop up the form
t.Show();
if (t.DialogResult == System.Windows.Forms.DialogResult.OK)
{ 
  MessageBox.Show("RTP", "Message sent to user"); 
}