仅在控件中锁定鼠标光标移动

时间:2011-03-22 23:11:12

标签: c# locking controls mouse-pointer

我有一个图片框,我使用位图在其上绘制一些东西(在每次更改图形后将位图加载为图片框图像)。现在我有一个“添加注释”按钮。这个按钮在mainForm的某个地方。我想要它,所以当用户点击这个按钮时,鼠标指针跳转到图片框控件并且不会移出它,除非用户点击控件内部或按下Escape键。这可能吗?

我现在正在使用此代码:

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

或者更好的方法是在用户点击时添加注释按钮,鼠标点击仅在图片框组件中工作(IE用户无法点击程序中的其他位置)

2 个答案:

答案 0 :(得分:7)

用户界面中的模态是一个非常糟糕的主意。但Winforms确实使它成为可能。您可以使用Cursor.Clip属性来限制运动。它无法阻止用户使用键盘快捷键访问“开始”菜单,您需要使用“捕获”属性来检测丢失的内容。

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

答案 1 :(得分:0)

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