M
Vielen Dank für die Idee mit den Listenern, leider stört mich dabei die Unterscheidung anhand des Sender-Objekts. Ich hätte gerne eine Member-Funktion pro Ereignis pro Button. Ich habe jetzt noch etwas getüftelt und bin auf folgenden Code gekommen.
Evtl. könnte mir jmd., der etwas (oder gerne auch sehr viel :)) mehr Ahnung davon hat, als ich mir sagen, ob das so in Ordnung ist. Zumindest die Schnittstelle erscheint mir so typsicher.
#include <windows.h>
#include <vector>
#include <string>
template <class T> class TOnClick {
T* o;
void (T::* f)();
public:
TOnClick(T* _o, void (T::* _f)()) {
o = _o;
f = _f;
}
void operator()() {
(*o.*f)();
}
};
class Widget {
public:
std::vector<TOnClick<Widget>*> onClickListener;
template <typename T> void AddOnClickListener(T* o, void (T::* f)()) {
onClickListener.push_back((TOnClick<Widget>*)new TOnClick<T>(o, f));
}
void onClick() {
for (unsigned int i = 0; i < onClickListener.size(); i++) {
(*onClickListener[i])();
}
}
};
class Button : public Widget {
public:
std::string c;
Button(std::string _c) {
c = _c;
}
void test() {
::MessageBox(0, c.c_str(), "", MB_OK);
}
};
class tmp {
public:
std::string c;
tmp(std::string _c) {
c = _c;
}
void tmp2() {
::MessageBox(0, std::string("tmp::tmp2 | " + c).c_str(), "", MB_OK);
}
};
class Window : public Widget {
public:
std::string c;
Button* b1;
tmp* t1;
Window() {
c = "Window";
t1 = new tmp("");
b1 = new Button("Window::b1 | Button 01");
b1->AddOnClickListener(this, &Window::b1Click);
b1->AddOnClickListener(b1, &Button::test);
b1->AddOnClickListener(t1, &tmp::tmp2);
}
void b1Click() {
::MessageBox(0, this->c.c_str(), "", MB_OK);
}
void b1Click2() {
::MessageBox(0, "b1Click2", "", MB_OK);
}
};
int main() {
Window* mywin = new Window();
Window* mywin2 = new Window();
mywin->c = "mywin";
mywin->b1->c = "mywin 01 | Button 01";
mywin->t1->c = "t1";
mywin2->c = "mywin 02";
mywin2->b1->c = "mywin 02 | Button 01";
mywin2->t1->c = "t2";
mywin->b1->onClick();
mywin2->b1->onClick();
return 0;
}
Vielen Dank !