Api oo

Hi,
Ich bastle gerade an eine etwas größeren API-Programm und habe gemerkt das die Standartarchitektur (main + callback) nach einiger Zeit recht unübersichtlich wird. Also habe ich beschlossen für jedes Fenster eine Klasse zum abarbeiten der Messages anzulegen.

class window\_callback
{
 private:
 int wm\_quit(...);
 int wm\_paint(...);

 public:
 window\_callback();
 ~window\_callback();

 LRESULT CALLBACK WindowProc(..); // Hier werden eingehende Nachrichten sortiert
};

Die Message-Klassen werden von der main() Funktion aufgerufen:

// global
window\_callback msg\_class;

int main(..)
{
 WNDCLASSEX wndclass;
 ...
 wndclass.lpfnWndProc = msg\_class.WindowProc;
 ....

Der Compiler beschwert sich über die letze Zeile:
no matches converting function WindowProcedure' to type
candidates are: LRESULT

Weiß jemand was ich falsch mache ?
Ohne den Klassen hat das ganze ja schließlich funktioniert, deshalb kann ich mir nicht vorstellen das es sich nur um einen falschen Funktionstyp handelt.

Grüße,
Daniel Raffler

Hallo,

Das Problem an der CallBackfunktion als Methode besteht schlicht darin, daß Du der wndclasssex einen Zeiger auf eine Funktion liefern mußt.
dazu mußt Du aber die Adresse der Funktion liefern.
so:

wndclass.lpfnWndProc = window\_callback::WindowProc;

Das zweite Prob ist die Argumentenliste. Bei Zeigern auf Funktionen, muß die Argumentenliste bei der Deklaration angegeben werden. Da dies aber in der WinApi gemacht wird, kommst Du nicht mehr ran. Wenn Du eine Methode einer Klasse aufruft, wird als „verstekter“ Parameter immer der this Zeiger mitgegeben, undd schon funktioniert das ganze nicht mehr. Du wirst also die Callback statisch machen müssen. Dann ergibt sich aber ein neues Problem, Du kommst in der Methode nicht mehr an den This ran, und kannst nicht mehr auf die Variablen der Klasse zugreifen.

viel spass.

grüße, Micha

Hi Micha,
danke für deine Hilfe. Das ganze scheint doch etwas komplizierter zu sein als ich dachte. Habe jetzt beschlossen die WindowProc Methode aus der Klasse zu entfernen, so dass sie jetzt wirklich nur noch die einzelnen Messages abarbeitet. Ideal ist diese Lösung wohl nicht, aber mir fällt zur Zeit nichts besseres ein und bei google finde ich auch nichts vernünftiges.

Grüße,
Daniel Raffler