Обработка событий в Visual C++

Есть два бокса с двумя разными изображениями.

Если я щелкну по одному графическому блоку, изображение в нем должно очиститься.

Что еще хуже, оба графических окна имеют только один общий обработчик событий. Как я могу узнать, какой блок изображений сгенерировал событие? Буду признателен за исходный код на C++ - CLI

Мне нужно знать, что писать внутри функции:

private: System::Void sqaure_Click(System::Object^  sender, System::EventArgs^  e) {

}

Обновлено: проблема в том, что когда я пытаюсь передать отправителя в picurebox, появляется сообщение об ошибке, в котором говорится, что типы не могут быть преобразованы.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 911
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете использовать объект-отправитель. Преобразуйте его в элемент управления графическим блоком и сравните его с двумя доступными графическими блоками.

Мой Visual C++ немного заржавел и сейчас не может предоставить код.

Джаннакакис Проблема в том, что когда я пытаюсь передать отправителя в окно изображений, появляется сообщение об ошибке, в котором говорится, что типы не могут быть преобразованы.

PictureBox p = (PictureBox) отправитель;

Niyaz 27.11.2008 18:06

Попробуйте: PictureBox ^ p = (PictureBox ^) отправитель;

Roger Lipscombe 27.11.2008 19:23

Вы уверены, что объект-отправитель действительно того типа, которым вы его предполагаете?

Ответ принят как подходящий

Как у вас дела с актерским составом? В большинстве случаев я бы использовал:

PictureBox ^pb = safe_cast<PictureBox^>(sender);
if (pb != null) {
    // logic goes here
}

(Обратите внимание, что я исправил приведенный выше код после того, как Джош указал на мою ошибку ссылки. Спасибо!)

динамическое приведение даст вам правильный тип объекта, если он может приводить, или null, если он не может (это эквивалент «as» в C#)

Если это дает вам нулевую ссылку, то, возможно, ваш отправитель не тот, что вы думаете?

Если вы пробуете код, который дал Тодзи, значит, у вас проблема - попробуйте следующее:

PictureBox ^pb = safe_cast<PictureBox^>(sender);

В отличие от C#, где не требуется никакого синтаксиса для обозначения объектов управляемой кучи, C++ \ CLI различает объекты стека (PictureBox pb), указатели на объекты кучи (PictureBox *pb) и дескрипторы для объектов управляемой кучи (PictureBox ^pb). Это не одно и то же, и у них разные времена жизни и разные способы использования.

О да. Спасибо за исправление. (Прошло немного времени с тех пор, как я сделал C++ \ CLI).

Toji 10.12.2008 22:59

Как ты пытаешься кастовать? Я обычно использую dynamic_cast или safe_cast:

PictureBox ^ pb = dynamic_cast<PictureBox^>(sender);
if (pb != nullptr)
{
...
}

или же

try
{
    PictureBox ^ pb = safe_cast<PictureBox^>(sender);
    ...
}
catch(InvalidCastException ^ exp)
{
    // Handle a cast that went awry
}

Оттуда все должно быть довольно просто ...

Другие вопросы по теме