Ich werde aus dem Resourcen FAQ nicht schlau.
-
Ich habe mir das Resourcen FAQ durchgelesen und habe eine .rc Datei mit dazugehöriger .h Datei erstellt.
Ich verstehe aber irgendwie nicht,wie ich das jetzt in meinem Programm anzeigen kann.In einem Tutorial habe ich gelesen,dass man es mit der Funktion LoadMenu einem WNDCLASSEX zuordnen muss.
Dies sieht bei mir so aus:
wndClass.lpszMenuName = LoadMenu(hInstance,MAKEINTRESOURCE("c\\C++\\Bildverwaltung\\Menu.rc"));
Jetzt kommt aber folgende Fehlermeldung:
C:\C++\Bildverwaltung\Main.cpp(99) : error C2440: '=' : 'struct HMENU__ *' kann nicht in 'const char *' konvertiert werden Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat Fehler beim Ausführen von cl.exe.
wndClass.lpszMenuName und der Rückgabetyp von LoadMenu passen überhauptnicht zusammen.
Weiß jemand weiter?
-
Zunächst einmal mußt Du die .rc-Datei in eine .res-Datei kompilieren (mit Resourcen-Kompiler) Die .res-Datei bindest Du mit dem Linker an die exe. Außerdem mußt Du bei LoadMenu die hInstance weglassen. Und schließlich gibst Du dann nicht die komplette Resourcen-Datei an, sondern nur die ID des Menüs. Die ID vergibst Du selbst in der .rc-Datei.
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
Hier ein Tutorial dazu:
-
Nur als Hinweis:
Ressourcen werden entweder unter dem Namen oder einer ID (16bit weit) gespeichert. Die Ladefunktionen, nehmen alle nur einen LPCTSTR an, also einen Pointer auf einen constant char array.Damit die Ladefunktionen auch Ressourcen durch IDs laden können existiert einfach die Regel: Ist das HIWORD==0, dann ist das LOWORD die ID nach der gesucht wird. Nun ist aber ein UINT kein LPCSTR. FÜR diesen cast gibt es den netten Makro MAKEINTRESOURCE, der aus einem UINT einfach einen LCTSTR Pointer castet.
Noch etwas: Die Lader Funktionen, die ein hInstance Handle haben, können keine Datei laden, wie Du es hier versucht hast, die laden immer nur eine Ressource aus dem entsprechenden Modul.
-
Jo danke Jungs.
Jetzt sind alle Probleme beseitigt.
-
*Thema wieder ausgrab*
Ich hab aus diesem Tutorial mal diese Dialogbox nachgemacht.
IDR_TEXTDIALOG DIALOGEX 20, 20, 180, 70 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Dialogfeld (Textfeld)" FONT 8, "MS Sans Serif" BEGIN LTEXT "Passwort : ", -1, 36, 8, 45, 8 EDITTEXT IDC_EDIT1, 83,6,61,13, ES_AUTOHSCROLL | WS_BORDER LTEXT "Nummer : ", -1, 36, 24, 45, 8 EDITTEXT IDC_EDIT2, 83,22,61,13, ES_AUTOHSCROLL | WS_BORDER PUSHBUTTON "&Bestätigen", IDOK, 33, 50, 50, 14 PUSHBUTTON "&Abbrechen", IDCANCEL, 95, 50, 50 ,14,WS_GROUP END
Ich hab aus WS_POPUP mal WS_CHILD gemacht, damit es in meiner Fullscreenanwendung angezeigt wird.
Jetzt ist das Problem,dass das Programm einfach hängen bleibt und ich in diese Dialogbox nichts schreiben kann und auch das Programm via DestroyWindow(hWnd); nicht schließen kann.
Wovon hängt es ab,dass man Kontrolle über die Dialogbox und dann hinterher Kontrolle über die Fullscreenanwendung wiederkriegt?
-
Ja hast du denn beim erstellen dein Fenster als Parent angegeben? Sonnst ist WS_CHILD ja auch unsinnig ... Ruf den Dialog doch einfach Modal auf
-
Natürlich!
Ich komm mir jedes mal vor wie ein Trottel wenn ich mit meinen Problemen herkomme. -.-
Danke
-
Hör doch einfach auf zu programmieren, ist ja gräßlich!
-
Pedis
Scriptkiddies sind hier nicht erwünscht. ALSO GEH!Tobi3000
Kann jedem mal passieren
-
Tobi3000 schrieb:
Natürlich!
Ich komm mir jedes mal vor wie ein Trottel wenn ich mit meinen Problemen herkomme. -.-
Danke
Hehe^^ Der Sinn von einem Forum ist es doch, dass man Fragen stellt, also tust du doch nur das, was man eben an einem Forum so macht
Zum Thema:
- Sicher, dass WS_CHILD richtig ist? Bin mir nicht sicher, aber ist das nicht nur für Steuerelemente á lá Buttons, Editboxen und so gedacht? Indem man einen Parent angibt, wird das Fenster dadurch doch schon automatisch "Child"-Fenster.- Kann es vielleicht sein, dass sich die Fullscreenanwendung einfach wieder über den Dialog "stellt", du ihn aber einfach noch siehst, weil nicht drübergezeichnet wird?
- Damit der Dialog vor deiner Fullscreen-Anwendung angezeigt wird, müsste auch sowas gehen: SetWindowPos( hDialog, hFullscreenWnd, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE);.
Sonst weiß ich auch nicht
-
Aus
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
wurde mit WS_POPUP in einer Fullscreenanwendung keine Dialogbox erstellt.
In Fensteranwendungen schon....
Ich hab es dann durch WS_CHILD ersetzt,weil ich mir dachte ,dass ein Tochterfenster drübergezeichnet wird.
Dies hat auch geklappt,nur ist dann das Programm festgefroren.
Jetzt hab ichs ganz weggelassen und es funtkioniert perfekt.
STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-
Ist ja abgefahren! Hätte nie gedacht, dass das funktionieren könnte
Nur gut, dass uns Mutter Natur ne TryAndError-Methode implementiert hat