kontrola pozice myši a reakce   zodpovězená otázka

VB.NET

Dobrý den,mám problém s kodem (v GDI+) měl by po najetí myši na danou pozici spustit danou akci

Private Sub ptm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim p As New Pen(Color.White, 5)      'oramovani okna po najeti na nej
        Dim mousePos As Point = Control.MousePosition ' zachycení polohy myši

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 30 And mousePos.Y <= 73 Then
            e.Graphics.DrawRectangle(p, 30, 30, 94, 73)          'urceni pozice ramu
            MsgBox("trefa")
        End If

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 131 And mousePos.Y <= 73 Then
            e.Graphics.DrawRectangle(p, 30, 131, 94, 73)          'urceni pozice ramu
        End If

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 232 And mousePos.Y <= 73 Then
            e.Graphics.DrawRectangle(p, 30, 232, 94, 73)          'urceni pozice ramu
        End If

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 334 And mousePos.Y <= 73 Then
            e.Graphics.DrawRectangle(p, 30, 334, 94, 73)          'urceni pozice ramu
        End If

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 439 And mousePos.Y <= 73 Then
            e.Graphics.DrawRectangle(p, 30, 439, 94, 73)          'urceni pozice ramu

        End If



    End Sub

pokud má někdo zkušenosti,nebo nějakou radu proč to nefunguje,budu rád.Je to muj druhý pokus ale v prvním jsem to řešil jinak zde to bohužel nejde.Účelem je aby po najetí na onu pozici se zobrazil rámeček (ten se nezobrazí),a potom po opuštění pozice zase zmizet (tam jsem ještě nedošel)...

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

Trošičku nerozumím, proč testujete polohu myši v události Paint. Ta se, pokud vím, vyvolá v případě, že je zapotřebí překreslit Form (změním rozměry, minimalizuju a vrátím zpátky, něčím ho zakryju,..) ale nemyslím, že by se tato událost vyvolala v okamžiku přejetí myši.

A klasickou konstrukci nemůžete použít?:

Public Class Form1
    Dim g As Graphics = Me.CreateGraphics


    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Dim p As New Pen(Color.White, 5)      'oramovani okna po najeti na nej
        Dim mousePos As Point = e.Location  ' zachycení polohy myši

        If mousePos.X >= 30 And mousePos.X <= 94 And mousePos.Y >= 30 And mousePos.Y <= 73 Then
            g.DrawRectangle(p, 30, 30, 94, 73)          'urceni pozice ramu

            MsgBox("trefa")
        End If
    End Sub

  
   
End Class

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

Zkusil jsem to takhle za pokud možno použití původního kódu:

 Public Class Form1
   Dim p As New Pen(Color.White, 5)      'oramovani okna po najeti na nej
   Dim mousePos As Point ' pro zachycení polohy myši
   Dim Rct(5) As Rectangle, r As Integer = 0 ' pole rámečků a jejich index

   Private Sub Form1_Load(ByVal sender As Object, _ 
       ByVal e As System.EventArgs) Handles Me.Load
     Rct(1) = New Rectangle(30, 30, 94, 73)
     Rct(2) = New Rectangle(30, 131, 94, 73)
     Rct(3) = New Rectangle(30, 232, 94, 73)
     Rct(4) = New Rectangle(30, 334, 94, 73)
     Rct(5) = New Rectangle(30, 439, 94, 73)
   End Sub

   Private Sub Form1_MouseMove(ByVal sender As Object, _ 
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
     mousePos.X = Control.MousePosition.X - Me.Left - 5
     mousePos.Y = Control.MousePosition.Y - Me.Top - 30
     r = 0
     Me.Invalidate()
     If mousePos.X >= 30 And mousePos.X <= 94 And _
                 mousePos.Y >= 30 And mousePos.Y <= 30 + 73 Then
      r = 1        'urceni ramu
      Me.Invalidate()
      MsgBox("trefa")
    End If

    If mousePos.X >= 30 And mousePos.X <= 94 And _
                mousePos.Y >= 131 And mousePos.Y <= 131 + 73 Then
       r = 2        'urceni ramu
       Me.Invalidate()
     End If

     If mousePos.X >= 30 And mousePos.X <= 94 And _
                 mousePos.Y >= 232 And mousePos.Y <= 232 + 73 Then
       r = 3        'urceni ramu
       Me.Invalidate()
     End If

     If mousePos.X >= 30 And mousePos.X <= 94 And _
                 mousePos.Y >= 334 And mousePos.Y <= 334 + 73 Then
       r = 4        'urceni ramu
       Me.Invalidate()
     End If

     If mousePos.X >= 30 And mousePos.X <= 94 And _
                 mousePos.Y >= 439 And mousePos.Y <= 439 + 73 Then
       r = 5        'urceni ramu
       Me.Invalidate()
     End If
   End Sub

   Private Sub Form1_Paint(ByVal sender As Object, _
         ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
     e.Graphics.DrawRectangle(p, Rct(r))          'vykreslení rámu
   End Sub
 End Class

Pozici myši je třeba "chytit" tam, kde vyvolává událost

Použijete-li "Control.MousePosition", pak jde o polohu na obrazovce, ne ve formuláři. Musíte proto odečíst polohu formuláře a jeho okraje

Vymezení polohy myši od levého horního rohu do pravého dolního rohu obdélníku není totéž jako Rectangle - ten je určen levým horním rohem a šířkou a výškou obdélníku!

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

Děkuji pánové ale kod od pana Rennera nefunguje uplně přesně,pouze pokud na pozici najedu z leva(nevim proč?)

ještě zkusim ten druhý.

Děkuji

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

Nevím jak Vám, ale já, když jsem si pouze otevřel nový projekt a nakopíroval do jeho kódu přesné znění příspěvku pana Rennera, tak mi to fungovalo - a celkem se mi to líbilo, jak to měl vyřešené a že na maximum vycházel z vašeho kódu.

Zkuste to ještě jednou tak, že tam celý ten text jenom nakopírujete.

Ještě doporučuji v tom prvním bloku If zrušit ten kontrolní Msgbox (lépe je funkčnost viditelná bez něj), no a pokud to chcete úplně přesně, ještě si ve všech blocích IF v tom druhém porovnávání dejte místo 94 číslo 124 (to pan Renner pouze přehlédl, stejně jako k počáteční pozici Y daného obdélníku přičítá jeho výšku (73), aby dostal konečnou pozici, stejně tak je potřeba k počátky X (30) přičíst šířku obdélníka (94) (30+94=124). Jinak by ale ten kód měl fungovat.

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

Kod jsem nakopíroval přesně,ale v případě že myší najedu z prava do leva nic se nestane dokud se nepřiblížím k levé straně pictureboxu,potom to funguje,rosvítí se rámeček a svítí dokud myš neopustí obrázek ale aktivuje se pouze v levo a nevím proč je mi to záhadou kod je psán dobře a pozice taky sedí.

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

Pane Trakale,

skutečně netuším, v čem by mohl být pejsek zakopán, zkuete ještě jednu drobnost:

Přidejte si na formulář 2 labely, a kód si doplňte tak, ať Vám vypisují pozici kurzoru. A uvidíte, jestli se mění plynule bez ohledu na směr pohybu myši, nebo co tropí za neplechu.

Ten kód by mohl vypadat třaba takhle:

Public Class Form1
    Dim p As New Pen(Color.White, 5)      'oramovani okna po najeti na nej
    Dim mousePos As Point ' pro zachycení polohy myši
    Dim Rct(5) As Rectangle, r As Integer = 0 ' pole rámečků a jejich index

    Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
        Rct(1) = New Rectangle(30, 30, 94, 73)
        Rct(2) = New Rectangle(30, 131, 94, 73)
        Rct(3) = New Rectangle(30, 232, 94, 73)
        Rct(4) = New Rectangle(30, 334, 94, 73)
        Rct(5) = New Rectangle(30, 439, 94, 73)
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        mousePos.X = Control.MousePosition.X - Me.Left - 5
        mousePos.Y = Control.MousePosition.Y - Me.Top - 30
        r = 0
        Label1.Text = "X: " & mousePos.X
        Label2.Text = "Y: " & mousePos.Y


        Me.Invalidate()
        If mousePos.X >= 30 And mousePos.X <= 124 And _
                    mousePos.Y >= 30 And mousePos.Y <= 30 + 73 Then
            r = 1        'urceni ramu
            Me.Invalidate()

        End If

        If mousePos.X >= 30 And mousePos.X <= 124 And _
                    mousePos.Y >= 131 And mousePos.Y <= 131 + 73 Then
            r = 2        'urceni ramu
            Me.Invalidate()
        End If

        If mousePos.X >= 30 And mousePos.X <= 124 And _
                    mousePos.Y >= 232 And mousePos.Y <= 232 + 73 Then
            r = 3        'urceni ramu
            Me.Invalidate()
        End If

        If mousePos.X >= 30 And mousePos.X <= 124 And _
                    mousePos.Y >= 334 And mousePos.Y <= 334 + 73 Then
            r = 4        'urceni ramu
            Me.Invalidate()
        End If

        If mousePos.X >= 30 And mousePos.X <= 124 And _
                    mousePos.Y >= 439 And mousePos.Y <= 439 + 73 Then
            r = 5        'urceni ramu
            Me.Invalidate()
        End If
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.DrawRectangle(p, Rct(r))          'vykreslení rámu
    End Sub
End Class

(S laskavým svolením jsem bez dovolení pouze doplnil kód pana Rennera :o)

Dejte pak vědět, jestli jste došel k nějakému závěru.

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

Díky za odhalení nedostatku. Možná by bylo zřetelnější pro rozměry obdélníka 94x73 použít konstanty, pak by bylo víc viditelné, že na X jsem zapomněl.

Proč by nefungoval či fungoval kód podle směru najetí myší do podmínkami vymezeného prostoru nevím. Událost "move" snad směr nerozlišuje. Rozhodující bude, zda k události dojde anebo ne a hlavně proč.

Pane Langere, dík za pochvalu. Respektovat ideu tazatele se učím od Vás, není mi to vlastní, často bych původní myšlenku opustil a šel úplně jinou cestou. I díky Vám se přesvedčuji, že je lepší směr tazatele respektovat. On totiž o problému ví vždy víc než my, "diváci".

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

Pane Trakale,

napadá mě, že možná zápasíte s kódem, který je funkční a Vám nejde pro odlišné chování myši. Měl byste zkusit jinou myš, či spustit program na jiném počítači.

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

Omlouvám se za velké zdržení,nebylo moc času a ach ta skleróza :o) .

ještě jsem to netestoval ale nemuže být problém v tom že používám notebook? bez standartní myši.

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