Mousewheel   otázka

VB.NET, WinForms

Potrebujem použiť MouseWheel len keď je kurzor myši nad Pictureboxom. Kód sa však nevykoná. Ked kód vložím do form mousewheel všetko pracuje v poriadku len to má nevýhodu, že keď pootočíte kolečkom myši nad ktorýmkoľvek prvkom vždy sa vykoná iba form mousewheel. Neviete čo treba urobiť-prestaviť aby mousewheel fungovalo iba v rámci prvku ? (napr.Picturebox) Ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak šlo by to řešit například nastavením nějakého Boolean příznaku na MouseEnter/MouseLeave PictureBoxu a kód MouseWheel napojeného na formulář spouštět v závislosti na tomto příznaku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, aj tak sa to dá urobiť len načo má potom picturebox mousewheel ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dědí z System.Windows.Froms.Control, tím pádem získává všechny její veřejné členy. Včetně MouseWheel.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, ale tato událost například právě na PictureBoxu nenastává, z jakého důvodu jsem zatím nezkoumal...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdesi som našiel čiastočné riešenie

Me.ActiveControl = PictureBox1

Výsledok je taký, že sa vykonáva mousewheel z pictureboxu ale funguje to znovu na celom Forme, čiže keď pootočím kolečkom myši nad nejakým tlačítkom vykonáva sa mi Mousewheel na Pictureboxe.

Je to nejaké divné......

nahlásit spamnahlásit spam 0 odpovědětodpovědět

MouseWheel je svým způsobem speciální, protože se vyvolává jen na objektu, který má focus. PictureBox tedy musí mít focus, aby se vyvolávala. Než můžete rolovat seznamem, musíte do něj také kliknout. To samozřejmě dělá problémy, protože když kliknete na nějaké tlačítko na Formu, dostane focus to a kolečko pak už nefunguje.

Vhodné řešení je tedy při MouseEnter na PictureBox nastavit nějakou boolean proměnnou na True, při MouseLeave na False, a odchytávat MouseWheel ve formuláři, přičemž ještě kontrolujete proměnnou.

Jednou jsem to hledal v referenčních zdrojácích, proč se to takhle chová, ale už si nepamatuji, co jsem našel - bylo to tam v nějakém komentáři popsané, proč to tak je a proč se MouseWheel nemůže volat na každé komponentě.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem, presne tak to urobím.....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uvedené riešenie má jednu zásadnú chybu. Pokiaľ z uvedeného formu1 na ktorom je takýto picturebox zobrazím ďaľší form napr. Form2 a ten je menší alebo leží celý nad pictureboxom nie je možné dostať sa k nemu myšou. Ak sa kurzor myši dostane nad picturebox z formu1 nastaví sa focus na picturebox a form1 sa stane aktívny a ide dopredu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"Uvedené riešenie" aktivujte až po MouseDown na PictureBox.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Class Form1
    Dim mouseDn As Boolean = False

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, _
      ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        mouseDn = True
        If mouseDn Then Me.Text = "Myš je v PB..."
    End Sub

    Private Sub PictureBox1_MouseLeave(ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
        Me.Text = "Myš opustila PB"
        mouseDn = False
    End Sub

    Private Sub Form1_MouseWheel(ByVal sender As Object, _
      ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
        Dim wh As String = "+"
        If mouseDn Then
            If e.Delta > 0 Then wh = "+" Else wh = "-"
            Me.Text = "Kolečko " & wh
        End If
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Některé aplikace ale umí posouvat seznamem aniž by měl fokus, což se dost hodí. Pravděpodobně to bude uděláno přeposíláním WM zpráv ovládacímu prvku nad kterým je zrovna kurzor.

S tím fokusem mě to taky hned napadlo, ovšem vzhledem k tomu, že PictureBox standardně nedostává fokus tak jsem se tím dále nezabýval. Dnes jsem zkusil fokus nastavit ručně pomocí metody Focus a vida, MouseWheel začne fungovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možno by sa to dalo urobiť mierne inak. Pri mouse Enter pictureboxu zistiť či je form1 s pictureboxom aktívny (neviem či je to ten správny výraz) ale len vtedy urobiť Picturebox1.focus tým by sa zamedzilo svojvoľnému presunutiu formulára do popredia

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback