[ W.A.Mozart @ 13.12.2011. 11:07 ] @
Pozdrav,

Trebao bi da napravim shape kontrolu sastavljenu iz 5 dijelova ( http://bit.ly/rWnpl3 ). Svaki dio treba da posjeduje svoj callback / click event. Takodjer, na klik bi segment oblika treba da ima mogucnost mijenjanja boje. Prilicno banalna i po vaznosti minorna stvar koja mi je u projektu zadala prilicno veliku glavobolju. Ima neka dobra dusa da me prosvijetli? :)

[ Shadowed @ 13.12.2011. 12:04 ] @
Hm, kada bi radio u WPF-u, ovo bi bilo jednostavno. U WinForms, ne pada mi nista drugo na pamet osim da na osnovu koordinata klika odredis kojem segmentu pripada mesto klika i shodno tome reagujes.
[ W.A.Mozart @ 13.12.2011. 12:55 ] @
Fol je sto trebam imati blizu 50 ovakvih kontrola na jednoj formi. Mislim da bi bilo prilicno bolno za svaku raditi takvu proceduru.
[ Shadowed @ 13.12.2011. 14:05 ] @
Pa ne, nego napravis jednu user kontrolu koja ce to da obavlja za sebe. Posle je samo ubacis na 50 mesta :)
[ W.A.Mozart @ 14.12.2011. 09:57 ] @
Sve su prilike da ce mi to biti jedini izlaz :( Da li neko mozda ima jos neku ideju prije nego se bacim na posao?

[ vujkev @ 14.12.2011. 21:22 ] @
evo za početak ovako nešto. Ne bi trebalo da bude problem da dodaš click event i šta već treba

Code (vbnet):

 Dim p1() As Point = {New Point(0, 0), New Point(40, 0), New Point(30, 10), New Point(10, 10)}
    Dim p2() As Point = {New Point(0, 0), New Point(10, 10), New Point(10, 30), New Point(0, 40)}
    Dim p3() As Point = {New Point(0, 40), New Point(40, 40), New Point(30, 30), New Point(10, 30)}
    Dim p4() As Point = {New Point(40, 40), New Point(40, 0), New Point(30, 10), New Point(30, 30)}
    Dim p5() As Point = {New Point(10, 10), New Point(30, 10), New Point(30, 30), New Point(10, 30)}
    Dim Pol()() As Point = {p1, p2, p3, p4, p5}
   
    Public Shared Function IsInPolygon(poly As Point(), p As Point) As Boolean
        Dim p1 As Point, p2 As Point

        Dim inside As Boolean = False

        If poly.Length < 3 Then
            Return inside
        End If
       
        Dim oldPoint = New Point(poly(poly.Length - 1).X, poly(poly.Length - 1).Y)
       
        For i As Integer = 0 To poly.Length - 1
            Dim newPoint = New Point(poly(i).X, poly(i).Y)
            If newPoint.X > oldPoint.X Then
                p1 = oldPoint
                p2 = newPoint
            Else
                p1 = newPoint
                p2 = oldPoint
            End If
           
            If (newPoint.X < p.X) = (p.X <= oldPoint.X) AndAlso (p.Y - CLng(p1.Y)) * (p2.X - p1.X) < (p2.Y - CLng(p1.Y)) * (p.X - p1.X) Then
                inside = Not inside
            End If

            oldPoint = newPoint
        Next
        Return inside
    End Function
   
    Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Dim g As Graphics = Me.CreateGraphics
        For Each p In Pol
            If IsInPolygon(p, e.Location) Then
                g.FillPolygon(Brushes.Red, p)
            Else
                g.FillPolygon(New SolidBrush(Me.BackColor), p)
            End If
            g.DrawPolygon(Pens.Black, p)

        Next
    End Sub

    Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim g As Graphics = Me.CreateGraphics
        g.DrawPolygon(Pens.Black, p1)
        g.DrawPolygon(Pens.Black, p2)
        g.DrawPolygon(Pens.Black, p3)
        g.DrawPolygon(Pens.Black, p4)
        g.DrawPolygon(Pens.Black, p5)
    End Sub
 
[ Shadowed @ 14.12.2011. 23:59 ] @
Imas jedan prilicno šabanski nacin ali verovatno najjednostavniji moguci :)
Elem, napravis user control. Napravis sliku koja izgleda kao ta koju si nama pokazao ali svaki segment malo drugacije boje. Dovoljno je da r, g ili b vrednost promenis za 1. Vizuelno se nece primetiti. Na klik proveris koja je boja na mestu klika i na osnovu toga znas koji je segment :)
[ wex-alpha @ 16.12.2011. 23:42 ] @
A ako korisnik promjeni rezoluciju?
[ W.A.Mozart @ 18.12.2011. 17:47 ] @
Postoje dva zahtjeva:

1. Da svaki segment ima svoja callback, click event
2. Da ima property takav da se moze mijenjati boja svakog od segmenta pojedinacno ( na klik i sl).

Poslije par dana se ponovo vracam na ovaj projekat pa ako imate ideje... :)

Pozdrav
[ W.A.Mozart @ 19.12.2011. 15:00 ] @
@vujkev Uspio sam prepakovati tvoj kod u C#, napravio custom control-u i za pocetak odlicno radi. Malo je buggy sto nekad ostane aktivan poligon ( crvena boja ) na mouse over ali se da to srediti. Jos sta ce biti potrebno da uradim je da napraviti mogucnost da na mouse click event zadrzi boju i setuje neku public varijablu ( mozda bool array za sve kreirane poligone ) da bi iz main forme mogao imati informaciju o tome sta je aktivno. Mnogo ti hvala na pomoci!