锁定鼠标光标只在一个控件中移动

问题描述:

我有一个图片框,我使用位图(在每次绘图更改后将位图作为图片框图像加载)上的图片。现在我有一个“添加注释”按钮。此按钮位于mainForm中的某个位置。我想要它,所以当用户点击这个按钮时,鼠标指针跳转到图片框控件并且不移出它,除非用户点击了控件内部或按下了Escape键。这可能吗?锁定鼠标光标只在一个控件中移动

我使用这个代码的时刻:

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

或者更好的办法可能是在这个时候,当用户点击添加注释按钮,鼠标点击只图片框组件内工作(IE用户无法点击程序中的其他地方)

+0

这是可能的,但在获得答案之前,以这种方式限制用户被认为是不好的做法和糟糕的设计!我会重新考虑您的实施,除非这是客户的要求。 – 2011-03-22 23:14:03

+2

在这种情况下,我会要求客户重新考虑要求;) – Town 2011-03-22 23:15:50

+0

嗯,你没错,但用户点击时怎么样添加一个音符按钮,鼠标点击只在picturebox组件内工作(IE用户无法在程序中的其他地方点击) – 2011-03-22 23:18:43

在用户界面中的这种形式是一个非常糟糕的主意。但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

Grr,忘记了'Capture'属性。 – ChrisF 2011-03-22 23:38:54

+0

@Hans Passant:我一直在使用这样的代码:clipRect = RectangleToScreen(pictureBox1.Bounds); – BillW 2013-05-09 04:55:25

+0

您也可以在窗体或用户控件加载事件中使用这样的代码:clipRect = RectangleToScreen(pictureBox1.Bounds);在屏幕坐标中获取控件的矩形......如果在运行时没有移动控件。在这种情况下:'clipRect当然会是'矩形类型'的表单作用域变量。谢谢,一如既往,汉斯! – BillW 2013-05-09 05:03:30

虽然你对用户限制是正确的,但是我想出了这个想法。但是,非常感谢您向我展示如何锁定用户鼠标! 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; 
    }