Для этого я создал собственный виджет, наследующий wxWindow, для управления внешним видом. Я могу заставить его работать: нажатие на элемент CustomWidgetCircle сделает его выбранным, а нажатие на фоновую панель WidgetPanel отменит все выделение, но я не могу понять, как получить WidgetPanel< /code>, чтобы ответить и изменить свои дочерние данные, щелкнув CustomWidgetCircle.
Выдержки кода ниже. Прямо сейчас динамические привязки происходят в соответствующих конструкторах.
Код: Выделить всё
// CustomWidgetCircle.h
class CustomWidgetCircle : public wxWindow {
public:
CustomWidgetCircle(wxPanel* parent, wxString label, wxPoint location);
bool isSelected = false;
private:
void OnMouseDown(wxMouseEvent& event);
void OnPaintEvent(wxPaintEvent& event);
void Render(wxDC& dc);
};
Код: Выделить всё
// CustomWidgetCircle.cpp
...
CustomWidgetCircle
CustomWidgetCircle::OnMouseDown(wxMouseEvent& event) {
this->isSelected = !this->isSelected;
Refresh();
}
...
Код: Выделить всё
// WidgetPanel.h
class WidgetPanel : public wxPanel {
public:
WidgetPanel(wxFrame* parent);
private:
void OnDoubleClick(wxMouseEvent& event);
void OnMouseDown
std::list CustomWidgetCircleList;
};
Код: Выделить всё
// WidgetPanel.cpp
...
WidgetPanel::OnDoubleClick(wxMouseEvent& event) {
CustomWidgetCircle* newCircle = new CustomWidgetCircle(this, "lbl", event.GetPosition());
CustomWidgetCircleList.push_back(newCircle);
Refresh();
}
WidgetPanel::OnMouseDown(wxMouseEvent& event) {
for (auto circle_ptr : CustomWidgetCircleList) {
circle_ptr->isSelected = false;
}
Refresh();
}
...
- Использование Skip() при вызове OnMouseDown
Что я пробовал:
Использование Skip() при вызове OnMouseDown в дочерних окнах, чтобы передать событие родительскому. Кажется, ничего не делает. - Только привязка обработчика OnMouseDown к родительскому фрейму и вызов GetEventObject() для аргумента события, чтобы изменить дочернее окно, которое на него нажали, но это не сработает, поскольку возвращает wxObject, поэтому я не могу получить доступ к методам/данным-членам моего пользовательского класса.
- Вызов OnMouseDown обработчик родителя из дочернего окна, но я не могу понять, как сделать родительские методы доступными из дочернего окна.
- Подкласс wxCommandEvent, чтобы я мог передать распространяющееся событие вверх по иерархии окон. Я не думаю, что еще разобрался с тем, как правильно определять и инициализировать пользовательские события.
Подробнее здесь: https://stackoverflow.com/questions/786 ... xwidgets-c
Мобильная версия