PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirkel m
Hej!
Jag har en PictureBox med en bild i (en karta). På denna PictureBox placerar jag ut blåa cirklar som ska vara noder (bilar).
Det gör jag med GDI+, Draw, Invalidate osv... Jag funderar på hur man kan göra på ett effektivt sätt så att man med musen man klicka på en av dessa cirklar och programmet sak kunna avgöra vilken nod det var man klickade på och agera därefter.
Tacksam för tips!
Svara
Sv: PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Jag sitter nu och testar med att istället för att rita ut cirklar så vill jag placerar en UserControl eller en Button eller något sådant ovanpå den karta jag har. Då är det enkelt att få en OnMouse-event av något slag...
Men hur placerar jag en UserControl i en PictureBox så den hamnar ovanpå Image:en som jag har? Som det är nu hamnar allt sådant under Image:n och syns alltså inte alls.
Tacksam för svar om detta och även om första frågan där =)
Svara
Sv:PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
T.ex. Skapa en klass Cirkel som har en metod för att rita sig själv Draw(Graphics g) och en metod som tar reda på om en viss punkt ligger innanför cirkeln, public bool IncludesPoint(Point p). Vid MouseClick "frågar" du crikelobjektet (eller alla cirkelobject om du har flera) om punkten MouseEventArgs.Location, ligger innanför cirkeln genom att anropa metoden IncludesPoint, if ( cirkel.IncludesPoint ( e.Location) ) ...
Svara
Sv:PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Jag skulle också föreslå att gör som Roger Lindberg. Men om du vill använda dig av en UserControl behöver du nog lägga till den i Picturesbox'en via pctBox.Controls.Add(userControl). I din beskrivning låter det som du inte har gjort så. Kan inte säga dig på rak arm om det blir några klurigheter med OnMouse-eventet för UserControl'erna eftersom de ligger i en annan kontroll, men det borde inte vara några problem.
Men som sagt, gå på Rogers lösning istället. Lycka till!
Svara
Sv: PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Hej, och ursäkta sent svar.
Jag funderade på Rogers variant, men tyckte att det blir en väldig massa beräkningar om man ska gå igenom alla de cirklar jag kommer ha utrtiade... kan säkert vara ett par hundra eller så. Det fungerar säkert men troligen blir det enormt slött och jag har redan lite "performance"-problem dessvärre... att rita om cirklarna tar minst 15ms vilket irriterar.
Jag tog Control.Add på PictureBox:en men den la sig under bilden ändå...
Tack för svar iaf, ska ta en titt på det snart igen när jag får lite tid!
Svara
Sv:PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Dessa "beräkningar" är ytterligt enkla och borde inte vara några större problem tidsmässigt...
Du har ett antal cirklar, alla med en radie r, och med medelpunkter (x_i, y_i)
Du får sedan in ett punkt (x, y).
Det du gör för att kolla är att ta (pseudo):
for(c = alla cirklar){
xdiff=(c.x-x);
ydiff=(c.y-y);
if(xdiff*xdiff+ydiff*ydiff > r*r)
//innanför c.
}
får det till 3 add/sub, 2 tilldelningar, 3 produkter och en jämförelse gånger antalet objekt.
Jämfört med hur mycket beräkningar som krävs för en cirkel med radie r (O(r), eller O(r²) beroende på om de är ifyllda eller inte), borde det här vara försumbart.
Fast det beror ju på hur mycket overhead .NET slänger på, förstås. I ren C för hyfsat stora cirklar så är det iaf så...
Svara
Sv: PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Kolla på GraphicsPath objektet och dess IsVisible metod, jag tror att det är där du hittar den snyggaste lösningen. Kolla t.ex http://www.code-magazine.com/article.aspx?quickid=0305061&page=4
eller http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c74c.aspx#q19q
Svara
Sv:PictureBox Image onmouseover : Kan man detektera om mus är över en viss cirk
Tack för svar!
Ska undersöka båda varianter inom kort. Återkommer med hur det fungerar när jag testar =)
Svara