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:

    http://pronix.linuxdelta.de/C/win32/win32_3.shtml


  • Mod

    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 😃


Log in to reply