vb.net; GraphicsPath identifikace   otázka

VB.NET

Dobrý den,

pracuji s vykreslováním GDI+, pro příklad uvedu vykreslení pěti čar:

    Public path As New System.Drawing.Drawing2D.GraphicsPath

            For i = 0 To 50 Step 10
                path.StartFigure()
                path.AddLine(i, 0, i, 100)
                path.CloseFigure()
                Me.PictureBox1.CreateGraphics.DrawPath(PEN_vykr1, path)
            Next i

Výsledkem je vykreslení 5ti svislých čar. Když potřebuji zjistit kolizi s ukazatelem myši, tak to udělám pomocí metody path.IsOutlineVisible(mp, Me._PEN) = boolean (kde mp je mousepointer v eventu MouseMove).

Jenže tak zjistím pouze zda se ukazatel myši nachází nad jakoukoliv čarou a já potřebuji vědět nad kterou z nich konkrétně.

Nemá někdo nějaký nápad? Myslím že jsem už vyzkoušel všechno...

Díky Venca.

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

Pokud je ta grafika komplexnější, zvážil bych použití WPF (lze integrovat do hotové Windows Forms aplikace), kde vše co se nakreslí má automaticky myší události jako běžné ovládací prvky.

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

díky za odpověď, pokouším se wpf vyhnout (i když vím že prvky wpf by se jistě hodily) jen z důvodu, že wpf prostě neumím. Proto hledám cesty jak to obejít, pokoušel jsem se wpf pochopit, ale asi jsem neměl svůj den nebo kvalitní zdroj. Nemáte nějaký tip na nějakou učebnici, příklady, atd...?

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

Je možné také použít pět různých prvků GraphicsPath a detekci kolize provést pro každý z nich, pro tak malý počet prvků to nebude velmi náročné a dostanete se k výsledku jednodušeji, než WPF integrací do WF aplikace. Tím ale nechci říct, abyste WPF nezvážil, určitě v něm najdete na použití přímočařejší nástroj pro komplexnější situace, než je ta současná.

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

Díky za reakci. Ve skutečnosti používám pět různých prvků GraphicPath (odděluji StartFigure a CloseFigure), ale neumím je jednotlivě otestovat (zatím jsem na to nepřišel). To by mi nyní jistě stačilo. Nemáte nějakou radu, prosím?

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

Existuje třída GraphicsPathIterator, která umí získat body a typy jednotlivých figur v objektu GraphicsPath. Mohl byste iterovat figurami a pomocí Enumerate metody GraphicsPathIteratoru nebo vlastností PathPoints a PathTypes si vybrat body a řídící prvky konkrétní figury, ale z těchto dat byste pro hit-testing musel stejně sestavit novou GraphicsPath, abyste měl přístup k mětodě IsOutlineVisible. Mnohem jednodušší, než dočasně vytvářet tyto nové GraphicsPath je tedy použít vlastní GraphicsPath pro každý prvek geometrie, který má být testovatelný na kolizi.

Místo:

Using path As New Path()
  path.StartFigure()
  path.AddLine(10, 10, 100, 10)
  path.CloseFigure()
  path.StartFigure()
  path.AddLine(10, 50, 100, 50)
  path.CloseFigure()
End Using

Tedy použijte více objektů GraphicsPath pro každou figuru:

Dim paths As New List(Of GraphicsPath)
Dim path1 As New Path()
path1.AddLine(10, 10, 100, 10)
paths.Add(path1)
Dim path2 As New Path()
path2.AddLine(10, 50, 100, 50)
paths.Add(path1)
For Each path In paths
  If path.IsOutlineVisible() Then
    'Testujete proti konkrétní figuře
  End If
Next

Místo jedné cesty s více figurami tedy budete mít cestu pro každou figuru. Nezapomeňte zavolat Dispose na každé cestě, kterou přestanete potřebovat (jak to za Vás dělá v prvním přkladu Using - End Using).

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

Velice děkuji, tato rada mi velmi pomohla.

Hezký večer, Venca.

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