web-dev-qa-db-ja.com

Winform C#のポップアップウィンドウ

ポップアップウィンドウが必要なプロジェクトに取り組んでいます。しかし、問題は、フォームデザイナーを介してこのポップアップウィンドウにテキストボックスなどを追加できるようにしたいことです。

したがって、基本的にボタンがあり、それをクリックすると、フォームデザイナで設計した別のウィンドウが開きます。

私はいくつかのグーグルをやっていますが、まだ必要なものが見つかりませんでした。

22
Kevin

Visual Studioを使用して別のフォームを作成します(formPopupと呼びましょう)。ボタンハンドラーで次のコードを記述します。

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

非モーダルウィンドウが必要な場合は、formPopup.Show();を使用します。ダイアログが必要な場合(開いたフォームを閉じるまでこの呼び出しでコードがハングします)、次を使用します:formPopup.ShowDialog()

31
Piotr Stapp

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

少し試してみて、その位置とサイズをいじってみる必要があります。間違って使用すると何も表示されません。

6
Philip Stuyck

C#のフォームは、Form基本クラスを継承するクラスです。

クラスのインスタンスを作成し、ShowDialog()を呼び出すことにより、ポップアップを表示できます。

5
SLaks

ボタンがクリックされたときに新しいフォームを作成する場合、以下のコードが役に立つかもしれません。

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 を使用することもできます

3
Sean

「しかし、このポップアップウィンドウにフォームデザイナーを介してテキストボックスなどを追加できるようにしたいのです」

あなたが開発プロセスのどの段階にいるのか、あなたの説明からは明らかではありません。まだ理解していない場合は、クリックして新しいフォームを作成しますProject-> Add Windows Form、次に、フォームの名前を入力し、「追加」ボタンを押します。これで、期待どおりにコントロールをフォームに追加できます。

表示するときが来たら、他の投稿のアドバイスに従ってインスタンスを作成し、必要に応じてShow()またはShowDialog()を呼び出します。

1
Idle_Mind

私はこの方法を使用しています。

ポップアップしたいfromを追加し、必要なすべてのコントロールを追加します。コードでは、ユーザー入力を処理し、呼び出し元に結果を返すことができます。フォームをポップアップするには、フォームと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"); 
}
0
Benny Margalit