#define-Konstante dynamisch zusammensetzen und an Funktion weitergeben



  • Die Ressourcendaten (images) lauten:

    #define IDB_BT1                         102
    #define IDB_BT2                         103
    #define IDB_BT3                         104
    #define IDB_BT4                         105
    .
    .
    

    Die Ziffer am Ende repräsentiert eine Seite im Windows-Frame.

    Die aufgerufene Funktion empfängt:

    public: Image ^ getImageFromRes(long resource_ID)
    

    Der normale Funktionsaufruf:

    img = getImageFromRes(IDB_BT1);
    

    Wie kann ich nun beim Aufruf die Konstante dynamisch ändern, nach dem Motto
    img = getImageFromRes("IDB_BT" + i); ?

    Habe hier im Forum ein Makro gefunden was passen würde:

    #define SSTR( x ) dynamic_cast< std::ostringstream & >( \
                      std::ostringstream() << std::dec << x ).str()
    #endif
    .
    .
    string s = SSTR("IDB_BT" << iPage);
    

    aber String "s" kann nicht an die Func übergeben werden ... kann man den string irgendwie "auflösen"?



  • Das geht so nicht.
    Möglichkeiten:
    * Steck die IDs in eine map<int, int>
    * Verwende statt 1, 2, 3... gleich 102, 103, 104...
    * Führ die Konvention ein dass IDB_BTn immer X + n entspricht (wie in deinem Beispiel -- X wäre da 101)



  • ok, hatte es schon befürchtet ... ich muss mal sehen, das Blöde ist, dass diese 102, 103 ... vom System generiert werden, man muss dann immer bei Erweiterungen darauf achten dass die Systematik immer noch stimmt bzw. keine Lücken vorhanden sind. Muss das wohl mappen



  • Wenn du gleich einige zig bis hundert IDs vordefinierst sollte es mit Erweiterungen eigentlich kein Problem geben.

    Achja, noch ne Möglichkeit: switch.
    Hat den Vorteil dass du keine Variable (map) brauchst.

    Und die cases bzw. map-befülle-Zeilen sollte man über ein Makro erzeugen können.



  • Habs jetzt erstmal mit switch gemacht um weiter zu kommen und es noch wenige Seiten sind. Mit dem Vordefinieren muss ich mal sehen, habe Angst diese Resource-Kiste übeklatscht das, das Verfahren durchschaue ich noch nicht ganz 😮

    Eben noch was Interessantes in der resource.h entdeckt: #define _APS_NEXT_RESOURCE_VALUE 113
    Damit kann man offenbar einen ID-Offset vergeben und es wird (hoffentlich) der reservierte Bereich nicht zerballert.

    Ach so, es ist VS2013 im Einsatz.


Anmelden zum Antworten