web-dev-qa-db-fra.com

Fenêtre contextuelle dans winform c #

Je travaille sur un projet pour lequel j'ai besoin d'une fenêtre contextuelle. Mais le fait est que je souhaite également pouvoir ajouter des zones de texte, etc., dans cette fenêtre contextuelle via le concepteur de formulaire.

Donc, fondamentalement, j'ai un bouton et lorsque vous cliquez dessus, une autre fenêtre que j'ai créée dans le concepteur de formulaire s'ouvrira.

Je suis en train de googler mais je n'ai pas encore trouvé ce dont j'avais besoin, alors j'espérais que vous pourriez m'aider!

20
Kevin

Créez simplement un autre formulaire (appelons-le FormPopoup) à l'aide de Visual studio. Dans le gestionnaire de boutons, écrivez le code suivant:

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

Si vous avez besoin d'une fenêtre non modale, utilisez: form.Show();. Si vous avez besoin d'une boîte de dialogue (votre code sera bloqué sur cette invocation jusqu'à ce que vous fermiez le formulaire ouvert), utilisez: form.ShowDialog()

29
Piotr Stapp

Ce n'est pas si facile car, fondamentalement, les fenêtres contextuelles ne sont pas prises en charge. Bien que les formulaires Windows soient basés sur win32 et que les popups win32 soient supportés . Si vous acceptez quelques astuces, le code suivant vous configurera avec un popup Vous décidez si vous voulez le mettre à profit:

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

Expérimentez-le un peu, vous devez jouer avec sa position et sa taille. Utilisez-le mal et rien ne se voit.

6
Philip Stuyck

Les formulaires en C # sont des classes qui héritent de la classe de base Form.

Vous pouvez afficher une fenêtre contextuelle en créant une instance de la classe et en appelant ShowDialog().

5
SLaks

Si vous voulez créer un nouveau formulaire lorsque vous cliquez sur un bouton, le code ci-dessous peut vous être utile:

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

À partir de là, vous pouvez également utiliser la méthode 'Show Dialog'

3
Sean

"Mais le fait est que je souhaite également pouvoir ajouter des zones de texte, etc., dans cette fenêtre contextuelle via le concepteur de formulaire."

Si vous ne l’avez pas encore compris, vous créez un nouveau formulaire en cliquant sur Projet -> Ajouter un formulaire Windows , puis tapez un nom pour le formulaire et cliquez sur le bouton "Ajouter". Vous pouvez maintenant ajouter des contrôles à votre formulaire comme vous le souhaitiez.

Lorsque vient le temps de l'afficher, suivez les conseils des autres publications pour créer une instance et appelez Show () ou ShowDialog () selon le cas.

1
Idle_Mind

j'utilise cette méthode.

ajoutez un élément à afficher, ajoutez tous les contrôles nécessaires .. dans le code, vous pouvez gérer la saisie de l'utilisateur et renvoyer le résultat à l'appelant méthode de forme et d'exposition.

/* 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