C# (MS Visual C# 2010 Express) instrukcja po kliknięciu


(Jarek P) #1

Witam.

Mam sobie jakiś tam PictureBox, w którym jest obrazek. Chodzi mi oto, żeby po kliknięciu na dany obszar(dokładny i znany) wykonywana była instrukcja...


(kowal.luk) #2

Jeśli chodzi o to że masz np. tego pictureboxa z obrazkiem i jak klikasz na niego to coś się dzieje to musisz wywołać eventa click. W properties dla danego komponentu.


(Tomek Matz) #3

Kontrolka PictureBox średnio się do tego nadaje. Poszukaj jakiegoś gotowego rozwiązania. Pierwszy link, na który natrafiłem: http://www.codeproject.com/KB/miscctrl/imagemapcontrol.aspx. Ewentualnie ... jeśli nie znajdziesz jakiegoś interesującego gotowca, to użyj event-u kontrolki PictureBox, który da Ci dostęp do współrzędnych myszy, np. MouseClick.


(Foxco77) #4

Kliknij dwukrotnie w kontrolkę pictureBox w trybie design i już przechodzisz do pisania instrukcji, no chyba że chodzi o fragment obrazka, wtedy można użyć poniższego kodu w celu określenia położenia kursora

private void pictureBox1_Click(object sender, EventArgs e)

        {

            int x, y;

            x = MousePosition.X;

            y = MousePosition.Y;

            MessageBox.Show(x+" "+y);

        }

(Jarek P) #5

Chodzi mi o fragmenty danego obrazka. Takie ramki, np 20x30 na obrazku, a po kliknięciu na którąś instrukcja.


(Frankfurterium) #6

Jeżeli to prostokątna ramka, to nie ma problemu.

To co w poście foxco plus:

x1, x2,y1,y2 - współrzędne ramki

mpx, mpy - współrzędne kliknięcia

if ( (mpx >= x1) && (mpx <= x2) && (mpy >= y1) && (mpy <= y2) )

{

      // wyświetlenie komunikatu na czym tam chcesz

}

(Jarek P) #7

Dzięki. Dokładnie oto mi chodziło.


(Tomek Matz) #8

A sprawdzałeś tą kontrolkę, do której podałem link? Nie działała, czy jak? Ona naśladuje zachowanie, które stosuje się w aplikacjach web-owych (kontrolka ImageMap w ASP .NET) i robi dokładnie to co potrzebujesz.


(Jarek P) #9

Jak tak to czytam, to wydaje mi się że się nada. Oba rozwiązania są dobre, ale ta osobna kontrolka będzie chyba łatwiejsza do "wdrożenia". Dzięki za pomoc. Już biorę się do pracy.

-- Dodane 28.12.2011 (Śr) 21:00 --

Udało się. Ta dodatkowa kontrolka świetnie się sprawdza. Mam jeszcze jedną prośbę. Potrzebuje jakiegoś sposobu(może być osobny program) do sprawdzania współrzędnych na obrazku,w miejscu kursora.


(Tomek Matz) #10

Zastosuj prowizoryczne rozwiązanie. Wrzuć na Form-ę Label, a w zdarzeniu MouseMove kontrolki z powyższego link-a (zakładam, że tam takie zdarzenie jest) umieść następujący kod: label1.Text = e.Location.ToString();.


(Jarek P) #11

Zrobiłem coś takiego:

private void imageMap1_MouseMove(object sender, MouseEventArgs e)

        {

            label15.Text = e.Location.ToString();

        }

Niestety nie działa.


(Grzelix) #12

potrzebujesz coś takiego:

http://www.codeproject.com/KB/miscctrl/ ... ended.aspx

albo robisz print screana i w paint sprawdzasz wartości


(Tomek Matz) #13

@Jarek P

Masz rację. Myślałem, że tamta kontrolka dziedziczy po PictureBox, ale tak nie jest. Zapewne stąd problemy. Masz dwa wyjścia:

  1. Poprawić kod tamtej kontrolki -> dziedziczysz po PictureBox, dodajesz nowy event mówiący o tym jaki region został kliknięty, dodajesz metody AddRectangle itd..

  2. Zrób sobie osobną aplikację, w której na Form-ę wrzuć kontrolkę PictureBox (o dokładnie takim samym rozmiarze jak kontrolka ImageMap w Twojej docelowej aplikacji) i tam oprogramuj ten event MouseMove. Wówczas powinno zadziałać.

PS Nie zauważyłem, że grzelix pisał. Jasne obejrzyj także tamtą kontrolkę (ja na nią nie patrzyłem).


(Jarek P) #14

Ok. Działa. Dziękuję za pomoc.

PS. Wykorzystałem rozwiązanie nr.2, sprawdzałem tamtą kontrolkę, ale tak jest szybciej.