Eigenes Framework: Designfrage!



  • ich will ein eigenes gui framework für windows bauen, mit winapi kenn ich mich einigermaßen aus.
    nur ein paar konzeptionelle fragen:
    ich habe die winmain in eine lib getan und rufe in ihr eine normale main() auf, die der anwender dann benutzt, ist das okay? dann sieht er dieses HINSTANCE gedöhns nicht mehr, sondern nur noch argc und argv.
    2. soll ich es wie in anderen frameworks so machen, dass man Application und Window in 2 Klassen teilt?
    3. wo kann man denn z.b. mal templates einsetzen? ich überlege verkrampft, wie ich templates mit gui mal kombinieren kann, es läuft dann aber immer auf polymoprhie hinaus.

    wäre für antworten dankbar. 🙂



  • Ziggie schrieb:

    ich habe die winmain in eine lib getan und rufe in ihr eine normale main() auf, die der anwender dann benutzt, ist das okay? dann sieht er dieses HINSTANCE gedöhns nicht mehr, sondern nur noch argc und argv.

    Unsauber. Schließlich kann es ja sein, dass der Benutzer deiner Lib diese Variablen braucht. Und die main -Funktion aufzurufen ist auch keine gute Idee. Was machst du z. B. wenn das Programm als Konsolen-Projekt kompiliert wird und gar kein WinMain aufgerufen wird?

    Ziggie schrieb:

    2. soll ich es wie in anderen frameworks so machen, dass man Application und Window in 2 Klassen teilt?

    Natürlich. Oder willst du pro Anwendung nur ein Fesnter erlauben?

    Ziggie schrieb:

    3. wo kann man denn z.b. mal templates einsetzen? ich überlege verkrampft, wie ich templates mit gui mal kombinieren kann, es läuft dann aber immer auf polymoprhie hinaus.

    Tztztz... Du solltest erstmal überlegen, was du umsetzen willst und nicht zuerst denken, dass du unbedingt Templates benutzen musst. Aber als Stichwort: Vielleicht für allgemein gültige Basis-Klassen, die für jede abgeleitete Klasse eine eigene Implementierung (in dem Fall als Template) brauchen.



  • war mist



  • > Unsauber. Schließlich kann es ja sein, dass der Benutzer deiner Lib diese Variablen braucht.

    Ich will dem user ja HINSTANCE usw. ersparen. Und wenn schon, kann man sich die Werte immernoch durch eine Methode aus der Application-Klasse abholen.

    > Was machst du z. B. wenn das Programm als Konsolen-Projekt kompiliert wird und gar kein WinMain aufgerufen wird?

    Mir geht es ja um GUIs 🙂 Wenn man Konsole macht, muss man die WinMain-Lib eben nicht dazulinken und macht nur sein main().



  • Ziggie schrieb:

    Ich will dem user ja HINSTANCE usw. ersparen. Und wenn schon, kann man sich die Werte immernoch durch eine Methode aus der Application-Klasse abholen.

    Trotzdem unsauber, das als einzige Möglichkeit zu bieten.

    Ziggie schrieb:

    Mir geht es ja um GUIs 🙂

    Du kannst ja dem Programmierer nicht befehlen, welche Art von Projekt er verwenden soll. 😉

    Ziggie schrieb:

    Wenn man Konsole macht, muss man die WinMain-Lib eben nicht dazulinken und macht nur sein main().

    Willst du die WinMain-Funktion in eine Extra-Lib auslagern? Dann wär das OK. Aber wie willst du dann deine Lib initialisieren? Das muss der User dann wohl auch selbst machen.

    Wie gesagt: Lieber den Aufruf der Initialisierungsfunktion dem User überlassen, z. B. durch überladen für beide Methoden, die durch den User in seiner main - bzw. die WinMain -Funktion aufgerufen werden können:

    void init (int &argc, char &**argv);
    void init (HINSTANCE &hInstance, HINSTANCE &hPrevInstance, LPSTR &lpCmdLine, int &nCmdShow);
    

    Oder Makros LIB_INIT und LIB_INIT_CONSOLE schreiben, die für den User die main - bzw. die WinMain -Funktion erstellen und deine Init-Funktion aufrufen.

    PS: In diesem Forum gibt es eine Funktion zum Zitieren. 😉



  • Willst du eine GUI oder ein Framework bauen??



  • Er will ein GUI-Framework bauen.



  • > Du kannst ja dem Programmierer nicht befehlen, welche Art von Projekt er verwenden soll.

    Von daher entscheidet ja der Programmierer, dass er GUIs verwenden möchte und setzt die GUI-Lib ein, muss er ja nicht. 😉



  • Ad aCTa schrieb:

    Von daher entscheidet ja der Programmierer, dass er GUIs verwenden möchte und setzt die GUI-Lib ein, muss er ja nicht. 😉

    Das war jetzt nicht so sehr auf die GUI-Sache bezogen, sondern mit den Unterschieden bei main und WinMain .



  • Ziggie schrieb:

    ich habe die winmain in eine lib getan und rufe in ihr eine normale main() auf, die der anwender dann benutzt, ist das okay? dann sieht er dieses HINSTANCE gedöhns nicht mehr, sondern nur noch argc und argv.

    Warum? Du kannst doch auch beim Compilieren einfach angeben, ob du WinMain oder die normale main Funktion haben willst. Stichwort: mainCRTstartup . Lass die Entscheidung ruhig den Benutzer treffen.



  • Lass den Benutzer der Lib entscheiden, welche der verschiedenen Main-Funktionen er nutzen möchte. Um dir dann den unnötigen Weg über verschiedene Initialisierungsfunktionen zu nehmen, um z.B. unter Windows an die HINSTANCE zu kommen, kannst du lib-intern(natürlich nur unter Windows) GetModuleHandle(NULL) verwenden. Damit bekommst du den Handle für die aktuelle Instanz. Den Rest der Parameter der WinMain-Funktion benötigt man sowieso nur in ganz wenigen Fällen.

    Somit brauchst du dir keine Sorgen machen, welche EntryPoint vom User gewählt wurde und musst die WinMain-Funktion intern nicht nochmal kapseln.



  • Man könnte auch eine bestimmte Einstiegsfunktion vom Nutzer fordern und diese von der in der Lib definierten main bzw WinMain (per #ifdef unterscheiden, welche bereitgestellt wird) aufrufen. Dann muss der Nutzer auch nicht mehr zwischen main und WinMain wechseln, wenn er zwischen Console/Oder-Auch-Nicht hin- und herschaltet.



  • Badestrand schrieb:

    Dann muss der Nutzer auch nicht mehr zwischen main und WinMain wechseln, wenn er zwischen Console/Oder-Auch-Nicht hin- und herschaltet.

    Muss er doch sowieso nicht. Siehe oben. Der Nutzer kann doch den Eintrittspunkt frei wählen.


Anmelden zum Antworten