Idee su come visualizzare una finestra di messaggio non modale come descrizione comandi

StackOverflow https://stackoverflow.com/questions/1017550

  •  06-07-2019
  •  | 
  •  

Domanda

Devo visualizzare una finestra di messaggio non modale ogni volta che un utente passa sopra una voce di menu. Non posso usare messagebox.show (...) perché è un modale. Quindi quello che ho fatto è stato creare un modulo di Windows separato e visualizzare il modulo utilizzando l'evento hover sulla voce di menu. Ho 2 problemi:

1) Quando viene visualizzato il modulo di Windows, il menu perde visibilità.
2) Il modulo di Windows non appare accanto alla voce di menu come farebbe una descrizione comandi.

Qualche idea su come potrei personalizzare la descrizione di un componente che lo farà apparire e agire come un modulo di Windows?

È stato utile?

Soluzione

Per rispondere al tuo secondo problema:

Se si imposta la proprietà form.StartPosition su FormStartPosition.Manual , è possibile posizionare il modulo sul cursore (ad esempio):

form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1);

Questo potrebbe aiutare anche con il tuo primo problema.

Se si desidera che il modulo si comporti come una descrizione comandi, se si aggiunge il seguente codice del gestore eventi potrebbe darsi che si desidera:

    private void Form_MouseLeave(object sender, EventArgs e)
    {
        // Only close if cursor actually outside the popup and not over a label
        if (Cursor.Position.X < Location.X || Cursor.Position.Y < Location.Y ||
            Cursor.Position.X > Location.X + Width - 1 || Cursor.Position.Y > Location.Y + Height - 1)
        {
            Close();
        }
    }

Questo spiega il -1 nell'impostazione della posizione del modulo. Assicura che il cursore si trovi effettivamente sul modulo quando viene visualizzato per la prima volta.

Altri suggerimenti

Poiché la classe Form è solo un wrapper per la finestra nativa, puoi utilizzare il seguente frammento per creare il tuo modulo popup, che sembra quasi una finestra di descrizione comandi:

public class PopupForm : Form
{
    private const int SWP_NOSIZE = 0x0001;
    private const int SWP_NOMOVE = 0x0002;
    private const int SWP_NOACTIVATE = 0x0010;

    private const int WS_POPUP = unchecked((int)0x80000000);
    private const int WS_BORDER = 0x00800000;

    private const int WS_EX_TOPMOST = 0x00000008;
    private const int WS_EX_NOACTIVATE = 0x08000000;

    private const int CS_DROPSHADOW = 0x00020000;

    private static readonly IntPtr HWND_TOPMOST = (IntPtr)(-1);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    public PopupForm()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
        Visible = false;
    }

    protected virtual void InitializeComponent()
    {
        FormBorderStyle = FormBorderStyle.None;
        StartPosition = FormStartPosition.Manual;
        ShowInTaskbar = false;
        BackColor = SystemColors.Info;

        // ...
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= WS_POPUP;
            cp.Style |= WS_BORDER;
            cp.ExStyle |= WS_EX_TOPMOST | WS_EX_NOACTIVATE;
            //if (Microsoft.OS.IsWinXP && SystemInformation.IsDropShadowEnabled)
            //    cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }

    protected override bool ShowWithoutActivation
    {
        get { return true; }
    }

    public new void Show()
    {
        SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);    
        base.Show();
    }

    public void Show(Point p)
    {
        Location = p;
        Show();
    }
}

Controlla questo modulo con i metodi Show () e Hide () dal codice esterno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top