winform中的弹出窗口c#

Kev*_*vin 22 c# window popup winforms

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

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

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

Pio*_*app 31

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

var formPopup = new Form();
formPopup.Show(this); // if you need non-modal window
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*yck 6

这并不容易,因为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 5

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

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