Probleme bei Resourcenerstellung



  • Ok noch eine Frage zu resource.h Ist es egal welche ID ich zb ID_ICON zuordne? Oder gibt es irgendwelche empfohlenen Werte?

    Naja der neue Fehler ist jedenfalls:
    Error res.rc 15 26 expecting END
    Danke soweit



  • - Die eigenen ID-Nummern in einer RC-Datei und damit im Programm sind völlig frei, sie müssen nur eindeutig sein.
    - Dein MENUITEM "Über" hat kein übergeordnetes POPUP mit BEGIN / END



  • War da nicht was, das die ID des Dateiicon = 1 sein soll ?

    Ob sich da was bei den neuen Compilern geändert hat - die alten Compiler wurden Zickig, wenn die ID grösser als 32k wurden?

    MfG f.-th.



  • Ok habs geändert, danke.
    Jedoch klappt das einbinden in das Programm nicht so gut. Ich benutze den c++ Builder 2007.
    Also es wird ein Fenster erzeugt, aber da ist kein Menü und das Icon stimmt auch nicht. Anscheinend muss ich die .*res Datei nochmal extra einbinden oder? Es wird ja nur resource.h included.
    Hier das Programm:

    #include <windows.h>
    #include "resource.h"
    
    LPCSTR MainClassName = "Ein Menü-Beispiel";
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,
                             WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
       WNDCLASSEX wc;
       MSG wmsg;
       HWND hWnd;
    
       wc.cbSize = sizeof(WNDCLASSEX);
       wc.style = 0;
       wc.lpfnWndProc = WndProc;
       wc.cbClsExtra = 0;
       wc.cbWndExtra = 0;
       wc.hInstance = hInstance;
       wc.hIcon = LoadIcon(GetModuleHandle(NULL),
    								MAKEINTRESOURCE(ID_ICON));
       wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
       wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU1);
       wc.lpszClassName = MainClassName;
       wc.hIconSm         = (HICON)LoadImage(GetModuleHandle(NULL),
                                            MAKEINTRESOURCE(ID_ICON),
                                            IMAGE_ICON, 16, 16, 0);
    
       if(!RegisterClassEx(&wc))
          {
           MessageBox(NULL, "Windows Registrations Fehler", "Error!",
                      MB_ICONEXCLAMATION | MB_OK);
           return 0;
          }
    
        hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, MainClassName,
                              "Menü Beispiel",
                              WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              300,150,NULL,NULL,hInstance, NULL);
    
        if(hWnd == NULL)
        {
              MessageBox(NULL, "Fehler beim Erstellen des Fensters!",
              "Error!",        MB_ICONEXCLAMATION | MB_OK);
              return 0;
        }
    
    while(GetMessage(&wmsg,NULL,0,0))
       {
          TranslateMessage(&wmsg);
          DispatchMessage(&wmsg);
       }
       return wmsg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,
                             WPARAM wParam, LPARAM lParam)
    {
       char string[255];
    
       switch (iMsg)
          {
             case WM_CLOSE:
                DestroyWindow(hWnd);
                break;
             case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
             case WM_COMMAND:
                switch(LOWORD(wParam))
                   {
                     case ID_FILE_OPEN:
                     LoadString(GetModuleHandle(NULL),ID_STRING_OPEN,
                                string, sizeof(string));
                     MessageBox(hWnd,string,
                                "Öffnen",MB_ICONINFORMATION);
                     break;
                     case ID_FILE_SAVE:
                     LoadString(GetModuleHandle(NULL),ID_STRING_SAVE,
                                string,sizeof(string));
                     MessageBox(hWnd,string,
                                "Speichern",MB_ICONINFORMATION);
                     break;
                     case ID_OPTIONS_OPTIONS_OPTION1:
                  LoadString(GetModuleHandle(NULL),ID_STRING_OPTION1,
                             string,sizeof(string));
                   MessageBox(hWnd,string,
                              "Option 1",MB_ICONINFORMATION);
                   break;
                   case ID_OPTIONS_OPTIONS_OPTION2:
                  LoadString(GetModuleHandle(NULL),ID_STRING_OPTION2,
                              string,sizeof(string));
                  MessageBox(hWnd,string,"Option 2",
                             MB_ICONINFORMATION);
                  break;
                   case ID_\1:
                   LoadString(GetModuleHandle(NULL),ID_STRING_ABOUT,
                              string,sizeof(string));
                   MessageBox(hWnd,string,"Über",MB_ICONINFORMATION);
                   break;
                   case ID_FILE_EXIT:
                      DestroyWindow(hWnd);
                      break;
             }
            break;
          }
       return DefWindowProc(hWnd,iMsg,wParam,lParam);
    }
    

    Hier die 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 ID_FILE_OPEN 6
    #define ID_FILE_SAVE 7
    #define ID_FILE_EXIT 8
    #define ID_ABOUT 9
    
    #define ID_OPTIONS_OPTIONS_OPTION1 10
    #define ID_OPTIONS_OPTIONS_OPTION2 11
    #define ID_ICON                         111
    #define IDR_MENU1                       101
    

    und hier die res.rc

    //Ressourcen-Skriptedatei *.rc
    
    //#include <windows.h>
    #include "resource.h"
    
    /////////////////////////////////////////////////////////////////
    //
    // Menü
    //
    
    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
    	POPUP "Über"
    	BEGIN
    			MENUITEM "Über",                   ID_ABOUT
    	END
    END
    //Icon
    ID_ICON              ICON        "icon.ico"
    
    //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\n Test"
    
    END
    


  • Du machst es dir echt schwer. Hast du kein lauffähiges Beispiel zur Verfügung? Das nimmt man einfach und ändert es ohne viel Nachdenken auf die eigenen Bedürfnisse ab!

    Das Icon und das Menü werden in wndclass beschrieben wie in der RC-Datei abgelegt.
    1. wc.hIcon = LoadIcon(hinstande,MAKEINTRESOURCE(IDI_ICON1) reicht. Das Draufsetzen eines Image kenne ich nicht.
    2. für das Menü gibt man den Namen (als String "MeinMenue") aus der RC-Datei an statt einer ID-Konstante.

    Mache dich einfach mit Petzolds Buch zur Windows-Programmierung schlau. Dort ist alles wesentliche sauber und einfach erklärt!



  • Naja ich versuch das zu einem Lauffähigen Beispiel zu machen, aber das klappt ja anscheinend nicht so gut.

    Was heisst "Das Draufsetzen eines Image"?
    Wo in der RC Datei steht denn der Name des Menüs? Es wurden doch nur die einzelnen Untermenüs wie zb "Datei" bekannt.
    Wenn ich

    wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
    

    eintippe sagt der Compiler dass er IDI_ICON1 nicht kennt.
    Und mit ID_ICON passiert wieder nichts.

    Danke



  • Teile bitte mit, was genau nicht klappen will. Das Menu, das Icon oder beides?
    Es handelt sich um das Grundgerippe jeder direkten Windows-Anwendung in C oder C++ (ohne MFC/VCL, etc.). Man übernimmt ein solches Gerippe aus einem Buch oder einem Tutorial und lebt damit gut ohne grosses Nachdenken über die Details!

    Fragen und Antworten zum Verständnis deiner Probleme:

    - Brauchst du ein Icon in verschiedenen Grössen (large + small)?
    - Ein Menu kannst du sowohl über einen Namen (string) als auch über einen Identifier (IDI_MENU) einbinden.
    - Benutzte Identifier müssen in resource.h definiert sein und erfordern das Macro MAKEINTINTRESOURCE

    Noch ein Hinweis: RegisterClass/WNDCLASS statt RegisterClassEx/WNDCLASSEX sind keinesfalls veraltet, oft sogar einfacher, und lässt weiteres offen (wenn man es denn braucht).

    Sei mir also nicht böse: So lange und so intensiv wie über deine Fragen habe ich darüber nie nachgedacht. Die anderen hier im Forum denken auch nicht viel darüber nach und überlassen das der IDE oder anderen Programmierhilfen.

    Und nun mach dein Ding oder schicke mir eine email. 🙂



  • [Schlau]Heißt es nicht MAKEINTRESOURCE? und nicht MAKEINTINTRESOURCE?[/Schlau]



  • Sein Quelltext funktioniert bei mir auf einem älteren bcc 👍

    Wenn ich das richtig verstehe, ist er nicht fit mit der Bedienung seines c++ Builders. Hab so ein Teil nicht, vermute er muss seinem Projekt mitteilen das er sein Infos aus der res.rc mitberücksichtigt haben möchte.

    Da von der WinAPI her meiner unmassgeblichen Meinung alles klar ist, ist dieser Beitrag unter VCL(C++ Builder) wahrscheinlich besser platziert 😃

    MfG f.-th.



  • Wäre es möglich diesen Thread zu verschieben? Naja wie gesagt ich hab noch nie ein API-Programm mit dem C++ Builder erstellt
    Danke


Anmelden zum Antworten