Menüpunkte innerhalb eines Dropdown-Menüs funktionieren nicht



  • Hallo,

    bin neu auf dem Gebiet der Windows-Programmierung und habe ein Verständnisproblem. Unter http://www.winprog.org/tutorial/menus.html werden folgende Symbole durch eine Präprozessordirektive erzeugt:

    #define IDR_MYMENU 101
    #define IDI_MYICON 201
    
    #define ID_FILE_EXIT 9001
    #define ID_STUFF_GO 9002
    

    Nach meinem Verständnis sind dies einfach nur Symbole, die durch die entsprechenden Zahlen ausgedrückt werden. ID_FILE_EXIT entspricht einer "Nachricht"(?) die mit einem entsprechenden

    case ID_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0);					
    break;
    

    zu einer Schließung des Fensters führt. Wieso klappt dies nicht, wenn ich aus 9001 bspw. 12 mache?

    Unter

    #include "resource.h"
    
    IDR_MYMENU MENU
    BEGIN
        POPUP "&File"
        BEGIN
            MENUITEM "E&xit", ID_FILE_EXIT
        END
    
        POPUP "&Stuff"
        BEGIN
            MENUITEM "&Go", ID_STUFF_GO
            MENUITEM "G&o somewhere else", 0, GRAYED
        END
    END
    
    IDI_MYICON ICON "menu_one.ico"
    

    erstellt der Autor eine Ressourcen-Datei, welche wohl die Struktur des Menüs wiederspiegeln soll.

    1. Frage: Was sollen die Fragezeichen innerhalb der Zeichenketten?
    2. Frage: Jedes Item bekommt eine bestimmte MenuID zugeteilt. Der Name dieser MenuID ist doch mir überlassen, oder?

    Der Vollständigkeit halber hier mein Windows-Programm dazu:

    #include <windows.h>
    #include "resource.h"
    #include <tchar.h>
    
    LRESULT CALLBACK WndProc (HWND , UINT , WPARAM , LPARAM);
    HINSTANCE hActInstance;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpszCmdParam, int nCmdShow)
    {
       MSG msg;
       HWND hwnd;
       WNDCLASS wndclass ;
    
       hActInstance = hInstance ;
    
       if (!hPrevInstance) {
    
          wndclass.style         = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc   = WndProc;
          wndclass.cbClsExtra    = 0;
          wndclass.cbWndExtra    = 0;
          wndclass.hInstance     = hInstance;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
          wndclass.hCursor       = LoadCursor (NULL , IDC_ARROW);
          wndclass.hbrBackground = GetStockObject (LTGRAY_BRUSH);
          wndclass.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
          wndclass.lpszClassName = _T("WndClassName");
    
          RegisterClass (&wndclass);
       }
    
       hwnd = CreateWindow (_T("WndClassName"), _T("LED"),
                            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                            CW_USEDEFAULT, 320, 240,
                            NULL,  NULL, hInstance,  NULL);
    
       ShowWindow(hwnd, nCmdShow);
       UpdateWindow(hwnd);
    
       while (GetMessage (&msg, NULL, 0, 0)) {
    
          TranslateMessage(&msg) ;
          DispatchMessage(&msg) ;
       }
    
       return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message) {
    
          case WM_DESTROY:     PostQuitMessage(0);
                               break;
    		case WM_COMMAND:		switch(LOWORD(wParam))
    									{
    
    										case ID_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0);
    										break;
    
    										case ID_STUFF_GO: MessageBox(hwnd, _T("bla"), _T("test"), MB_OK);
    										break;
    									}
    									break;
    
          case WM_LBUTTONDOWN: MessageBox(NULL, _T("Bitte einen Menuepunkt wählen"), _T(""), MB_OK);
                               break;
          return 0;
       }
    
       return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • also diese

    #define ID_FILE_EXIT 9001
    

    sind einfach Platzhalter, weil man sich die meisten Leute ein ID_FILE_EXIT einfacher merken kann als ein 9001, während des Compilierens ersetzt dein Compiler diese Platzhalter gegen die Zahl die du definiert hast.

    Zu deinen anderen Fragen
    1.das sind keine Fragezeichen sondern das ist das Kaufmanns-Und, wenn du das vor einem Buchstaben in der Menüleiste schreibst, bekommt der Buchstabe einen Underscore und du kannst mit den Taste ALT+Buchstabe den Menüpunkt ausführen
    2.bedingt, wenn du eine Headerdatei einbindest in der der Name schon mit define definiert ist, wird dir der Compiler beim Compilieren eine Fehlermeldung erzeugen.



  • Sorry, natürlich Kaufmanns-UND. Weis garnicht wie ich auf ein Fragezeichen komme 😮.

    Mir ist klar, dass ID_FILE_EXIT ein Platzhalter (Symbol) für 9001 ist. Aber wieso 9001 und nicht 1234? Wenn ich 9001 durch 1234 ersetze, so wird das Programm durch das Klicken auf Exit nicht beendet. Ändere ich es wieder auf 9001, so funzt es wieder. Die Zahlen müssen doch irgend eine Bedeutung haben.



  • Hier mal mein Quellcode und die zugehörigen Fehlermeldungen:

    /* resource.h */
    #define ID_MENUE 101
    #define ID_DATEI_STARTEN 9002
    #define ID_DATEI_BEENDEN 9001
    #define ID_HILFE_INFO 21
    
    /* winskel.rc */
    #include "resource.h"
    
    ID_MENUE MENU
    BEGIN
        POPUP "Datei"
        BEGIN
    	    MENUITEM "Starten", ID_DATEI_STARTEN
    		 MENUITEM "Beenden", ID_DATEI_BEENDEN
        END
    
        POPUP "Hilfe"
        BEGIN
    	    MENUITEM "Information", ID_HILFE_INFO       
        END
    END
    
    /* winskel.c */
    #include <windows.h>
    #include <tchar.h>
    #include "resource.h"
    
    LRESULT CALLBACK WndProc (HWND , UINT , WPARAM , LPARAM);
    HINSTANCE hActInstance;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpszCmdParam, int nCmdShow)
    {
       MSG msg;
       HWND hwnd;
       WNDCLASS wndclass ;
    
       hActInstance = hInstance ;
    
       if (!hPrevInstance) {
    
          wndclass.style         = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc   = WndProc;
          wndclass.cbClsExtra    = 0;
          wndclass.cbWndExtra    = 0;
          wndclass.hInstance     = hInstance;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
          wndclass.hCursor       = LoadCursor (NULL , IDC_ARROW);
          wndclass.hbrBackground = GetStockObject (LTGRAY_BRUSH);
          wndclass.lpszMenuName  = MAKEINTRESOURCE(ID_MENUE);
          wndclass.lpszClassName = _T("WndClassName");
    
          RegisterClass (&wndclass);
       }
    
       hwnd = CreateWindow (_T("WndClassName"), _T("Titel"),
                            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                            CW_USEDEFAULT, 320, 240,
                            NULL,  NULL, hInstance,  NULL);
    
       ShowWindow(hwnd, nCmdShow);
       UpdateWindow(hwnd);
    
       while (GetMessage (&msg, NULL, 0, 0)) {
    
          TranslateMessage(&msg) ;
          DispatchMessage(&msg) ;
       }
    
       return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message) {
    
          case WM_DESTROY:     PostQuitMessage(0);
                               break;
    
    		case WM_COMMAND:		switch(LOWORD(wParam))
    									{
    
    										case ID_DATEI_BEENDEN: PostMessage(hwnd, WM_CLOSE, 0, 0);
    										break;
    
    										case ID_HILFE_INFO: MessageBox(hwnd, _T("Maeh"), _T("Muh"), MB_OK);
    										break;
    									}
    									break;
    
          case WM_LBUTTONDOWN: MessageBox(NULL, _T("Bitte einen Menuepunkt wählen"), _T(""), MB_OK);
                               break;
          return 0;
       }
    
       return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    error C2065: 'ID_MENUE': nichtdeklarierter Bezeichner winskel.c 27
    error C2065: 'ID_DATEI_BEENDEN': nichtdeklarierter Bezeichner winskel.c 61
    error C2051: case-Ausdruck ist keine Konstante winskel.c 61
    error C2065: 'ID_HILFE_INFO': nichtdeklarierter Bezeichner winskel.c 64
    error C2051: case-Ausdruck ist keine Konstante winskel.c 64

    Bin ich blind?



  • Prüf mal ob die "resource.h" in der "winskel.c" auch die gleiche ist wie die in der "winskel.rc".



  • Mensch küchenchef, you made my day. Daran lags. Hab ich doch glatt eine falsche Datei in das Projekt eingebunden. Danke dir!!


Anmelden zum Antworten