Zeiger auf Memberfunktion in Memberfunktion

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 

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

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

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

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