Pregunta

Tengo un cuadro de imagen que dibujo algunas cosas usando un mapa de bits (cargando el mapa de bits como imagen de la caja de imágenes después de cada cambio de dibujo). Ahora tengo un botón "Agregar una nota". Este botón está en algún lugar de la forma principal. Lo quiero, así que cuando el usuario hace clic en este botón, el puntero del mouse para saltar al control del cuadro de imagen y no se mueve a menos que el usuario haya hecho clic dentro de la tecla de escape de control o presionado. es posible?

Estoy usando este código en este momento:

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

O un mejor enfoque podría ser en este momento cuando el usuario hizo clic en agregar un botón de nota, los clics del mouse solo funcionan dentro del componente de la caja de imágenes (es decir, el usuario no puede hacer clic en otro lugar del programa)

¿Fue útil?

Solución

La modalidad como esa en una interfaz de usuario es una idea bastante mala. Pero WinForms lo hace posible. Puede usar la propiedad Cursor.Clip para restringir el movimiento. No puede evitar que el usuario aún acceda, por ejemplo, el menú de inicio con un atajo de teclado, debe usar la propiedad de captura para detectar que perdió.

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

Otros consejos

En el segundo, aunque tiene razón sobre las limitaciones del usuario, así que se me ocurrió esta idea. ¡Pero muchas gracias por mostrarme cómo bloquear los mouses de los usuarios! 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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top