2010-12-13 24 views
16

Come catturare la rotella del mouse sul pannello in C#? Sto utilizzando WinFormsCome catturare la rotellina del mouse sul pannello?

EDIT:

cerco di farlo su PictureBox ora.

Il mio codice:

this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);  
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick); 
private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
    MessageBox.Show("Click"); 
    } 

opere clic. Wheelling non lo fa. Perché?

risposta

19

Windows invia il messaggio WM_MOUSEWHEEL al controllo che ha lo stato attivo. Quello non sarà Panel, non è un controllo che può focalizzarsi. Non appena metti un controllo sul pannello, pronuncia un pulsante, quindi il pulsante ottiene il focus e il messaggio.

Il pulsante tuttavia non ha alcuna utilità per il messaggio, non ha nulla da scorrere. Windows lo nota e invia il messaggio al genitore. Questo è il pannello, ora scorrerà.

Troverete il codice per un pannello personalizzato che può mettere a fuoco in this answer.


UPDATE: Si noti che questo comportamento è cambiato in Windows 10. Le "finestre inattive di scorrimento quando mi passa il mouse su di loro" opzione è attiva per impostazione predefinita. Rende il comportamento della rotellina del mouse più coerente con il modo in cui funziona in un browser o, per esempio, in un programma di Office. In questo caso specifico la picturebox ora sarà ottenere l'evento. Fai attenzione a questo.

+0

Vedere questa risposta su come farlo con un pannello: http://stackoverflow.com/a/9086750/1353187 –

5

Per cablare farlo manualmente ...

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel); 

private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    ///process mouse event 
} 

facile metodo è in Visual Studio clicca sul pannello, proprietà di avanzamento viewpanel, eventi selezionati, trova e fai doppio clic sull'evento "rotellina del mouse".

+2

non riesco a vedere la rotellina del mouse. C'è MouseCaptureChanged, MouseClick, MouseDoubleClick, MouseDown, MouseEnter, MouseHover, MpouseLeave, MouseMove, MouseUp –

+1

Strano che tu abbia ragione. Non sono sicuro del motivo per cui Visual Studio non lo ha elencato. Se lo colleghi manualmente funziona. Questo è un esempio di programma che utilizza l'evento MouseWheel. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx –

+2

Fwiw, non viene visualizzato nel viewpanel Proprietà perché la dichiarazione di questo evento è decorata con "[sfogliabile (false)]". Inoltre, non comparirà nel pannello di completamento automatico di IntelliSense a meno che VS non sia impostato per mostrare membri avanzati (credo che VB li nasconda, mentre C# non lo fa per impostazione predefinita) e ciò accade perché è decorato anche con "[EditorBrowsable (EditorBrowsableState .Avanzate)]". –

21

Se non è possibile visualizzare l'evento "MouseWheel" su un componente, è necessario crearlo manualmente. Inoltre, dobbiamo mettere a fuoco quel componente, altrimenti l'evento "MouseWheel" non funzionerà per quel componente. Ti mostrerò come creare un evento "MouseWheel" per "pictureBox1" e come funziona.

  1. ALL'INTERNO DEL COSTRUTTORE, creare un evento di rotellina del mouse su quel componente.

    InitializeComponent(); 
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel; 
    
  2. CREARE LA FUNZIONE manualmente. Secondo il mio esempio, lo chiamano "pictureBox1_MouseWheel"

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) 
    { 
        //you can do anything here 
    } 
    
  3. creare un evento MouseHover su quel componente (Vai immobili a PicureBox1, selezionare eventi, individuare "MouseHover" e fare doppio clic sull'evento "MouseHover").

  4. CHIAMATA "Focus()"; metodo all'interno di quell'evento MouseHover.

    pictureBox1.Focus(); 
    
  5. Ora eseguire il programma.

+1

A w e m e guy! Nel mio caso non ho bisogno del 'Mouse/Scroll EventArgs' quindi ho impostato' private void EventFunc (object mittente, EventArgs e) '. In questo modo posso configurare entrambi i gestori (scroll e rotellina del mouse) sulla stessa funzione :). Pulito. – C4u

+0

questa è la risposta! grazie. – jonathana

+0

dovrebbe essere la risposta accettata – Akumaburn

1

Ottenere eventi della rotellina del mouse è difficile. Il modo più semplice sta usando

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

invece di

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

In questo modo la forma ottiene caso invece di controllo. In questo modo è semplice, ma ha un problema: puoi utilizzare solo un evento di rotellina del mouse nel tuo modulo.

Se si dispone di più di un controllo per ottenere evento rotella del mouse il modo migliore è This answer by "Shehan Silva - weltZ"

Problemi correlati