【问题标题】:Popup window in winform c#winform c#中的弹出窗口
【发布时间】:2013-05-04 00:52:43
【问题描述】:

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

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

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

【问题讨论】:

  • 能否发一些示例代码让我们破译?
  • 你最好创建自己的表单来做你想做的事。

标签: c# winforms popup window


【解决方案1】:

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

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

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

【讨论】:

  • 代码 sn-p 中的注释应为://如果您需要非模态窗口
【解决方案2】:

这并不容易,因为 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);
    }
}

对它进行一些实验,你必须玩弄它的位置和大小。用错了,什么都不显示。

【讨论】:

  • 很好,这可以从 UserControl 继承还是会产生问题?覆盖 wm_mouseactivate 的目的是什么?最后一个问题,我可以使用 this.Activate() 来保持与 mono 的兼容性,还是因为这不是表单而无法工作? ty
  • 不了解用户控件,它本身已经从控件派生,因此具有除控件之外的其他特殊行为,但它可能会起作用。也从未在单声道上测试过,我不确定 dll 导入是否更具体。总之就是利用了底层的win32 api系统。
  • 我看到duplicate of this answer 有另一个问题。我希望不再有(它们几乎同时发布,这很可疑)。通常,您必须将问题作为该问题的副本进行近距离投票,而不是复制/粘贴您的答案
  • 我不确定这是否是操作人员想要的。而且由于这不被接受为答案,我认为我的假设是正确的。 op 意味着与弹出窗口不同。
【解决方案3】:

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

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

【讨论】:

    【解决方案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();
    }
    

    从这里,您还可以使用'Show Dialog' method

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        我正在使用这种方法。

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

        /* 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"); 
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多