Jeg har en form med et panel, hvorpå der er en PictureBox. Meningen er, mousewheel her skal have 2 funktioner:
Funktion 1: Hvis billedet er stort, skal panelet scrolle op eller ned.
Funktion 2: Hvis man holder ALT-knappen inde, skal billedet zoome ind eller ud, men panelet må IKKE scrolle.
Hvordan gør jeg det? Jeg har manuelt sat panelet i fokus, så den modtager events i min event handler:
public MainForm() { InitializeComponent(); panelImage.Focus(); this.panelImage.MouseWheel += new MouseEventHandler( panelImage_MouseWheel ); }
private void panelImage_MouseWheel( object sender, MouseEventArgs e ) { if( Control.ModifierKeys == Keys.Alt ) { // Do something and prevent scroll. // ... ( (HandledMouseEventArgs) e ).Handled = true; } else { // Scroll normally. ( (HandledMouseEventArgs) e ).Handled = false; } }
Problemet er, at ovenstående bare ikke virker helt. Den gør det, den skal, når man holder ALT inde og bruger mousewheel, men den scroller desværre også.
Men der står jo også: The Scroll event occurs when the user scrolls through the client area by interacting with the scroll bars, or when the user navigates between controls and the active control scrolls into view. The Scroll event also occurs when you write code, such as setting the AutoScrollPosition property, that scrolls through the client area.
Derfor jeg ville mene det virker, da du med mouse wheel jo styrer dine scrollbars.
Problemet ligger faktisk et helt andet sted!! En Panel kan ikke få fokus, så derfor trigger den slet ikke MouseWheel eventen, så du skal køre din event på Formen istedet, og tjekke om Panel er under musen, det kan gøres således:
public MainForm() { InitializeComponent(); this.MouseWheel += new MouseEventHandler(panelImage_MouseWheel); } private Control GetCtrlUnderMouse() { return this.Controls.Cast<Control>().FirstOrDefault(c => c.Bounds.Contains(this.PointToClient(MousePosition))); } private void panelImage_MouseWheel(object sender, MouseEventArgs e) { var ctrl = GetCtrlUnderMouse(); if (ctrl == null) return; if (!ctrl.Equals(panelImage)) return; if (Control.ModifierKeys == Keys.Alt) { // Do something and prevent scroll. // ... ((HandledMouseEventArgs)e).Handled = true; } else { // Scroll normally. ((HandledMouseEventArgs)e).Handled = false; } }
Ovenstående er den nemmeste måde at tjekke for om panel er under musen, men du kan sikkert gøre det med MouseHover og MouseLeave eventen, det er i sidste ende nok mere resoucebesparende for din App.
Dette har jeg ikke testet, men det burde virke ;-)
Lige en ting mere, der skal også tjekkes op imod din picturebox, for hvis din mus er over din picturebox, så du bliver nok nødt til at lave en MouseOver og MouseLeave på din picturebox ditto, så du sikrer dig at _panelHasFocus er sat korrekt, så det kunne gøres således:
private bool _panelHasFocus = false; public MainForm() { InitializeComponent(); this.MouseWheel += new MouseEventHandler(OnMouseWheel); panelImage.MouseHover +=new EventHandler(OnMouseHover); panelImage.MouseLeave += new EventHandler(OnMouseLeave); pictureBox1.MouseHover += new EventHandler(OnMouseHover); pictureBox1.MouseLeave += new EventHandler(OnMouseLeave); } private void OnMouseWheel(object sender, MouseEventArgs e) { if (!_panelHasFocus) return; if (Control.ModifierKeys == Keys.Alt) { // Do something and prevent scroll. ((HandledMouseEventArgs)e).Handled = true; } else { // Scroll normally. ((HandledMouseEventArgs)e).Handled = false; } } private void OnMouseHover(object sender, EventArgs e) { _panelHasFocus = true; } private void OnMouseLeave(object sender, EventArgs e) { _panelHasFocus = false; }
Bkp, du skal have stor tak for din indsats. Jeg er imidlertid bange for, at du misforstår mit problem lidt, for det virker på mig som om du tror, at min app. slet ikke får mouse-wheel eventen. Men det gør den. Og panelet scroller. Og det er netop det, jeg vil kunne slå til og fra, som jeg har lyst.
Jeg TROEDE, som skrevet i mit første indlæg, at jeg kunne slippe afsted med
( (HandledMouseEventArgs) e ).Handled = true;
i min mouse-wheel event handler, men det har ingen synlig effekt.
Jeg har prøvet med .net 2.0 og 4.0, men der er ikke nogen umiddelbar forskel på de to mht. opførsel. Intet virker!! Her er min fremgangsmåde:
Nyt projekt -> Windows App Smid et panel på formen. Dock = Fill og AutoScroll = true. Smid en picturebox på panelet. Dock = Fill og SizeMode = AutoSize. ImageLocation skal pege på et eller andet billede, der er for stort til at kunne vises i pictureboxen.
Kør programmet. Flyt musen ind på billedet. Brug scroll-wheel på musen. Intet sker. Hold ALT nede og brug scroll-wheelet. Intet sker.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.