VC GUI - Alten Dialog in neuem Projekt verwenden



  • Hi,

    ich hab eine schicke Dialogklasse, die ich gerne auch außerhalb des ursprünglichen Projekts verwenden möchte. Allerdings bestehen innerhalb eines Projekts ein paar Abhängigkeiten mit den Ressourcen, die sich mir nicht sofort erschließen.

    Es scheinen sich Dialoginformatioen in der Ressource.h und MyProject.rc zu befinden.

    Gibt's irgendwo ein Anleitung, wie man den Dialogexport am besten bewerkstelligt?
    Dass man alles hat was man braucht aber nicht mehr. 😉

    Grüße,
    don_basto.



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39052.html
    Und die Klasse mitnehmen.

    Der Rest ergibt sich mit den Compilerfehlern. 😉



  • Ohne das ich das den Tipp ausprobiert hab: 😉

    Wenn ich nur die .rc-Datei kopiere, dann fehlen doch die Defines aus der Resource.h noch. Und selbst wenn ich die danach kopiere, können da ganz schnell Überschneidungen mit schon vorhandenen Defines entstehen.
    Also trotzdem noch richtig Handarbeit ..

    Werd's nachher mal ausprobieren.



  • hmm also ich hab das mal mit nem AboutDlg gemacht.

    erstell dir eine Neue.rc (aus einer leeren *.txt datei) und eine NeueResource.h datei zb unter einem Verzeichniss MyIncludes unter VisualStudios oder sonstwo

    in der NeueResource.h copierst du dir die #defines des Dialoges.
    damit die nun nicht in konflickt mit definitionen in dem Dialog kommen in dem du diesen verwenden willst setzt die Zahlen einfach sehr hoch.

    in der Neue.rc includest du dann als erstes die NeueResource.h & die afxres.h

    danach kommt der Dialog und zwar gehst du jetzt in den Explorer und öffnest die *.rc datei mit dem TextEditor deiner schicke Dialogklasse 😉 und kopierst dir nur das ab
    IDD_NEUERDIALOG DIALOG DISCARDABLE
    .....// bis
    END//<--ende des dialoges

    dann brauchst du in der Neue.rc noch das DESIGNINFO ab
    #ifdef APSTUDIO_INVOKED
    ...//bis
    #endif // APSTUDIO_INVOKED

    das DesignInfo aber nur für den IDD_NEUERDIALOG danach kannst du die Neue.rc speichern.

    in der jeweiligen Project *.h datei includest du dann die NeueResource.h (achte aber auf die richtige pfadangabe).

    in deinem Project öffnest du die *.rc datei mit nem texteditor und includest dort unter TEXTINCLUDE DISCARDABLE hinter "#endif //_WIN32\r\n" deine Neue.rc datei. am besten dort wo die *.rc2 datei includet wird. achte auch hier wieder auf die Pfadangabe und auch darauf wie die *.rc2 includet wird (schreibweise doppelte "" usw..)
    das selbe machst du (Neue.rc includen) dann nochmal ganz am ende deiner project *.rc bei #ifndef APSTUDIO_INVOKED unterhalb von #endif //_WIN32 dort müste auch wieder ein *.rc2 verweis sein (wieder darauf achten wie die schreibweise ist ist anderst als oben & pfadangabe halt)

    wenn du jetzt alles richtig gemacht hast wird dir nach dem compilern die neue.rc datei & NeueResource.h unter Externe Abhängigkeiten deines Projectes angezeigt ein doppelklick sollte dann auch den ResourcenEditor öffnen. (Aber der Dialog wird nicht im arbeitsbereich des ResourcenEditors angezeigt sondern es öffnet sich ein externer resourceneditor)
    jetzt solltest du die IDC_'s und IDD des Dialoges in deiner Classe verwenden können.

    für die zukunft sollte dann alles mit drei kleinen schritten resource.h includen in der *.rc die zwei pfade setzen erledigt sein.



  • @LowFly:
    Danke für die Anleitung. Bin gerade am umsetzen. Allerdings gibt's dabei auch den ein oder anderen Haken. Also zuerst mal die Ressourceninformationen ausgelagert:

    SchickerDialog.h
    SchickerDialog.cpp
    SchickerDialog.rc
    SchickerDialogResource.h

    Danach hab ich SchickerDialog.rc in MyProject.rc und SchickerDialogResource.h in Resource.h inkludiert. Und jetzt kommt folgende Fehlermeldung:

    fatal error RC1004: unexpected end of file found ..\mfc\SchickerDialogResource.h

    Ich weiss nicht, ob ich die Anleitung richtig verstanden hab?

    Grüße,
    don_basto.



  • Ich bekomm den Fehler nicht weg. 😞

    Also ich hab SchickerDialogResource.h jetzt in MyProject.h hizugefügt:

    // MyProject.h
    #pragma once
    
    #ifndef __AFXWIN_H__
    	#error 'stdafx.h' muss vor dieser Datei in PCH eingeschlossen werden.
    #endif
    
    #include "resource.h"
    #include "mfc/DisplayDialogResource.h"
    
    // ..
    

    Dann wie beschrieben in MyProject.rc meine Ressourcendatei SchickerDialog.rc eingetragen:

    // MyProject.rc
    
    //..
    
    3 TEXTINCLUDE 
    BEGIN
        "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
        "#define _AFX_NO_OLE_RESOURCES\r\n"
        "#define _AFX_NO_TRACKER_RESOURCES\r\n"
        "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
        "\r\n"
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)\r\n"
        "LANGUAGE 7, 1\r\n"
        "#pragma code_page(1252)\r\n"
        "#include ""res\\MyProject.rc2""  // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen\r\n"
        "#include ""afxres.rc""         // Standardkomponenten\r\n"
    	"#include ""src\\mfc\\SchickerDialog.rc""	// externe Dialogressource"
    
        "#endif\r\n"
        "\0"
    END
    
    // ..
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
    LANGUAGE 7, 1
    #pragma code_page(1252)
    #include "res\MyProject.rc2"  // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen
    #include "afxres.rc"        // Standardkomponenten
    #include "src\mfc\SchickerDialog.rc"	// externe Dialogressource
    #endif
    
    // ..
    

    Fehlt noch was? 😕



  • du must wenn du SchickerDialog.cpp & SchickerDialog.h zB in MyIncludes auslagerst dort auch ne StdAfx.h mitauslagern die kann komplett leer sein also keine weiteren verweise auf includes lediglich wie unten folgt muss drinne stehn

    #if !defined(AFX_STDAFX_H__79714F13_A220_48E3_9921_5876E86E2F5F__INCLUDED_)
    #define AFX_STDAFX_H__79714F13_A220_48E3_9921_5876E86E2F5F__INCLUDED_
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_STDAFX_H__79714F13_A220_48E3_9921_5876E86E2F5F__INCLUDED_)
    

    in den SchickerDialog.cpp includest du die StdAfx.h vor SchickerDialog.h

    dann sollte der fehler behoben sein

    dann noch nen tip nachdem du die *.cpp *.h auch ausgelagert hast.
    unter dem MenuPunkt Extra/Optionen Regsiterblatt Verzeichnisse unter dem Dropdownfeld "Verzeichnisse anzeigen für" Includedateien legst du nen Pfad für das Verzeichniss an, in dem die ausgelagerten dateien liegen. via Button & Pfadsuche 😉

    somit reicht es dann wenn du in der StdAfx.h deines Projectes (nicht in der die im ausgelagertem verzeichniss liegt)

    #include <SchickerDialog.h>

    schreibst. da ist dann keine Pfadangabe mehr nötig.

    dann must du noch bei deinem project die SchickerDialog.cpp & SchickerDialog.h im Arbeitsbereich mit "Dateien dem Project hinzufügen" eben selbiges tun. Sonst motzt der compiler. aber ich denke das weist du eh schon 😉

    [NEW EDIT]
    in den codeschnipseln von der Poste um 18:09:10 21.11.2006 past alles



  • LowFly schrieb:

    du must wenn du SchickerDialog.cpp & SchickerDialog.h zB in MyIncludes auslagerst dort auch ne StdAfx.h mitauslagern die kann komplett leer sein also keine weiteren verweise auf includes lediglich wie unten folgt muss drinne stehn [..]

    Da sprichst du gleich ein generelles Problem mit den vorkompilierten Headern an! 😉
    Eine Dummy-stdAfx.h ist ein guter Tipp, wenn man mal ohne vorkompilierte Header arbeiten will (bisher kamen dann Fehlermeldungen). 👍

    Den Rest muss ich mir erstmal genauer anschauen.



  • Geschafft! Der Fehler war so einfach, dass ich nicht gleich drauf gekommen bin. Der Ressourcenkompiler will am Ende jeder Ressourcendatei eine Leerzeile.

    Danke für die Hilfe. 🙂



  • // EDIT: alles prima. 😃



  • jo freut mich wenn ich helfen konnte

    ps:thema für die faq???



  • Nachschlag: Ich hab noch ein bissl mit den Ressoucendateien rumgespielt, weil ich gern mit dem Ressourceneditor ein paar kleine Änderungen vornehmen möchte. Der Dialog soll also keine richtig "externe" Ressource, nur gut importierbar. Deswegen hab ich noch ein paar Änderungen an LowFly's Ansatz vorgenommen.

    1. Statt die Dialogressource (SchickerDialog.rc) bei der Projektressouce (MyProject.rc) bekannt zu machen, hab ich die Dialogressoure einfach in das Projekt importiert (SolutionExplorer->MyProject->RessourcenDateien->Add->ExistingItem). Damit wird die Dialogressource eigenständig kompiliert, was jedoch zu Fehlern führen kann. Deswegen:

    2. Einfügen der Resource.h des Projekts in die Dialogressource:

    // SchickerDialog.rc
    
    #include "SchickerDialogResource.h"
    #include "../resource.h"     // Auf den Pfad achten
    #include "afxres.h"
    
    // ..
    

    Damit kann der Dialog im Ressourceneditor bearbeitet werden (Bei der ersten Änderung überarbeitet MS die Datei).


Log in to reply