CreateWindowEx funktioniert einfach nicht!



  • Danke für die schnelle Antwort 🙂
    Hab die genannten Dinge jetzt gefixt:

    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    	WNDCLASSEX wndClass;
    	wndClass.cbSize= sizeof(WNDCLASSEX);
    	wndClass.style=WS_BORDER;
    	wndClass.lpfnWndProc= MessageHandler;
    	wndClass.cbWndExtra=0;
    	wndClass.cbClsExtra=0;
    	wndClass.hInstance=hInstance;
    	wndClass.hIcon= LoadIcon(NULL,IDI_WINLOGO);
    	wndClass.hIconSm= LoadIcon(NULL, IDI_WINLOGO);
    	wndClass.hCursor= LoadCursor(NULL, IDC_ARROW);
    	wndClass.hbrBackground= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wndClass.lpszMenuName=NULL;
    	wndClass.lpszClassName="WindowClass";
    
    	//Fensterklasse registrieren:
    	RegisterClassEx(&wndClass);
    
    	//Fenster auf dem Bildschirm ausgeben:
    	return CreateWindowEx("WindowClass","Programmname",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,200,300,NULL,NULL,hInstance,NULL);
    }
    

    Klappt nur leider immer noch nicht 😞 ...



  • Elektronix schrieb:

    Außerdem hast Du lpszMenuName nicht eingetragen (Wenn kein Menü gebraucht wird: NULL oder lpszAppName.

    NULL oder der Name des Resourcen-Menüs, wenn der lpszAppName ist, ok, sonst NULL. ( ➡ Falls kein Menü erstellt würde entspricht NULL nicht lpszAppName. Weiß nicht, ob das daraus hervorging 😉 ).

    Elektronix schrieb:

    Die IDs sind in der windows.h bzw. resource.h per #define festgelegt und werden durch die zugeordneten Integern ersetzt.

    Sie sind nur ein deinem Resourcen-Header definiert.

    Elektronix schrieb:

    [versehentliches Doppelposting wegen Serverabsturz.]

    Ohhja, das kenn ich 😡 , ...ist sowas von nervig 😉 .



  • CodeFinder schrieb:

    Elektronix schrieb:

    Außerdem hast Du lpszMenuName nicht eingetragen (Wenn kein Menü gebraucht wird: NULL oder lpszAppName.

    NULL oder der Name des Resourcen-Menüs, wenn der lpszAppName ist, ok, sonst NULL. ( ➡ Falls kein Menü erstellt würde entspricht NULL nicht lpszAppName. Weiß nicht, ob das daraus hervorging 😉 ).

    Elektronix schrieb:

    Die IDs sind in der windows.h bzw. resource.h per #define festgelegt und werden durch die zugeordneten Integern ersetzt.

    Sie sind nur ein deinem Resourcen-Header definiert.

    Nein. IDC_ARROW oder IDI_APPLICATION sind nicht in der Resourcendatei definiert. Die kann man auch verwenden, wenn man sonst keine Resourcen hat, also müssen sie in der windows.h stehen, oder in einer von windows.h includierten Headerdatei.
    Ach ja, die richtige Zeile heist dann:

    wndclass.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    


  • Im Grunde hab ichs ja so...



  • Was bezweckst Du damit:

    HWND CreateMainWindow(HINSTANCE hInstance)
    {...
    

    ?

    Und damit:

    return CreateWindowEx("WindowClass","Programmname",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,200,300,NULL,NULL,hInstance,NULL);
    }
    

    ?

    Versuch es doch mal so:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    LPCSTR lpszAppName = "AppName";
    LPCSTR lpszTitle   = "Meine erste Applikation";
    
    int APIENTRY WinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)//Statt APIENTRY geht auch WINAPI
    {
    
       HWND       hWnd;
       MSG        msg;
       WNDCLASSEX   wc;
    
       wc.cbSize        =  sizeof(WNDCLASSEX);
       wc.style         =  CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc   =  WndProc;
       wc.cbClsExtra    =  0;
       wc.cbWndExtra    =  0;
       wc.hInstance     =  hInstance;
       wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
       wc.hIcon         =  LoadIcon(NULL, IDI_APPLICATION);
       wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
       wc.lpszClassName =  lpszAppName;
       wc.lpszMenuName  =  lpszAppName;
       wc.hIconSm       =  LoadIcon(NULL, IDI_APPLICATION);
    
       if( RegisterClassEx(&wc) == 0)
          return 0;
    
       hWnd = CreateWindowEx(NULL,
                             lpszAppName,
                             lpszTitle,
                             WS_OVERLAPPEDWINDOW,
                             0,
                             0,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             NULL,
                             NULL,
                             hInstance,
                             NULL);
    
       if( hWnd == NULL)
          return 0;
    

    http://pronix.linuxdelta.de/C/win32/win32_1.shtml#4



  • Elektronix schrieb:

    Was bezweckst Du damit: [...]

    Damit kapselt er einfach den Erstellungsvorgang in ne Funktion.
    Ist aber -seh ich auch so- irgend wie überflüssig 😉 .

    Elektronix schrieb:

    Nein. IDC_ARROW oder IDI_APPLICATION sind nicht in der Resourcendatei definiert. Die kann man auch verwenden, wenn man sonst keine Resourcen hat, also müssen sie in der windows.h stehen, oder in einer von windows.h includierten Headerdatei.

    Jo klar, das sind ja aber nur die Standard-Images.

    PS: Wenn sie eine 'von windows.h includierten Headerdatei', stehen sie auch in der windows.h :p .



  • CodeFinder schrieb:

    Elektronix schrieb:

    Was bezweckst Du damit: [...]

    Damit kapselt er einfach den Erstellungsvorgang in ne Funktion.
    Ist aber -seh ich auch so- irgend wie überflüssig 😉 .

    Aha.
    Dann wärs vielleicht sinnvoll, die ganze WinMain zu posten, sonst sieht man die Zusammenhänge nicht. Wahrscheinlich sitzt ein Fehler noch woanders.

    Außerdem wurde die Funktion "MessageHandler" nicht an CreateMainWindow übergeben. lpfnWndProc ist also leer.



  • Elektronix schrieb:

    Außerdem wurde die Funktion "MessageHandler" nicht an CreateMainWindow übergeben. lpfnWndProc ist also leer.

    Wieso, muss sie doch auch nicht...Ich gehe mal stark davon aus das er eingangs davon einen (globalen!) Prototypen deklariert hat. Damit
    entfällt die Parameterübergabe.



  • CodeFinder schrieb:

    Ich gehe mal stark davon aus

    Ja, vermutlich...
    Ich mein ja nur-: veryXRV hat ein Problem, bei dessen Lösung wir helfen sollen. Da wir den Fehler nicht finden, liegt er wohl in einem Code-Teil, den er nicht mitgepostet hat. (Es sei denn, der Fehler ist schon behoben. Er meldet sich ja nicht mehr).



  • Jop, stimmt 😉 . Lassen wir das Rätselraten lieber 😉 .


Anmelden zum Antworten