Menüs ;((



  • Hi,

    ich habe ein Problem ich habe mein zweiten Fenster Kategorien angelegt, eben Menüs.

    Infos Datei
    Autoren > Rene Polifka Beenden
    Ausgabe

    Er macht das nicht so, er gibt sowas aus:

    Infos Datei
    Autoren Beenden
    Ausgabe

    Da muss ein Problem mit die mii.hSubMenu sein

    Code:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    LRESULT CALLBACK WndProc_2 (HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) 
    {
    
    /// Fenster 01
    WNDCLASS WndClass;
    WndClass.style = 0;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.lpfnWndProc = WndProc;
    WndClass.hInstance = hInstance;
    WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    WndClass.hCursor = 0;
    WndClass.hIcon = 0;
    WndClass.lpszMenuName = 0;
    WndClass.lpszClassName = "WinProg";
    
    /// Fenster 02
    WNDCLASS WndClass_2;
    WndClass_2.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style"
    WndClass_2.cbClsExtra = 0;
    WndClass_2.cbWndExtra = 0;
    WndClass_2.lpfnWndProc = WndProc_2;
    WndClass_2.hInstance = hInstance;
    WndClass_2.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);
    WndClass_2.hCursor = 0;
    WndClass_2.hIcon = 0;
    WndClass_2.lpszMenuName = 0;
    WndClass_2.lpszClassName = "Win2";
    
    // Registriere die Fenster
    RegisterClass(&WndClass);
    RegisterClass(&WndClass_2);
    
    // Erstelle Fenster
    HWND hWindow;
    
    hWindow = CreateWindow("WinProg","Fenster01", WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hWindow, nCmdShow);
    
    UpdateWindow(hWindow);
    
    HWND hWindow_2;
    
    hWindow_2 = CreateWindow("Win2","Fenster02", WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hWindow_2, nCmdShow);
    
    UpdateWindow(hWindow_2);
    
    // Fensterinfos für jedes Fenster 1while
    
    MSG Message;
    
    while (GetMessage(&Message, NULL, 0, 0)) 
    {
    DispatchMessage(&Message);
    }
    
    MSG Message_2;
    
    while (GetMessage(&Message_2, NULL, 0, 0)) 
    {
    DispatchMessage(&Message_2);
    }
    
    return (Message_2.wParam);
    
    }
    
    // Für jedes Fenster eine Funktion 
    LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam)
    {
    switch(uiMessage)
    {
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc (hWnd, uiMessage,
    wParam, lParam);
    }
    }
    
    LRESULT CALLBACK WndProc_2 (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam)
    {
    HDC hdc;
    PAINTSTRUCT ps;
    switch(uiMessage)
    {
    
    // Menüs
    case WM_CREATE:
    
    HMENU hMenu;
    hMenu = CreateMenu();
    MENUITEMINFO mii;
    
    mii.cbSize = sizeof(MENUITEMINFO);
    mii.fMask = MIIM_TYPE | MIIM_ID;
    mii.fType = MFT_STRING;
    
    char *string;
    string = new char[40];
    mii.dwTypeData = string;
    mii.cch = lstrlen (string);
    mii.fState = MFS_ENABLED;
    
    /// Kategorien
    HMENU hMenu1;
    
    hMenu1 = CreatePopupMenu ();
    lstrcpy (string, "Beenden");
    mii.wID = 1;
    InsertMenuItem (hMenu1, 0, FALSE, &mii);
    
    /// Menü
    lstrcpy (string, "Datei");
    mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
    mii.hSubMenu = hMenu1;
    InsertMenuItem (hMenu, 0, FALSE, &mii);
    
    /// Kategorien von Infos 
    
    HMENU hMenu2;
    
    // zweit Kategorie von Kategorie Autoren
    HMENU hMenu3;
    hMenu3 = CreatePopupMenu ();
    lstrcpy (string, "Rene Polifka");
    mii.wID = 2;
    InsertMenuItem (hMenu3, 0, FALSE, &mii);
    
    hMenu2 = CreatePopupMenu ();
    lstrcpy (string, "Autoren");
    mii.fMask = MIIM_TYPE | MIIM_ID;
    mii.hSubMenu = hMenu3;
    InsertMenuItem (hMenu2, 0, FALSE,  &mii);
    lstrcpy (string, "Ausgaben");
    InsertMenuItem (hMenu2, 0, FALSE,  &mii);
    
    // Menü
    lstrcpy (string, "Infos");
    mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
    mii.wID = 5;
    mii.hSubMenu = hMenu2;
    InsertMenuItem (hMenu, 0, FALSE, &mii);
    
    SetMenu (hWnd, hMenu);
    delete [] string;
    return 0;
    
    //////////////////////////
    
    case WM_PAINT:
    hdc = BeginPaint (hWnd, &ps);
    SetTextColor( hdc, RGB( 255, 255, 255) ); // weiß
    SetBkColor ( hdc, RGB( 132, 130, 132) ); // grau
    TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20);
    EndPaint (hWnd, &ps);
    return 0;
    
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc (hWnd, uiMessage,
    wParam, lParam);
    }
    }
    

    Er erzeugt keine Untermenüs, kann einer mir helfen 😞 ???

    Help me :xmas2: !!!



  • auf den ersten blick sind deine while-schleifen in der winmain falsch (du brauchst keine 2 davon... eine genuegt). so sollte sie aussehen:

    MSG msgMain ; 
        while (GetMessage (&msgMain, NULL, 0, 0)){ 
            TranslateMessage (&msgMain) ; 
            DispatchMessage (&msgMain) ; 
        }
        return msgMain.wParam ;
    


  • Es sind doch 2 Fenster und für jedes Fenster 1while Schleife, wenn ich 1 nur habe, schließen sich alle zwei Fenster und es soll ja so gehen das wenn das eine geschlossen wird das andere Fenster noch da bleibt..

    So und wo ist jetzt der Fehler beim die Menüs, kann doch nett sein das im Beispiel alles geht und wenn ich was mache das mit die untermenüs nicht geht..



  • die while-schleife ist für dein gesammtes prog und nicht für einzelne fenster.



  • Aktualisierter Code:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) 
    {
    
    /// Fenster 01
    WNDCLASS WndClass;
    WndClass.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style"
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.lpfnWndProc = WndProc;
    WndClass.hInstance = hInstance;
    WndClass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);
    WndClass.hCursor = 0;
    WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WndClass.lpszMenuName = 0;
    WndClass.lpszClassName = "WinProg";
    
    // Registriere die Fenster
    RegisterClass(&WndClass);
    
    // Erstelle Fenster
    HWND hWindow;
    
    hWindow = CreateWindow("WinProg","OPENSOURCE Source CD#1", WS_OVERLAPPEDWINDOW,200,160,600,400,NULL,NULL,hInstance,NULL);
    
    ShowWindow(hWindow, nCmdShow);
    
    UpdateWindow(hWindow);
    
    // Fensterinfos für jedes Fenster 1while
    
    MSG Message;
    
    while (GetMessage(&Message, NULL, 0, 0)) 
    {
    TranslateMessage (&Message) ;  
    DispatchMessage(&Message);
    }
    return (Message.wParam);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam)
    {
    HDC hdc;
    PAINTSTRUCT ps;
    switch(uiMessage)
    {
    // Menüs
    
    case WM_CREATE:
    
    HMENU hMenu;
    hMenu = CreateMenu ();
    MENUITEMINFO mii;
    mii.cbSize = sizeof(MENUITEMINFO);
    mii.fMask = MIIM_TYPE | MIIM_ID;
    mii.fType = MFT_STRING;
    
    char *string;
    string = new char[200];
    mii.dwTypeData = string;
    mii.cch = lstrlen (string);
    mii.fState = MFS_ENABLED;
    
    HMENU hMenu2;
    hMenu2 = CreatePopupMenu ();
    lstrcpy (string, "Beenden");
    mii.wID = 1;
    InsertMenuItem (hMenu2, 0, FALSE,  &mii);
    
    lstrcpy (string, "Datei");
    mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
    mii.hSubMenu = hMenu2;
    InsertMenuItem (hMenu, 0, FALSE,  &mii);
    
    HMENU hMenu2_;
    hMenu2_ = CreatePopupMenu ();
    lstrcpy (string, "Autor");
    mii.fMask = MIIM_TYPE | MIIM_ID;
    mii.wID = 2;
    InsertMenuItem (hMenu2_, 0, FALSE,  &mii);
    
    HMENU hMenu3;
    hMenu3 = CreatePopupMenu ();
    lstrcpy (string, "Farbtiefe");
    mii.fMask = MIIM_TYPE | MIIM_ID;
    mii.wID = 3;
    InsertMenuItem (hMenu3, 0, FALSE,  &mii);
    lstrcpy (string, "Aufloesung");
    mii.wID = 4;
    InsertMenuItem (hMenu3, 0, FALSE,  &mii);
    
    HMENU hMenu3_;
    hMenu3_ = CreatePopupMenu ();
    lstrcpy (string, "Windows Verzeichniss");
    mii.wID = 5;
    InsertMenuItem (hMenu3_, 0, FALSE,  &mii);
    lstrcpy (string, "Aktuelles Verzeichniss");
    mii.wID = 6;
    InsertMenuItem (hMenu3_, 0, FALSE,  &mii);
    
    lstrcpy (string, "Grafik");
    mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
    mii.hSubMenu = hMenu3;
    InsertMenuItem (hMenu2_, 0, FALSE,  &mii);
    lstrcpy (string, "Festplatte");
    mii.hSubMenu = hMenu3_;
    InsertMenuItem (hMenu2_, 0, FALSE,  &mii);
    
    lstrcpy (string, "Information");
    mii.hSubMenu = hMenu2_;
    InsertMenuItem (hMenu, 0, FALSE,  &mii);
    
    //// ->>> Das Menü will nicht klappen >>>>
    
    HMENU hMenu_cc;
    hMenu_cc = CreatePopupMenu ();
    lstrcpy (string, "Woka");
    mii.wID = 7;
    InsertMenuItem (hMenu_cc, 0, FALSE,  &mii);
    
    HMENU hMenu_rr;
    hMenu_rr = CreatePopupMenu ();
    lstrcpy (string, "Oka");
    mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
    mii.hSubMenu = hMenu_cc;
    InsertMenuItem (hMenu_rr, 0, FALSE,  &mii);
    
    lstrcpy (string, "Infos");
    mii.hSubMenu = hMenu_rr;
    InsertMenuItem (hMenu, 0, FALSE, &mii);
    
    // ->>> Das Menü will nicht klappen >>>>
    
    SetMenu (hWnd, hMenu);
    delete [] string;
    
    return 0;
    ///////////////////////////////
    
    case WM_PAINT:
    hdc = BeginPaint (hWnd, &ps);
    SetTextColor( hdc, RGB( 255, 255, 255) ); // weiß
    SetBkColor ( hdc, RGB( 132, 130, 132) ); // grau
    
    //////////////
    
    static BITMAPFILEHEADER *pbmfh;
    static BITMAPINFO *pbmi;
    static BYTE *pBits;
    static int cxDib, cyDib;
    
    DWORD dwFileSize, dwHighSize, dwBytesRead; 
    HANDLE hFile;
    hFile = CreateFile ("Logo.bmp", GENERIC_READ,
                                 FILE_SHARE_READ, NULL,
                                 OPEN_EXISTING,
                                 FILE_FLAG_SEQUENTIAL_SCAN,
                                 NULL);
             dwFileSize = GetFileSize (hFile, &dwHighSize);
             pbmfh = (BITMAPFILEHEADER *) malloc (dwFileSize);
             ReadFile (hFile, pbmfh, dwFileSize,
                       &dwBytesRead, NULL);
             pbmi = (BITMAPINFO *) (pbmfh + 1);
             pBits = (BYTE *) pbmfh + pbmfh->bfOffBits;
             cxDib = pbmi->bmiHeader.biWidth;
             cyDib = abs(pbmi->bmiHeader.biHeight);
             HDC hdc;
             hdc = GetDC (hWnd);
    
             SetDIBitsToDevice (hdc,
                                0,
                                0,
                                cxDib,
                                cyDib,
                                0,
                                0,
                                0,
                                cyDib,
                                pBits,
                                pbmi,
                                DIB_RGB_COLORS);
    
             ReleaseDC (hWnd, hdc);
             free (pbmfh);
             return 0;
    
    /////////////////////////////
    
    EndPaint (hWnd, &ps);
    
    return 0;
    
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc (hWnd, uiMessage,
    wParam, lParam);
    }
    }
    

    Aber das Problem mit die Menüs wird trotzdem nicht gelöst 😡 *heul* , ist der Scheiß Datentyp HMENU nur auf paar Datensegmente eingeschränkt, ich kann einfach nicht mehr mal ein Menü reinfügen 😡 ...

    Bitte helft mir 😞 !!!



  • mii.cch (länge des strings) ist immer 0 !!!

    hat bei mir auch länger gedauert bis ich es gefunden
    hab und da ich zur fehlersuche das ganze mal umformuliert hab
    noch ein vorschlag zur einfacheren handhabung(solange du nur einfache menüs erstellen willst):

    HMENU hMenu;hMenu = CreateMenu ();
    
       HMENU hMenu2;hMenu2 = CreatePopupMenu (); 
       InsertMenu (hMenu2,-1,MF_BYPOSITION| MF_STRING,1, "Beenden");
    InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu2, "Datei");
    
       HMENU hMenu2_;hMenu2_ = CreatePopupMenu (); 
       InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING,2, "Autor");
    
       HMENU hMenu3; hMenu3 = CreatePopupMenu ();
          InsertMenu (hMenu3,-1,MF_BYPOSITION| MF_STRING,3, "Farbtiefe");
          InsertMenu (hMenu3,-1,MF_BYPOSITION| MF_STRING,4, "Aufloesung");
       InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu3, "Grafik");
    
       HMENU hMenu3_; hMenu3_ = CreatePopupMenu ();
          InsertMenu (hMenu3_,-1,MF_BYPOSITION| MF_STRING,5, "Windows Verzeichniss");
          InsertMenu (hMenu3_,-1,MF_BYPOSITION| MF_STRING,6, "Aktuelles Verzeichniss");
       InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu3_, "Festplatte");
    InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu2_, "Information");
    
          HMENU hMenu_cc; hMenu_cc = CreatePopupMenu ();
          InsertMenu (hMenu_cc,-1,MF_BYPOSITION| MF_STRING,7, "Woka");
       HMENU hMenu_rr; hMenu_rr = CreatePopupMenu ();
       InsertMenu (hMenu_rr,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu_cc, "Oka");
    InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu_rr, "Infos");
    
    SetMenu (hWnd, hMenu);
    

Log in to reply