30

我正在做一个需要弹出窗口的项目。但问题是我还希望能够通过表单设计器在这个弹出窗口中添加文本框等。

所以基本上我有一个按钮,当你点击它时,它会打开我在表单设计器中设计的另一个窗口。

我一直在做一些谷歌搜索,但我还没有找到我需要的东西,所以我希望你们能帮助我!

4

6 回答 6

40

formPopup只需使用 Visual Studio创建另一个表单(我们称之为)。在按钮处理程序中编写以下代码:

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

如果您需要非模态窗口,请使用:formPopup.Show();. 如果您需要一个对话框(因此您的代码将在此调用上挂起,直到您关闭打开的表单)使用:formPopup.ShowDialog()

于 2013-05-09T14:06:32.930 回答
8

这不是那么容易,因为在 Windows 窗体中基本上不支持弹出窗口。虽然 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);
    }
}

尝试一下,你必须玩弄它的位置和大小。使用错误,没有任何显示。

于 2015-05-03T19:26:23.547 回答
5

C# 中的表单是继承Form基类的类。

您可以通过创建类的实例并调用来显示弹出窗口ShowDialog()

于 2013-05-09T14:05:14.013 回答
3

如果您打算在单击按钮时创建一个新表单,则以下代码可能对您有用:

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();
}

从这里,您还可以使用“显示对话框”方法

于 2013-05-09T14:06:33.170 回答
1

“但问题是我还希望能够通过表单设计器在这个弹出窗口中添加文本框等。”

从您的描述中不清楚您处于开发过程的哪个阶段。如果您还没有弄清楚,要创建一个新表单,请单击Project --> Add Windows Form,然后输入名称表格并点击“添加”按钮。现在您可以按照您的预期将控件添加到您的表单中。

当需要显示它时,请按照其他帖子的建议创建一个实例并酌情调用 Show() 或 ShowDialog()。

于 2013-05-09T14:24:02.257 回答
1

我正在使用这种方法。

添加一个你想弹出的,添加你需要的所有控件。在代码中,您可以处理用户输入并将结果返回给调用者。对于弹出表单,只需创建表单的新实例并显示方法。

/* 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"); 
}
于 2015-06-16T21:27:00.090 回答