Zeiger auf Memberfunktion in Memberfunktion

Von: , Frage gestellt am Mi, 12. Nov 2008

Liebes Forum!

Ihr kennt sicher alle das klassische Grundgerüst eines einfachen GUI Programms. (WNDCLASSEX, RegisterClassEx, CreateWindowEx, WindowProcedure, etc).

Ich möchte mir jetzt eine Art eigene kleine Console bauen, bestehend aus einem Fenster sowie zwei Edit Controls. Damit ich das ganze dan öfters verwenden kann möchte ich gleich eine Klasse cConsole daraus bauen.

Folgendes Problem:

Ich möchte der Variable lpfnWndProc vom Typ WNDPROC der WNDCLASSEX Struktur nun die entsprechende WindowProcedure zuweisen. Leider mag das der Kompiler nicht:

error: cannot convert `LRESULT (cConsole::*)(HWND__*, UINT, WPARAM, LPARAM)' to `LRESULT (*)(HWND__*, UINT, WPARAM, LPARAM)' in assignment

Im console.h ist die Klasse declariert:

#include <windows.h>
class cConsole
{
public:
int Create(HINSTANCE hThisInstance, int nCmdShow); //ctor
private:
HWND hwndInput;
HWND hwndOutput;
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
};


In der console.cpp folgt die Implementierung:

#include "Console.h"
#define CLASSNAME "ConsoleClass"
LRESULT CALLBACK cConsole::WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)                  /* handle the messages */
{
case WM_CREATE:
...
break;
case WM_SIZE:
...
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
int cConsole::Create(HINSTANCE hThisInstance, int nCmdShow)
{
HWND hwnd;               /* This is the handle for our window */
MSG messages;            /* Here messages to the application are saved */
WNDCLASSEX wincl;        /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = CLASSNAME;
wincl.lpfnWndProc = &cConsole::WindowProcedure;      /* This function is called by windows PROBLEM*/
wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
...
}


Außerhalb einer Klasse funktioniert das ganze perfekt. Ist ja auch autogeneriert beim Anlegen eines Win32 GUI Projekts in der IDE (Code::Blocks, MinGW).

Kann mir jemand helfen?
mfg dixxi

3 Antworten zu dieser Frage

  1. Antwort von nach 21 Stunden 0 hilfreich
    geht nicht

    Hallo Dixxi

    Die WindowProcedure MUSS global sein, so wie auch die WinMain(), geht nicht anders. Alles Weitere kann in der Klasse sein. Außerhalb einer Klasse funktioniert das ganze perfekt.
    Dann würde ich es so machen. Kann mir jemand helfen?
    Wobei denn nun? Du hast ja schon die Lösung.

    lG
    Martin B

    • Antwort von nach 22 Stunden 0 hilfreich
      Re: geht nicht

      Die WindowProcedure MUSS global sein, so wie auch die
      WinMain(), geht nicht anders. Alles Weitere kann in der Klasse
      sein.
      Ok, dann formulier ich meine Frage anders. Wie schaffe ich es zwei, oder mehrere Fenster offen zu haben und zu verwalten? Beispielsweise, wenn ich auf eine Taste drücke soll das entsprechende Window diesen Buchstaben als Caption bekommen. Wenn die WindowProcedure global ist, kann ich sie doch nur einmal haben?

      Wäre für jeden Rat dankbar.
      mfg dixxi

      • Antwort von nach 2 Tagen 0 hilfreich
        Re^2: Child-Window

        Hallo Dixxi Die WindowProcedure MUSS global sein, so wie auch die
        WinMain(), geht nicht anders. Alles Weitere kann in der Klasse
        sein.
        Ok, dann formulier ich meine Frage anders. Wie schaffe ich es
        zwei, oder mehrere Fenster offen zu haben und zu verwalten?
        Beispielsweise, wenn ich auf eine Taste drücke soll das
        entsprechende Window diesen Buchstaben als Caption bekommen.
        Wenn die WindowProcedure global ist, kann ich sie doch nur
        einmal haben?

        Dann machst Du ein Child-Fenster, auch mit CreateWindow(), die kriegt spezielle Konstanten, damit sie ein Child macht.
        Das Child braucht dann eine eigene WindowProcedure.

        Ich habe mich aber nie viel damit abgegeben: ich kann ja eine eigene *.exe machen und die dann mit ShellExecute() starten. Die Daten kann man dann über SendMessage() austauschen, oder Dateien, oder oder.

        Google mal auf "win32.hlp", in dem dann CreateWindow() und ShellExecute() nachgucken, das bringt's. Da findest Du sicher auch eine Set-irgendwas(), um ihm die Caption rein zu drücken.

        lG
        Martin B

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!