Menü auch ohne ExtendedClass-Anmeldung ???



  • Hey!! ..

    Ich versuche gerade ein Fenster mit Menüpunkten zu erstellen. Dazu habe ich mir mal Beispiele aus dem Net geholt ..

    Bei der Anmeldung des Fensters habe ich jedoch früher nie eine gesamte WINDOWCLASSEX angemeldet ..

    also nie so:

    wc.cbSize = sizeof(WNDCLASSEX);
       wc.style = 0;
       wc.lpfnWndProc = WndProc;
       wc.cbClsExtra = 0;
       wc.cbWndExtra = 0;
       wc.hInstance = hInstance;
       wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
       wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
       wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU1);  //HIER MUSS JA DIE BEZEICHNUNG DES MENÜS HIN
       wc.lpszClassName = MainClassName;
       wc.hIconSm         = LoadIcon(hInstance, IDI_APPLICATION);
    

    sonder immer mit:

    HWND Fenster = CreateWindowEX(0, WC_DIALOG, ... ) // ERSTELLUNG DES FENSTERS OHNE KLASSENANMELDUNG
    

    Meine Frage nun:
    Gibt es eine Möglichkeit ohne eine Klassenanmeldung (so wie oben) ein Fenster mit einem Menü zu erstellen ???


  • Mod

    MSDN oder Tutorial lesen: SetMenu!



  • Danke werds mir ansehen ^^ ..



  • Also folgendes hab ich jetzt aber das Menü zeigt sich nicht ..

    Menü.cpp

    #include <windows.h>
    #include <resource.h>
    
    bool Prozedur(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         if(message == WM_CLOSE)
         {
                    PostQuitMessage(0);
                    }
    
         return 0;
         }
    
    int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        MSG msg;
        HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL);
    
        SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur);
        SetMenu(Fenster, (HMENU)MAKEINTRESOURCE(IDR_MENU1));
    
        while(GetMessage(&msg, NULL, 0, 0))
        {
                               TranslateMessage(&msg);
                               DispatchMessage(&msg);
                               }
        return 0; 
        }
    

    resource.rc

    IDR_MENU1 MENU
    BEGIN
        POPUP "Datei"
        BEGIN
            MENUITEM "Öffnen",             ID_FILE_OPEN
            MENUITEM "Speichern",          ID_FILE_SAVE
            MENUITEM "Ende",               ID_FILE_EXIT
        END
        POPUP "Optionen"
        BEGIN
            POPUP "Optionen"
            BEGIN
                MENUITEM "Option&1",       ID_OPTIONS_OPTIONS_OPTION1
                MENUITEM "Option&2",       ID_OPTIONS_OPTIONS_OPTION2
            END
        END
        MENUITEM "Über",                   ID_ABOUT
    END
    
    /////////////////////////////////////////////////////////////////
    //
    //Stringtabelle
    //
    STRINGTABLE
    BEGIN
            ID_STRING_OPEN,      "Der Dialog Öffnen"
            ID_STRING_SAVE,      "Der Dialog Speichern"
            ID_STRING_OPTION1,   "Erste Option im Untermenü"
            ID_STRING_OPTION2,   "Zweite Option im Untermenü"
            ID_STRING_ABOUT,     "Ein Menü-Beispiel\nCoded by J.Wolf"
    END
    

    resource.h

    #define ID_STRING_OPEN                  1
    #define ID_STRING_SAVE                  2
    #define ID_STRING_OPTION1               3
    #define ID_STRING_OPTION2               4
    #define ID_STRING_ABOUT                 5
    
    #define IDR_MENU1                       101
    
    #define ID_FILE_OPEN                    40001
    #define ID_FILE_SAVE                    40002
    #define ID_FILE_EXIT                    40003
    #define ID_OPTIONS_OPTIONS_OPTION1      40004
    #define ID_OPTIONS_OPTIONS_OPTION2      40005
    #define ID_ABOUT                        65535
    

    was mach ich noch falsch -.- .. Danke für alle weiteren Bemühungen !!!



  • Du könntest das Menü aus den Resourcen erstmal laden:
    http://msdn.microsoft.com/en-us/library/ms647990(VS.85).aspx



  • also ich weiss nicht recht das will i-wie alles nich so recht hinhauen sry ..

    kann jemand konkret sagen welche Funktionen ich brauche bzw. wo genau ich sie

    aufrufen muss ?! ..

    so sieht mein derzeitiger Versuch aus:

    HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL);
    
        SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur);
        LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
        SetMenu(Fenster, (HMENU)MAKEINTRESOURCE(IDR_MENU1));
    


  • Ich würde für SetMenu den Rückgabeparameter von LoadMenu verwenden.



  • Juhuuuuuu !!!! xDDD .. funzt danke

    ich hatte sowas vorher schonmal probiert also sowas wie:

    char a = LoadMenu( ... );
    SetMenu(Fenster, a);

    aber da der erforderliche Wert ja HWND ist (hätt ich wissen müssen) musses ja anders aussehen ..

    Danke! ..

    Nochmal der cpp-Source-Code für Leute die ähnliche Probleme haben:

    #include <windows.h>
    #include <resource.h>
    
    bool Prozedur(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         if(message == WM_CLOSE)
         {
                    PostQuitMessage(0);
                    }
    
         return 0;
         }
    
    int WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
        HMENU a = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
    
        MSG msg;
        HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL);
    
        SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur);
    
        SetMenu(Fenster, a);
    
        while(GetMessage(&msg, NULL, 0, 0))
        {
                               TranslateMessage(&msg);
                               DispatchMessage(&msg);
                               }
        return 0; 
        }
    

    Nun müsst ihr nur noch die resource-datei + header datei schreiben ..
    Diese stehen ganz oben ..


Anmelden zum Antworten