Domanda

Ho una scatola per immagini che disegno alcune cose su di essa usando una bitmap (caricando la bitmap come immagine di immagini dopo ogni cambio di disegno). Ora ho un pulsante "Aggiungi una nota". Questo pulsante è da qualche parte nella forma principale. Lo voglio, quindi quando l'utente fa clic su questo pulsante, il puntatore del mouse per saltare nel controllo PictureBox e non si sposta da esso a meno che l'utente non abbia fatto clic all'interno del controllo del controllo o premuto. È possibile?

Al momento sto usando questo codice:

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

O un approccio migliore potrebbe essere su questo momento in cui l'utente ha fatto clic su Aggiungi un pulsante Nota, i clic del mouse funzionano solo all'interno del componente PictureBox (ad esempio l'utente non può fare clic su altro posto nel programma)

È stato utile?

Soluzione

La modalità come quella in un'interfaccia utente è una cattiva idea. Ma Winforms lo rende possibile. È possibile utilizzare la proprietà Cursor.Clip per limitare il movimento. Non può impedire all'utente di accedere ancora, per esempio, al menu Start con una scorciatoia da tastiera, è necessario utilizzare la proprietà di acquisizione per rilevare che hai perso.

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

Altri suggerimenti

Nel secondo, però hai ragione sulle limitazioni degli utenti, quindi ho avuto questa idea. Ma grazie mille per avermi mostrato come bloccare i mouse utente !!! 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;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top