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 101und 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 ichwc.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 MAKEINTINTRESOURCENoch 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