Блокировать движение курсора мыши только в элементе управления
У меня есть графический блок, который я рисую на нем, используя растровое изображение (загружая растровое изображение как изображение в виде изображения после каждого изменения рисунка). Теперь у меня есть кнопка "Добавить заметку". эта кнопка находится где-то в 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;
}