Fehler bei CreateWindowEx



  • Hallo Community,

    ich möchte mittels CreateWindowEx ein einfaches Fenster erzeugen,
    allerdings wird das Fenster nicht erzeugt, weil mein

    hwnd
    

    "0" zurückgibt, somit wird meine if Bedingung

    if(hwnd == NULL)
    

    wahr und ich bekomme einen Fehler angezeigt.
    Wenn ich dann aber nach CreateWindowEx folgendes einfüge:

    RECT rect;
    

    wird das Fenster ohne Fehler erzeugt.

    Hier mal der Code um es zu verdeutlichen:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
    {
    char szName[] = "MyWindowClass";
    HWND hwnd; 
    
    HBRUSH MyBrush = CreateSolidBrush( RGB( 65,105,225));
    
    WNDCLASSEX wc;
    
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.style         = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc   = WndProc; 
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hI;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = MyBrush; 
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szName;
    
    RegisterClassEx (&wc);
    
         hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, szName, "Fenster", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
                              300, 100, 400, 700, NULL, NULL, hI, NULL); 
    
           RECT rect;
    
     if(hwnd == NULL)
     {
     MessageBox(NULL, "Fenstererzeugung fehlgeschlagen!", "Fehler!",
     MB_ICONEXCLAMATION | MB_OK);
     return 0;
     }
    
    ShowWindow   (hwnd, iCmdShow);
    UpdateWindow (hwnd);
    

    Kann mir vielleicht jemand erklären warum das ohne das

    RECT rect;
    

    nicht funktioniert und wofür ist das überhaupt?
    Steh total auf dem Schlauch, habe schon rumgegoogelt aber nix passendes dazu gefunden.

    Vielen Dank schonmal

    Gruß Deejay



  • Hi,

    also warum es nur mit dem RECT dann funktioniert, keine Ahnung.

    Deine WndClass Parameter wc.cbClsExtra und wc.cbWndExtra initialisierst du 2mal. Is aber nicht das Problem.

    Der WNDCLASSEX Struckt hat noch einen Member hIconSm, der nicht initialisiert ist, evtl. liegt es daran.

    Füge vor dem Initialisieren einfach ein

    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    

    ein.

    Damit setze ich grundsätzlich immer erstmal alle structs auf 0.

    Bedenke, es kann gerade beim Thema Nicht-Initialisierte-Variablen auch gerne mal undefiniertes Verhalten geben. Dann auch mal zwischen Debug und Release Versionen.



  • deejayextasy schrieb:

    ich möchte mittels CreateWindowEx ein einfaches Fenster erzeugen, allerdings wird das Fenster nicht erzeugt, weil mein

    hwnd
    

    "0" zurückgibt, somit wird meine if Bedingung

    if(hwnd == NULL)
    

    wahr und ich bekomme einen Fehler angezeigt.
    Wenn ich dann aber nach CreateWindowEx folgendes einfüge:

    RECT rect;
    

    wird das Fenster ohne Fehler erzeugt.

    ...

    Kann mir vielleicht jemand erklären warum das ohne das

    RECT rect;
    

    nicht funktioniert und wofür ist das überhaupt?
    Steh total auf dem Schlauch, habe schon rumgegoogelt aber nix passendes dazu gefunden.

    Wenn man alle Returnwerte prüfen würde, würde man feststellen, das schon das
    Registrieren der Fensterklasse nicht funktioniert hat.

    Das rect ist definitiv Unsinn und führt bei mir zu:

    warning C4101: 'rect': Unreferenzierte lokale Variable
    

    Bei mir erscheint kein Fenster solange der Fehler besteht.

    Wenn sich wirklich der Wert von hwnd ändert durch das Hinzufügen einer
    nicht verwendeten Variable würde ich den Compiler entsorgen ...



  • merano hat es schon geschrieben - "alle" Return Werte Prüfen.

    GetLastError()
    

    bitte nicht vergessen zu verwenden.
    Hilft fast immer, wenn die direkten return values keinen Aufschluss auf den Fehler geben sollten.



  • Vielen Dank für die Anregungen, ich war die letzten Tage im Urlaub, kann mich deswegen erst heute melden.

    Der Fehler war wie Mathi schon sagte, das ich hIconSm nicht Initialisiert habe.

    Warum meine IDE auf die RECT Variable reagiert hat, wundert mich auch,
    meine IDE ist CodeBlocks, hat mir eigentlich bis hierhin ganz gut gefallen.

    Könnt ihr mit eventuell andere empfehlen?

    Vielen Dank auf jedenfall für eure Hilfe

    MFG DeeJayExTasy



  • Ich würde dir Visual Studio empfehlen. Eine IDE mit allem drum und dran.

    Visual Studio benutzt jedoch nicht den MinGW Compiler wie CodeBlocks.



  • deejayextasy schrieb:

    Warum meine IDE auf die RECT Variable reagiert hat, wundert mich auch,
    meine IDE ist CodeBlocks, hat mir eigentlich bis hierhin ganz gut gefallen.

    Könnt ihr mit eventuell andere empfehlen?

    Eine IDE reagiert i.d.R. nicht auf unnütze Deklarationen. Das ist Aufgabe des Compilers oder auch
    spezieller Tools wie z.B. lint oder valgrind.

    Unter Windows ist Visual-Studio eine gute Wahl.


Anmelden zum Antworten