Newsgroup: it.comp.lang.visual-basic
Titolo: Evento mouseUp su graphicPath

Salve vorrei sapere se qualche d'uno mi puo dare un aiuto.
Uso il Visual Basic .net:
Allora spiego il problema:
Su un form disegno un graphicPath
---------
Dim Rettangolo As New Rectangle(0,0,50,50)
Dim Gp As New GraphicsPath
Gp.AddEllipse(rettangolo)
e.Graphics.DrawPath(Pens.Blue, Gp)
----------
Adesso io vorrei sapere se esiste qualche metodo per
rendere il GraphicPath Sensibile al passaggio del mouse
(magari farlo cambiare colore Quando ci passo sopra con il cursore del 
mouse).
Pero non riesco a capire come.
Ho letto da qualche parte che bisogna usare il metodo PathData
pero non ho capito come funziona..
Spero che qualche d'uno mi puo dare una dritta..
Grazie 

 mouse).
non c'ï¿œ nulla di builtin, devi introdurre il concetto di HitTesting nel 
tuo mondo.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

Scusa la mia ignoranza...
ma che significa HitTesting
"Mauro Servienti [MVP]"  ha scritto nel messaggio 
news:mn.5c6c7dab9...@online.nospam...


 ma che significa HitTesting
quando realizzi un controllo, ad esempio un button, hai a disposizione 
un handle (alla fine sei una window) e di conseguenza vieni imbucato 
nella message pump del sistema operativo, questo ï¿œ il motivo per cui 
quando clicchi su un botton riesci ad avere l'evento click.
Quando disegni non hai tutto ciï¿œ, se hai bisogno di capire se il mouse 
ï¿œ su una porzione del disegno o meno il controllo che ospita il disegno 
deve fare una cosa che in gergo si chiama HitTesting deve cioï¿œ 
tracciare i movimenti/click del mouse e deve capire dove si trova (in 
base alla coordinate) per determinare se ï¿œ o meno su una porzione del 
"disegno", ï¿œ quello che tipicamente fanno le griglie per capire su 
quale cella sei.


Grazie Della Dritta.
pero se mi Fai un piccolo esempio di codice 
mi faresti grande piacere...
oppure se hai qualche link dove posso 
prendere informazioni
Grazie...


Ecco qui
un esempio a "luci rosse"....nuovo progetto...nel form incolla
'*****************INIZIO*************************
Imports System.Drawing
Imports System.Drawing.Drawing2D
Public Class Form1
    'un po di variabili
    Dim mypath As GraphicsPath
    Dim AreaRettangolare As Rectangle
    Dim pennelloStandard As Brush
    Dim pennelloEvidenziato As Brush
    Dim SonoDentroPath As Boolean
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
        'un po di setup
        pennelloStandard = Brushes.Blue
        pennelloEvidenziato = Brushes.Red
        SonoDentroPath = False
        'Cominciamo: PATH
        mypath = New GraphicsPath(FillMode.Winding)
        With mypath
            .AddLine(15, 45, 110, 45)
            .AddLine(110, 45, 110, 75)
            .AddLine(110, 75, 15, 75)
            .AddLine(15, 75, 15, 45)
            .AddEllipse(10, 10, 40, 40)
            .AddEllipse(10, 70, 40, 40)
            .AddEllipse(90, 40, 40, 40)
            .CloseFigure()
        End With
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        'Controllo quando muovi il mouse se sei dentro il path!
        If (mypath.IsVisible(e.X, e.Y)) Then
            'TA DAH!!!! SEI DENTRO!
            SonoDentroPath = True
        Else
            SonoDentroPath = False
        End If
        'purtroppo paint non si riscatena e quindi va duplicato  un po
di codice
        Dim g As Graphics = Me.CreateGraphics
        If SonoDentroPath = True Then
            g.FillPath(pennelloEvidenziato, mypath)
        Else
            g.FillPath(pennelloStandard, mypath)
        End If
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        'ti disegno il path sulla form
        ' in base al flag impostato
        Dim g As Graphics = e.Graphics
        If SonoDentroPath = True Then
            g.FillPath(pennelloEvidenziato, mypath)
        Else
            g.FillPath(pennelloStandard, mypath)
        End If
    End Sub
End Class
'****************FINE******************
Buono studio!

         End If
basta chiamare "Invalidate"


 basta chiamare "Invalidate"
vero!...non ci avevo pensato!
Però mi sà che ad usare paint richiamato di continuo dal mouse move
cominci a "sfarfallare" tutta la finestra!
Boh...facciamo provare al nostro amico!


wrote:
Ho provato con invalidate : se il path è grande, muovendoti dentro il
path...sfarfalla!
Però il nostro amico ha detto di intercettare il mouse click e quindi
andrebbe probabilmente bene anche l'invalidate!
Saluti!

 muovendoti dentro il path...sfarfalla!
Sono a casa e non posso provare, ma usare il
Double buffering migliora le cose ?
Bye, G.

Ciao 
mec...@alice.it
,

dipende molto da che cosa devi fare, faccio un esempio un po' generico 
di cosa farei io.
Supponi di dover disegnare delle forme a video e di dover essere in 
grado di selezionalre con il mouse, hai anche l'onere di dare feedback 
all'utente di quale sia la shape selezionata, ergo devi evidenziarla.
partiamo dal concetto di fondo, per disegnare hai bisogno di un oggetto 
"Graphics" che ti viene dato dal processo di "painting", non è mai 
buona cosa costruirsene uno, sempre meglio usare quello che ti arriva 
in fase di paint.
a questo punto io definirei un set di classi "Shape" con un metodo 
Render che prende in pasto un Graphics e fa quello che deve fare, 
tenendo traccia di cosa ha fatto, e un metodo HitTest che prende un set 
di coordinate e in base a quello che ha fatto nel render è in grado di 
sapere se quelle coordinate ricadono al suo interno o meno.


 Bye, G.
E' domenica....sono sul divano a spippolare con photoshop le foto
delle bimbe...
tra un po mi aspetta la lasagna della suocera e l'arista in forno.....
passo la palla!
Prova tu se vuoi!!!
eh eh eh :)

Ragazzi grazie mille..
Il codice funzione perfettamente..
Ed e proprio l'effetto che volevo ottenere
Se uso il  codice invalidate
come avete detto sfarfalla un po
pero se uso il Double buffering
il problema si risolve..
Grazie Ancora