przeliczanie wspolrzednych na Panel'u

0

Witam.
Mam problem dotyczący kontrolki Panel, a mianowicie : umieściłem w środku wspomnianej już kontrolki 2 PictureBoxy. I chce, żeby po kliknieciu na któryś z tych obrazków wyswietlało się okienko z nazwą kontrolki(jeśli klikniemy tam gdzie nic nie ma, komunikat zgłosi, ze nie kliknelismy na rysunek). Poradziłem sobie z tym metodą GetChildAtPoint, ale w tym miejscu pojawia się moje pytanie : czy jest możliwe, żeby, gdy najeżdżam na obiekty znajdujące sie w Panelu dalej będę miał współrzędne dotyczące Panelu, a nie jednego z tych PictureBoxów? (ponieważ obrazki znajdują się we wnętrzu panelu, czyli stanowią jakby warstwę na nim)

Mam nadzieje, że zrozumiale opisałem mój problem. ;-)

Z góry dziękuje za odpowiedzi.
Pozdrawiam.

0
private void panel_Click(object sender, EventArgs e)
{
    if (sender is PictureBox)
        MessageBox.Show("Kliknięto na " + (sender as PictureBox).Name);
    else
        MessageBox.Show("Kliknij na obrazek");
}

Przypisz tej metodzie event Click zarówno Panelu jak i wszystkich PictureBoxów.

0

Dzięki, ale mi chodziło własnie o te współrzędne i do tego, żebym nie musiał każdemu nowemu obiektowi przypisywać tej metody.

0
private void panel_Click(object sender, EventArgs e)
{
    Point innerLocation = (e as MouseEventArgs).Location;
    if (sender is PictureBox)
    {
        PictureBox pictureBox = sender as PictureBox;
        Point location = new Point(pictureBox.Location.X + innerLocation.X,
            pictureBox.Location.Y + innerLocation.Y);
        MessageBox.Show("Kliknięto na " + pictureBox.Name + " " + location.ToString());
    }
    else
        MessageBox.Show("Kliknij na obrazek: " + innerLocation.ToString());
}

I powiedz mi co ci szkodzi dopisanie do każdego PictureBoxa takiej linijki (zakładam nawet, że tworzysz je dynamicznie, wtedy to tylko JEDNA linijka):

pictureBox.Click += new EventHandler(panel_Click);

Bez tego będzie ci zamierzony efekt osiągnąć bardzo trudno (przynajmniej według mnie). Domyślnie kontrolki w WinForms nie bąbelkują zdarzeń. Kontrolki w WinAPI robią to dopiero po przypisaniu stylu WS_EX_TRANSPARENT, a i to powoduje kolejne komplikacje. Naprawdę to najprostsza metoda do osiągnięcia tego, co chcesz zrobić.

edit: No dobra, panel dostanie komunikat WM_PARENTNOTIFY, tutaj masz http://msdn.microsoft.com/en-us/library/ms632638(VS.85).aspx opisane jak wyciągnąć z tego współrzędne kliknięcia. Mnie się już w to nie chce bawić a i uważam, że zaprzęganie do tego WinApi, przechwytywanie komunikatów jest co najmniej głupie. Chociażby z tego powodu, że nie zadziała na Mono.

0

Wielkie dzięki. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1