Hi,
Ich habe eine Klasse geschrieben die Windowsmessages an bestimmte Funktionen weiterleiten soll, ähnlich wie es bei der MFC gemacht wird.
class Window
{
public:
typedef long (Window::\*MH) (HWND, long, long);
typedef std::map MessageMap;
typedef MessageMap::iterator MessageIterator;
Window(HINSTANCE hInstance);
~Window();
// Interface for the user
HWND CreateWnd(char\* name, long flags);
void RegisterMessageHandler(long message, MH handler);
bool HandleMessages();
long GetExitCode();
// WM\_Close and WM\_Destroy are by default handled internaly
long OnClose(HWND hwnd, long param0, long param1);
long OnDestroy(HWND hwnd, long param0, long param1);
// Callback
long DeliverMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
static LRESULT CALLBACK MsgRouter(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
private:
HINSTANCE m\_hInstance;
HWND m\_hwnd;
MessageMap m\_MsgHandlers;
long ExitCode;
};
Jedes Fenster hat eine eigene Klasse die von Window abgeleitet ist und alle anfallenden Messages verarbeitet.
class MainDialog : public Window
{
MainDialog();
~MainDialog();
OnCreate(HWND hwnd, long param0, long param1);
}
MainDialog::MainDialog() : Window(GetModuleHandle(0))
{
long (Window::\*ptr)(HWND, long, long);
ptr = &MainDialog::open\_mouth:nCreate;
RegisterMessageHandler(WM\_CREATE, ptr);
CreateWnd("window", WS\_OVERLAPPEDWINDOW|WS\_VISIBLE);
}
MainDialog::~MainDialog()
{
}
long MainDialog::open\_mouth:nCreate(HWND hwnd, long param0, long param1)
{
MessageBox(hwnd, "OnCreate", "WM\_CREATE was successfully delivered", MB\_OK);
}
Die Fensterklasse MainDialog muss ihre Messagehandler (=OnCreate(…)) im Konstruktor bei der Windowklasse registieren.
long (Window::\*ptr)(HWND, long, long);
ptr = &MainDialog::open\_mouth:nCreate; //
Was muss ich machen damit der Compiler meinen Pointer auf eine MainDialog Methode als Pointer auf eine Window Methode akzeptiert. Das sollte doch eigentlich kein Problem sein, da MainDialog ja von Window abgeleitet ist - oder doch ?
Grüße,
Daniel Raffler