WNDCLASSEX.lpfnWndProc



  • Die Struktur WNDCLASSEX hat ja bekanntlich die Variable lpfnWndProc in sich. Diese will mit der CALLBACK FUnktion gefüllt werden. Das wäre auch alles kein Problem, aber leider kennt die .cpp Datei, in der ich diese Struktur befülle die WIndowProc Funktion nicht. Ich habe eine Hauptdatei( In der ebent auch die Nachrichtenschleife ist) und eine, in der eine CreateMainWindow Funktion definiert ist( und in der auch die Funktion befüllt wird). Wenn ich jetzt dort die Funktion übergeben will, ist diese logischerweise nicht bekannt. Wie schafft man jetzt also die Information über diese Funktion in die 2. Datei . Ich habe es mit einem Funktionszeiger

    [LRESULT(*p_WindowProc) (HWND mah,UINT message, WPARAM wParam, LPARAM lParam)]

    als Parameter der CreateMainWindow Funktion. Das wirft allerdings folgenden Fehler aus:

    Konvertierung des Parameters 2 von 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' in 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' nicht möglich

    Was mir jetzt nciht klar ist: In der Struktur befindet sich ja auch ein FUnktionszeiger.
    Wieso sind mein Funktionszeiger und die Callback nicht identisch?

    Oder gibt es für das, was ich vorhabe andere bessere Möglichkeiten? 😕



  • Den Funktionsprototypen schon vorher anlegen...
    also Bsp:

    #include <iostream>
    using namespace std;
    
    void Function ();
    
    int main ()
    {
         Function ();
         return 0;
    }
    
    void Function ()
    {
        cout << "Hallo Welt!";
    }
    

    Außerdem musst bei dem Parameter nur den Funktionsnamen angeben, nicht die Funktion mit Parametern, also

    bla.lpfnWndProc = MyCallback;
    

    anstatt

    bla.lpfnWndProc = MyCallback (...);
    


  • Ich heiß jetzt anders schrieb:

    Den Funktionsprototypen schon vorher anlegen...
    also Bsp:

    #include <iostream>
    using namespace std;
    
    void Function ();
    
    int main ()
    {
         Function ();
         return 0;
    }
    
    void Function ()
    {
        cout << "Hallo Welt!";
    }
    

    Außerdem musst bei dem Parameter nur den Funktionsnamen angeben, nicht die Funktion mit Parametern, also

    bla.lpfnWndProc = MyCallback;
    

    anstatt

    bla.lpfnWndProc = MyCallback (...);
    

    Wenn ich dich richtig verstehe soll die Datei jetzt so aussehen:

    //Includes
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    int WINAPI WinMain (HINSTANCE hInst,HINSTANCE hPrevInstance, LPSTR lpcmdlinde, int ncmdshow)
    {
    CreateAppWindow(hInst);
    }
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam)
    {
    	return (DefWindowProc(mah,message,wParam,lParam));
    }
    

    Und dann eben in der anderen Datei:

    //Includes
    
    int CreateAppWindow(HINSTANCE hInst2)
    {
    	     WCHAR NAME[256];
    	    char* pmbhello="MAIN";
            MultiByteToWideChar( CP_ACP, 0, pmbhello,
            strlen(pmbhello)+1, NAME,sizeof(NAME)/sizeof(NAME[0]) );
    	    WNDCLASSEX windowclass;
    	    windowclass.cbSize= sizeof(WNDCLASSEX);
    		windowclass.style= CS_HREDRAW|CS_VREDRAW;
    		windowclass.lpfnWndProc =WindowProc;
    		windowclass.cbClsExtra = 0;
    		windowclass.cbWndExtra = 0;
    		windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    		windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    		windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
    		windowclass.lpszMenuName=NULL;
    		windowclass.lpszClassName =(LPCWSTR)"Main";
    		RegisterClassEx (&windowclass);
    
    		mah= CreateWindowEx(NULL,
    							NAME,
    							NAME,
    							WS_VISIBLE|WS_POPUP,
    							0,0,
    						    GetSystemMetrics(SM_CXSCREEN), 
                                GetSystemMetrics(SM_CYSCREEN), 
    							NULL,
    							NULL,
    							hInst2,
    							NULL);
    
    return 0;
    }
    

    [Jetzt pls nicht über schlechten Stil beschweren, dass ist nur ein Test!]

    Also ich habe das jetzt so versucht, aber dann bekomme ich die Meldung:

    error C2065: 'WindowProc': nichtdeklarierter Bezeichner

    So geht es also leider nciht 😞

    Noch andere Vorschläge? 😃



  • LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    

    muss noch vor den include, also z.B.

    #include <windows>
    
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    
    #include "functions.hpp"
    


  • Schon wieder nicht 😞

    Der COde sieht jetzt so aus

    #include <windows.h>
    
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    #include "GlobalExVar.h"
    #include "AGO.h"
    #include "InitMainAppWindow.h"
    #include "LRESULT.h"
    int WINAPI WinMain (HINSTANCE hInst,HINSTANCE hPrevInstance, LPSTR lpcmdlinde, int ncmdshow)
    {
    
    CreateAppWindow(hInst,WindowProc);
    return 0;
    }
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam)
    {
    return (DefWindowProc(mah,message,wParam,lParam));
    }
    
    #include <windows.h>
    #include "InitMainAppWindow.h"
    #include "GlobalExVar.h"
    int CreateAppWindow(HINSTANCE hInst2,LRESULT (*WindowProcP) (HWND mah,UINT message, WPARAM wParam, LPARAM lParam))
    {
    	WNDCLASSEX windowclass;
    	     WCHAR NAME[256];
    	    char* pmbhello="MAIN";
            MultiByteToWideChar( CP_ACP, 0, pmbhello,
            strlen(pmbhello)+1, NAME,sizeof(NAME)/sizeof(NAME[0]) );
    	    windowclass.cbSize= sizeof(WNDCLASSEX);
    		windowclass.style= CS_HREDRAW|CS_VREDRAW;
    		windowclass.lpfnWndProc=WindowProcP;
    		windowclass.cbClsExtra = 0;
    		windowclass.cbWndExtra = 0;
    		windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    		windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    		windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
    		windowclass.lpszMenuName=NULL;
    		windowclass.lpszClassName =(LPCWSTR)"Main";
    		RegisterClassEx (&windowclass);
    
    		mah= CreateWindowEx(NULL,
    							NAME,
    							NAME,
    							WS_VISIBLE|WS_POPUP,
    							0,0,
    						    GetSystemMetrics(SM_CXSCREEN), 
                                GetSystemMetrics(SM_CYSCREEN), 
    							NULL,
    							NULL,
    							hInst2,
    							NULL);
    
    return 0;
    }
    

    Leider folgt folgende Fehlermeldung( die die auch schon am Anfang war):

    **1>Kompilieren...
    1>AGO.cpp
    1>c:\users\nils\desktop\myengine\ago-engine\ago-engine\ago.cpp(12) : error C2664: 'CreateAppWindow': Konvertierung des Parameters 2 von 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' in 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' nicht möglich
    1> Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein
    1>InitMainAppWindow.cpp
    1>c:\users\nils\desktop\myengine\ago-engine\ago-engine\initmainappwindow.cpp(13) : error C2440: '=': 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden
    1> Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    1>Code wird generiert...
    **

    Ich hoffe auf eine Lösung, mir fehlen langsam die Ideen 😞 .



  • Also das

    **: error C2664: 'CreateAppWindow': Konvertierung des Parameters 2 von 'LRESULT (__stdcall )(HWND,UINT,WPARAM,LPARAM)' in 'LRESULT (__cdecl )(HWND,UINT,WPARAM,LPARAM)' nicht möglich
    ist das Problem. Die andere Meldung habe ich nur falsch kopiert!
    😃



  • ähm..die windowproc sollte bei der befüllung von der WNDCLASSEX struktur schon bekannt sein... du kannst sie ja in dieser datei deklarieren und dann in main.cpp definienren.



  • Ich heiß jetzt anders schrieb:

    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    

    muss noch vor den include, also z.B.

    #include <windows>
    
    LRESULT CALLBACK WindowProc (HWND mah,UINT message, WPARAM wParam, LPARAM lParam);
    
    #include "functions.hpp"
    

    war mein fehler, lass mal die parameter weg, also:

    LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM);
    


  • Das funktioniert auch nciht so richtig. Habe es jetzt über eine globale Struktur gelöst. Das ist zwar nicht besonders guter STil, aber das sollte auch erstmal nur ein Test werden!

    Danek an Alle ⚠ ⚠ ⚠ ⚠ ⚠


Anmelden zum Antworten