|
[ 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!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|