блокировать движение курсора мыши только в элементе управления - PullRequest
0 голосов
/ 23 марта 2011

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 23 марта 2011

Модальность в пользовательском интерфейсе довольно плохая идея. Но 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);
    }
}
0 голосов
/ 23 марта 2011

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

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