Блокировать движение курсора мыши только в элементе управления

У меня есть графический блок, который я рисую на нем, используя растровое изображение (загружая растровое изображение как изображение в виде изображения после каждого изменения рисунка). Теперь у меня есть кнопка "Добавить заметку". эта кнопка находится где-то в mainForm. Я хочу, чтобы, когда пользователь нажимал на эту кнопку, указатель мыши переходил в элемент управления Picture box и не выходил из него, если пользователь не щелкнул внутри элемента управления или не нажал клавишу Escape. Это возможно?

Я использую этот код в данный момент:

    private void buttonAddNote_Click(object sender, EventArgs e)
    {
        Cursor = Cursors.Cross;
    }

Или лучше подходить к этому времени, когда пользователь нажимает кнопку добавления заметки, щелчки мыши работают только внутри компонента picture box (пользователь IE не может щелкнуть где-либо еще в программе)

2 ответа

Решение

Подобная модальность в пользовательском интерфейсе довольно плохая идея. Но Winforms делает это возможным. Вы можете использовать свойство Cursor.Clip, чтобы ограничить движение. Это не может помешать пользователю по-прежнему получать доступ, скажем, к меню "Пуск" с помощью сочетания клавиш, вам нужно использовать свойство Capture, чтобы определить, что вы потеряли.

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        pictureBox1.MouseCaptureChanged += new EventHandler(pictureBox1_MouseCaptureChanged);
        pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
        button1.Click += new EventHandler(button1_Click);
    }

    private void button1_Click(object sender, EventArgs e) {
        var rc = pictureBox1.RectangleToScreen(new Rectangle(Point.Empty, pictureBox1.ClientSize));
        Cursor.Position = new Point(rc.Left + rc.Width / 2, rc.Top + rc.Height / 2);
        Cursor.Clip = rc;
        pictureBox1.Capture = true;
        pictureBox1.Cursor = Cursors.Cross;
    }

    void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        pictureBox1.Capture = false;
    }

    void pictureBox1_MouseCaptureChanged(object sender, EventArgs e) {
        if (!pictureBox1.Capture) {
            pictureBox1.Cursor = Cursors.Default;
            Cursor.Clip = new Rectangle(0, 0, 0, 0);
        }
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) pictureBox1.Capture = false;
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

С другой стороны, вы правы насчет ограничений пользователей, поэтому я пришел к этой идее. Но большое спасибо за то, что показали мне, как заблокировать мышки пользователей!!! ИКС)

    public addNote = false;

    private void buttonAddNote_Click(object sender, EventArgs e)
    {
        if (!addNote)
            addNote = true;
        else addNote = false;
    }

    private void curveBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (addNote)
        {
            Cursor = Cursors.Cross;
        }
    }

    private void curveBox_MouseLeave(object sender, EventArgs e)
    {
        Cursor = Cursors.Default;
        addNote = false;
    }
Другие вопросы по тегам