Anfängerfehler- Fenster wird nicht angezeigt



  • Diesen Fehler hatte ich schon ein paar mal. Der Stoffteddy auf meinem Monitor grinst mich an, als wollte er sagen: "Mann, bist Du blöd"... 😡

    Hier mein Quellcode:

    #include <windows.h>
    #include <string.h>
    #include "03_Dialogfelder_resource.h"
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Dialogfelder";
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR czCmdLine, int iCmdShow)
    {
       WNDCLASSEX	wc;//Typ der Fensterklasse
    	HWND	hWnd; 	//Handle to a Window
       //HMENU hMenu;
       MSG	msg;		//Message
    
       wc.cbSize 		= sizeof(WNDCLASSEX);
       wc.style			= CS_HREDRAW| CS_VREDRAW; //Fensterstil
    	wc.lpfnWndProc = WndProc;  //long Pointer to a function-speichert die Addresse der Function,
       									//die die Nachrichten bearbeiten soll.
       wc.cbClsExtra	= 0;//reservieren zusätzlich Speicher für die Fensterklasse.
       wc.cbWndExtra	= 0;
       wc.hInstance	= hInstance; //Handle der Programminstanz
       wc.hCursor		= LoadCursor(NULL,IDC_ARROW);//Typ des Cursers; NULL = kein Cursor bzw. Standard
       wc.hIcon			= LoadIcon(NULL,IDI_APPLICATION);//Programmsymbol; NULL = kein eigenes Symbol bzw. Standard.
       wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);//Hintergrundfarbe
       wc.lpszMenuName   = MAKEINTRESOURCE(IDM_MENU1);//Name des Menüs in der Ressourcen-Datei. NULL = kein Menü
       wc.lpszClassName  = szAppName;//sz = string zero-terminated=String mit Abschlußzeichen 0
       									 //speichert den Namen der Fensterklasse.
       wc.hIconSm 			= (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16,16,0);
    
       if (!RegisterClassEx (&wc))//Meldet das Fenster im Fenstermanager bei Windows an.
    	{
                LPVOID lpMsgBuf;
                FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
                    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                    NULL, GetLastError (),
                    MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                    (LPTSTR) &lpMsgBuf, 0, NULL);
                MessageBox (NULL, (LPCTSTR)lpMsgBuf, "Error RegisterClass Main Window:",
                    MB_OK | MB_ICONSTOP);
                LocalFree (lpMsgBuf);
                return FALSE;
       }
    //hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDM_MENU1));
    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,	/*Fenster erstellen*/
    								szAppName, 			//Parameter: "lpszClassName"= Klassenname
                            "Dialogfelder",   //Parameter: "lpWindowName", steht in der Titelleiste
                            WS_OVERLAPPEDWINDOW|WS_VISIBLE, //Parameter: "dwStyle"
                            CW_USEDEFAULT,		//X-Position auf dem Monitor, Parameter "x"
                            CW_USEDEFAULT,   	//Y-Position auf dem Monitor, Parameter "y"
                            400,					//Fensterbreite, Parameter "nWidth
                            300,					//Fensterhöhe, Parameter "nHight"
                            NULL,					//Parameter "hWindowParent", Elternfenster
                            NULL,					//Parameter "hMenu"
                            hInstance,        //HINSTANCE
                            NULL);            //Parameter "lpPARAM"
    //hInst = hInstance;
    
       if(hWnd == NULL)
       {
          MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Fehler", MB_ICONEXCLAMATION|MB_OK);
          return 0;
       }
       ShowWindow (hWnd, iCmdShow);	//"iCmdShow" legt die Darstellungsform des Fensters fest (z. B.
                                     //minimiert, maximiert, versteck o.ä.. Kann auch mit einer
                                     //Konstanten belegt werden, darf aber nur einmal mit der Übergabe
                                     //iCmdShow belegt werden.
       UpdateWindow (hWnd);	//Fenster neu zeichnen nach Veränderungen.
    	while (GetMessage(&msg, NULL,0,0))	//2. Parameter = hWnd = Handle des Fensters, dessen
       												//Botschaft überprüft werden soll. Wenn hWnd = NULL, werden
                                           //alle Fenster der Anwendung abgefragt.
       {
    		TranslateMessage(&msg);	//Nachrichtenschleife
          DispatchMessage(&msg);
       }
    	return msg.wParam;
    }
    (...)
    

    Das Programm wird korrekt compiliert, aber das Fenster wird nicht angezeigt. Stattdessen die Messagebox "Fehler beim Erstellen des Fensters."
    Kurioserweise habe ich das Rumpfprogramm aus einem anderen funktionierenden Prog kopiert und nur entsprechend abgeändert. Aber irgendwo sitzt wieder so ein verdammter Bug. Ich vermute, daß der Fehler irgendwo beim Einbinden des Menüs liegt, kann ihn aber nicht finden. 😕 😕 😕

    Meine .rc:

    IDM_MENU1 MENU 
    {
     POPUP "&Dialogfelder"
     {
      MENUITEM "&Radio und Checkboxen", IDM_RADIO_CHECK
      MENUITEM "&Editfeld", IDM_EDIT
      MENUITEM "&Listbox", IDM_LIST
      MENUITEM SEPARATOR
      MENUITEM "&Beenden", IDM_EXIT
     }
    
     POPUP "Hilfe"
     {
      MENUITEM "Test", IDM_HELP
      MENUITEM "&Info", IDM_INFO
     }
    
    }
    

    Meine Resource.h

    #define IDD_DIALOG3	3
    #define IDC_CONTROLEDIT3	101
    #define IDC_CONTROLLISTBOX1	102
    
    #define IDD_DIALOG2	2
    #define IDC_CONTROLSTATICTEXT1	101
    #define IDC_CONTROLSTATICTEXT2	102
    #define IDC_CONTROLEDIT1	103
    #define IDC_CONTROLEDIT2	104
    
    #define IDD_DIALOG1	1
    #define IDC_CONTROLCHECKBOX1	101
    #define IDC_CONTROLCHECKBOX2	102
    #define IDC_CONTROLGROUPBOX1	104
    #define IDC_CONTROLRADIOBUTTON1	105
    #define IDC_CONTROLRADIOBUTTON2	103
    #define IDC_CONTROLRADIOBUTTON3	106
    
    #define IDM_MENU1	1
    #define IDM_INFO	11843
    #define IDM_HELP	11842
    #define IDS_INFO	11843
    #define IDS_HELP	11842
    
    #define CM_MENUITEMHILFEEINTRAG1	18873
    
    #define IDM_EXIT	11848
    #define IDM_LIST	11847
    #define IDM_EDIT	11846
    #define IDM_RADIO_CHECK	11845
    
    #define IDI_ICON1	1
    
    #define IDS_EXIT	11848
    #define IDS_LIST	11847
    #define IDS_EDIT	11846
    #define IDS_RADIO_CHECK	11845
    

    Helft mir, laßt mich nicht dumm sterben, damit ich meinem Teddy wieder in die Augen sehen kann.





  • Danke, aber leider hilft mir das nicht. Die Tutorials von Win-Api habe ich alle schon durchgemacht (hat auch alles gut gefunzt), nur leider gibt es dort keine Resourcen und auch nicht die Funktion CreateWindowEx(). Daher vermute ich, daß mein Problem eben damit zusammenhängt.



  • Ein Ansatz dürfte es sein, per GetLastError und FormatMessage herauszufinden, WELCHER Fehler überhaupt aufgetreten ist.

    (PS: Es ist nur ein Gedanke - aber solltest du dem Fenster nicht auch dein Menü mitgeben?)



  • Das Menü habe ich doch eingebunden mit

    wc.lpszMenuName   = MAKEINTRESOURCE(IDM_MENU1);
    

    Mit GetLastError kann ich leider noch nicht umgehen (den Teil habe ich mir von jemand anders kopiert, werde mich aber mal schlau machen (müssen 😃 )).

    Vielleicht kann mir jemand noch auf die Schnelle helfen?



  • @Menü: Vielleicht habe ich ja etwas übersehen - aber wo stellst du eine Beziehung zwischen dem WNDCLASSEX-Gebilde und dem erzeugten Fenster her?

    @GetLastError: Ersetz' einfach den if(hWnd==NULL) Block durch folgendes:

    if(hWnd==NULL)
      LPVOID buf;
      FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,GetLastError(),0,(LPTSTR)&buf,0,NULL);
      MessageBox(NULL,(LPTSTR)buf,"Fehler",MB_ICONEXCLAMATION|MB_OK);
      LocalFree(buf);
      return 0;
    }
    

    (ich sehe gerade, den RegisterClassEx()-Aufruf hast du schon auf diese Weise ausgewertet)



  • Soweit ich weiß ,geht das so:
    In WndClassEx wird definiert:

    wc.lpszClassName  = szAppName;//szAppName ist in WinMain oben deklariert.
    

    In CreateWindowEx wird dann angegeben:

    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,    
                         szAppName,            //Parameter: "lpszClassName"= Klassenname
    (...)
    

    Aber ich werde mal versuchen, den if- Block mit Deinem Codeschnipsel zu ersetzen. Hab ich js schon einmal gemacht.
    Danke für die Tips.



  • So, jetzt habe ich den Codeblock mit GetLastError statt des bisherigen if-Blocks eingefügt. Jetzt bekomme ich die lapidare Meldung:

    "Der Vorgang wurde ausgeführt."
    Wer hätte das gedacht.

    Toll, so weit war ich vorgestern auch schon. 😞 👎

    Wenn niemand eetwas Neues weiß, wird mir wohl nichts anderes übrig bleiben, als das Ganze nochmal neu zu programmieren- Schritt für Schritt.


Anmelden zum Antworten