Пользовательское контекстное меню - PullRequest
7 голосов
/ 29 февраля 2012

Я хотел бы создать собственное контекстное меню. Идея состоит в том, чтобы создать панель с надписью textBox, кнопкой и списком меток и иметь возможность показывать ее по щелчку правой кнопкой мыши и вести себя точно так же, как contextMenu. Я, вероятно, могу использовать форму без границ, но я думал, что мог бы быть класс, из которого я мог бы извлечь, который помог бы мне управлять позиционированием контекстного меню и затенением. Есть идеи? Спасибо

Редактировать: пример, чтобы прояснить несколько идей: скажем, у вас есть метка на форме, когда вы щелкаете правой кнопкой мыши по ней (или даже левой кнопкой мыши), появляется меню. Это меню НЕ классическое контекстное меню, а пользовательская панель с элементами управления, которые я создал лично. Примером является окно поиска сверху со списком элементов. Когда вы вводите буквы, список обрезается до соответствующих элементов, и при щелчке по элементу контекстное меню исчезает, а выбранное значение записывается в метке, по которой мы впервые щелкнули.

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Вы можете использовать метод, описанный здесь:

http://www.codeproject.com/Articles/22780/Super-Context-Menu-Strip

Поскольку он использует ContextMenuStrip, вы можете установить его положение:

contextMenuStrip1.Show(Cursor.Position);

и эффект тени:

http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.hasdropshadow.aspx

4 голосов
/ 29 февраля 2012

Самый простой способ (поскольку это не выглядит как фактическое меню) состоит в том, чтобы создать форму без полей и добавить к ней тень:

public class ShadowForm : Form
{
    // Define the CS_DROPSHADOW constant
    private const int CS_DROPSHADOW = 0x00020000;

    // Override the CreateParams property
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }
}

Относительно позиции, в ней не так много,Просто проверьте Cursor.Position или задайте координаты, используя аргументы в вашем MouseUp обработчике событий.

Полный код будет выглядеть примерно так:

public partial class ParentForm : Form
{
    public ParentForm()
    {
        InitializeComponent();
    }

    protected override OnMouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            var menu = new CustomMenu();
            menu.Location = PointToScreen(e.Location);
            menu.Show(this);                
        }
    }
}

и для формы "меню":

public partial class CustomMenu : Form
{
    public CustomMenu()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.Manual;
    }

    private const int CS_DROPSHADOW = 0x00020000;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }

    protected override void OnLostFocus(EventArgs e)
    {
        this.Close();
        base.OnLostFocus(e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...