Wie gezeichnete Objekte in wxWidgets bewegen?



  • Hallo,
    ich habe folgendes Problem: Ich zeichne in einem wxDC ein paar geometerische Objekte ( Rechtecke, Kreise, Linien, etc. ). Nun möchte ich die irgendwie mit der Maus modifizieren können. Ich möchte also z.B. ein vorher gezeichnetes Rechteck mit gedrückter Maustaste verschieben können.
    Meine ersten Gedanken waren dass ich mir alle Koordinaten von allen Objekten irgendwo zwischenspeichere, und dann bei jedem Maus Event das jeweilige Objekt heraussuche und das komplette Zeichenfeld neu zeichnen lasse. Das is aber dann doch etwas kompliziert.

    In TCL( = ne einfache Skriptsprache) gibt es für sowas z.B. extra Befehle, mit denen man solche gezeichnete Objekte an Befehle koppeln konnte. Jetzt is meine Frage ob es bei wxWidgets auch irgendwelche speziellen Befehle gibt die mir meine Arbeit etwas abnehmen könnten.

    Mfg Felsen



  • Schau dir mal wxShapeFramework an:
    http://sourceforge.net/projects/wxsf#item3rd-2



  • Hi Softwaremaker,
    das sieht ja schonmal sehr vielversprechend aus. Von den Screenshots her, eigentlich genau was ich will. Ich würde das gerne mal austesten, aber dabei gibts ein paar Probleme. Ich bin leider kein Profi was Programmierung angeht. Meine bisherigen Arbeiten bestanden eigentlich immer nur aus dem Standartumfang von C/C++, sprich, ich musste wenn dann nur am Programmanfang eine bestimmte Bibliothek einbinden und neue Funktionen benutzen zu können.

    Dieses Paket dass ich mir über den Link runtergeladen hab ist aber voll mit verschiedenen Dateien, und es scheint auch eine Art "Installation" notwendig zu sein damit ich das in mein Projekt integrieren kann. Hierbei tauchen nun meine Probleme auf. Ich hoffe du kannst mir dabei etwas helfen. Ich hab mir mal die "readme_src.txt" Stück für Stück durchgelesen und versucht zu entschlüsseln was ich machen muss. Ich muss dazu sagen dass ich als IDE "wxDevC++" verwendet. In der ReadMe wird diese IDE leider nicht erwähnt, ich hoffe dass es damit aber trotzdem klappt.

    Erster unklarer Punkt:

    "The library and included sample projects can be build with two different build systems included in
    a release package. Both of them are located in the ./build subdirectory and you can freely choose which one to use."

    In besagtem Unterverzeichnis /build sind nun leider keine zwei ausführbaren Dateien wie erhofft, sondern 19 Dateien mit lauter unbekannten Endungen. Zusätzlich noch 3 Ordner mit nochmal unbekannten Dateien. Die einzige bekannte Datei, die auch mit der ReadMe in Verbindung bringen konnte ist die "create_build_files.bat". Die scheint für irgendeinen Prozess wichtig zu sein (keine Ahnung für was). Nachdem ich wie in der Anleitung beschrieben die Datei über die Kommandozeile angesteurt und ausgeführt habe wurden laut Meldungen verschiedene Datei erstellt. Was an dieser Stelle nun weiter zu tun ist weiß ich nicht.

    Der zweite unklare Abschnitt ist dieser:

    Bakefile build system:
    ----------------------

    Installation - win32:

    When building on win32, you can use the makefiles generated by the bakefile build system located in the ./build
    folder using the WX_DIR, WX_DEBUG, WX_UNICODE, WX_SHARED and WX_MONOLITHIC options to match your wxWidgets build or you
    can re-create these makefiles by invoking

    > bakefile_gen

    command from within the ./build directory (in this case the bakefile build system must be installed on your system).

    Examples of usage of the prebuild makefiles:
    > nmake -f makefile.vc WX_DIR=c:\path\to\my\wxWidgets WX_UNICODE=0/1 WX_DEBUG=0/1 WX_SHARED=0/1 WX_MONOLITHIC=0/1
    > make -f makefile.bcc WX_DIR=c:\path\to\my\wxWidgets WX_UNICODE=0/1 WX_DEBUG=0/1 WX_SHARED=0/1 WX_MONOLITHIC=0/1
    > mingw32-make -f makefile.gcc WX_DIR=c:\path\to\my\wxWidgets WX_UNICODE=0/1 WX_DEBUG=0/1 WX_SHARED=0/1 WX_MONOLITHIC=0/1

    Note that all supplied command line parameters are optional. If some of them are missing then the default values stored
    in relevant makefile are used instead.

    Hierbei weiß ich leider nicht mal im Ansatz was ich machen soll.

    Ein weiterer unklarer Punkt ist was ich mit den ganzen Headerdateien machen soll. Reicht es den include Ordner einfach in mein wxDevC++ Verzeichnis zu kopieren?

    Entschuldige bitte wenn einige dieser Fragen dumm klingen mögen, aber in sämmtlichen C++ Büchern die ich bisher gelesen hab, ging es immer nur um das Programmieren selbst, und nie darum man ganze Projekte zu seinen eigenen Projekten hinzufügt. Es ist mir schon öffters passiert, dass ich an derartigen Problemen gescheitert bin, der Versuch einen XML Parser zu intergrieren, oder der Versuch eine MySQL Datenbank an mein Projekt anzubinden scheiterten ebenfalls an den scheinbar notwenden Vorkehrungen, aber das is ne andere Geschichte...

    Ich hoffe dass sich jemand erbarmt und mir bei diesem leidigen Thema hilft. Ich wäre auch mit Links zufrieden, sofern sie denn Anfänger tauglich sind.

    Mfg Felsen



  • Das Projekt liegt dir nur im Sourcecode vor, du musst das ganze also zuerst kompillieren.

    Such bei Google mal nach MAKE oder BAKEFILE. Das ist Wissen was man sich aneignen sollte bevor man sich an grössere Projekte wagen sollte. Auf solche Buildprogramme wirst du immer wieder stossen, es hilft also enorm wenn man weiss wie man damit umgehen muss.

    Ein weiterer unklarer Punkt ist was ich mit den ganzen Headerdateien machen soll. Reicht es den include Ordner einfach in mein wxDevC++ Verzeichnis zu kopieren?

    Es reicht wenn du bei im Menü Projects->Build Options->Search Directories den Ordner mit den Header-Files einfügst und bei den Linker-Settings die kompillierte Library einfügst.

    Sorry hab gerade nicht viel Zeit um eine detaillierte Anleitung zu schreiben. Schau mal bei Google und wenn du nicht weiter kommst einfach wieder fragen. 🕶





  • Hallo Rookie,
    danke schon mal für die Stichworte und Links. Hab mich nun eingelesen und weiß einigermaßen über BAKEFILEs und MAKEFILEs bescheid, wofür sie im einzelnen gebraucht werden. Trotzdem ist mir der Bezug zu meinem Projekt noch nicht ganz klar.

    Wieso genügt es z.B. nicht einfach nur diese Headerdateien in mein Programm einzubinden, in denen die Funktionen deklariert sind die ich verwenden möchte?

    Das MAKEFILE hat, so wie ich es verstanden habe, die Aufgabe kompliziert verschachtelte Comilierungsvorgänge für größere Projekte strukturiert wiederzugeben, damit das ganze Projekt dann bei Änderungen schnell und automatisch aktualisiert werden kann. Das BAKEFILE soll wohl eine Art Hilfe sein, um das MAKEFILE, wenn es sich oft ändert, automatisch zu erstellen. Außerdem soll dem Programmierer die Arbeit, das MAKEFILE ständig anzupassen, wohl auch erleichtert werden. Soweit so gut. Doch wieso muss ich die Quelldateien von wxShapeFramework überhaupt kompilieren? Zu was werden sie kompliert (doch nicht zu nem ausführbaren Programm, sondern wohl eher zu Objektdateien oder so? ).?

    Was genau hab ich denn nun eigentlich zu tun. Das Kauderwelsch von verwirrenden Dateien konnte ich zwar jetzt schon etwas vereinfachen, und weiß jetz grob welche Aufgaben einige von den unzähligen mitgelieferten Dateien haben, aber den Sinn des ganzen versteh ich irgendwie trotzdem nicht.

    Vielleicht kannst du mir nochmal helfen.

    Mfg Felsen.



  • Felsen schrieb:

    Wieso genügt es z.B. nicht einfach nur diese Headerdateien in mein Programm einzubinden, in denen die Funktionen deklariert sind die ich verwenden möchte?

    Wie du selber schon sagst, steht in den Header nur die Deklaration drin. Aber was ist mit der Defintion der Funktionen und Klassen? Eben, die stehen für gewöhnlich in z.B. *.cpp Dateien drin. Und wie bekommst du die nun bei dir rein? Du könntest sie in dein Projekt reinkopieren. Aber das wäre wirklich ätzend! Also ist es doch genial, wenn du nur deinem Projekt sagst "Verknüpfe dich mit der Definition von Library X!". Und vielleicht sagt dir *.lib oder *.a etwas? Das sind binäre Libraries, wo die kompilierte Definition drin steht. Die kann dein Linker mit deinem Projekt verknüpfen.

    Du musst idealerweise "externe" Libraries als binäre Libs bauen oder irgendwo besorgen (manche liefern die auch fertig mit), und die Header brauchst du nur noch wegen der Deklarationen.



  • Doch wieso muss ich die Quelldateien von wxShapeFramework überhaupt kompilieren? Zu was werden sie kompliert (doch nicht zu nem ausführbaren Programm, sondern wohl eher zu Objektdateien oder so? ).?

    Wie Artchi schon gesagt hat, es wird eine Library und EXE-/BIN-Datei erzeugt. Viele Open-Source-Projekte veröffentlichen den Source um nicht für jedes einzelne unterstützte Betriebsystem kompillierte Daten veröffentlichen zu müssen.

    Was genau hab ich denn nun eigentlich zu tun. Das Kauderwelsch von verwirrenden Dateien konnte ich zwar jetzt schon etwas vereinfachen, und weiß jetz grob welche Aufgaben einige von den unzähligen mitgelieferten Dateien haben, aber den Sinn des ganzen versteh ich irgendwie trotzdem nicht.

    Lass dich nicht verwirren, die meisten Dateien wirst du nicht brauchen. Meistens geht es darum möglichst viele Möglichkeiten der Kompillierung zu bieten. Unter Linux reicht meistens folgendes Shell-Skript:

    ./configure
    make
    
    make install
    


  • Gut, dann hab ich das jetzt verstanden.

    Jetzt stehe ich vor den Problemen wie ich das Makefile genau ausführe. Im Wikipedia Artikel zu "make" steht es gibt verschiedene tools mit denen man das machen kann. Unter Microsoft soll man wohl nmake benutzen, was irgendwie beim VC++ dabei sein soll. Gibt es eine andere Möglichkeit das unter MS auszuführen? Etwa direkt über die Commandozeile?

    Was mich trotzdem etwas stutzig macht, wenn die Rede vom Kompilieren ist, sollte doch wenigstens ein Kompiler mit einbezogen werden. Ich habe hier den GCC, mit dem habe ich einfach mal prbiert deine beiden Befehle auszuführen, hat aber selbstverständlich nicht geklappt.

    Irgendwie, ich weiß auch nicht, trotz eurer Hilfe versteht ich mittlerweile noch weniger als am Anfang ...

    NACHTRAG:

    Bin nun in in der "readme_src" noch auf folgende Anweisung gestoßen:

    mingw32-make -f makefile.gcc WX_DIR=c:\path\to\my\wxWidgets WX_UNICODE=0/1 WX_DEBUG=0/1 WX_SHARED=0/1 WX_MONOLITHIC=0/1

    Ich habs einfach ausprobiert und es hat sich sogar was bewegt, jedoch wurde dann mit folgender Fehlernelung abgebrochen:

    The selected wxWidgets build is not availbale! Please use the options prefixed with WX_ to select another wxWidgets build.

    Beim Pfad hab ich selbstverständlich den Pfad zu meinem wxWidgets Verzeichnis eingegeben.



  • Welchen Compiler nutzt du denn? Arbeitest Du mit MSVC? Dann mußt du auch mit MSVC die Lib bauen. Du kannst nicht MinGW benutzen, um Libs für MSVC zu bauen. Umgekehrt get es auch nicht. Wenn das so einfach wäre, würden die Entwickler von wxShapeFramework das auch so machen (eine Lib für alle Compiler bereitstellen, was aber ebend nicht geht).

    Und nmake.exe kann man natürlich auch aus der Konsole aufrufen:

    Start->Programme->MS VisualC++->VS Tools->Eingabeaufforderung/Command Prompt

    Und dann funktionieren alle MSVC-Tools aus der Konsole. Hilfe zu nmake:
    http://msdn.microsoft.com/de-de/library/dd9y37ha.aspx

    Wenn du MinGW als Compiler nutzt, kann ich dir zu deinem speziellen Fehler allerdings leider nicht helfen (ich benutze wxWidgets nicht).



  • Hallo, ja ich benutze leider MinGW. Habe derzeit auch kein MSVC installiert. Ist es dann überhaupt möglich libs für meine IDE (wxDevC++) zu erstellen? Oder hat die IDE damit überhaupt nichts zu tun. In der "readme_src" steht auch noch folgender Absatz:

    For Code::Blocks Workspace/Project files producing shared library with UNICODE support, using wxWidgets DLLs type:
    > premake\premake-win32.exe --target cb-gcc --unicode --with-wx-shared --shared

    For MSVS 2005/2008 Workspace/Project files producing staticaly built library with UNICODE support and staticaly linked runtime
    and no built-in wchar type:
    > premake\premake-win32.exe --target vs2005 --unicode --static-runtime --no-builtin-wchar

    For GNU makefile producing static library (static link of both wxWidgets libs and runtime) type:
    > premake\premake-win32.exe --target gnu --unicode --static-runtime

    Ich weiß nicht, vielleicht hilft der ja noch für besseres Verständnis.

    Mfg Felsen



  • Hallo, ja ich benutze leider MinGW. Habe derzeit auch kein MSVC installiert. Ist es dann überhaupt möglich libs für meine IDE (wxDevC++) zu erstellen? Oder hat die IDE damit überhaupt nichts zu tun.

    Wieso leider? 😉

    Du scheinst da was falsch verstanden zu haben, sowohl mit MinGW als auch mit MSVC kann man Libs bauen, nur kann man keine mit MinGW (bzw. gcc) kompillierten Libs mit MSVC benutzen und umgekehrt!

    For Code::Blocks Workspace/Project files producing shared library with UNICODE support, using wxWidgets DLLs type:
    > premake\premake-win32.exe --target cb-gcc --unicode --with-wx-shared --shared

    For MSVS 2005/2008 Workspace/Project files producing staticaly built library with UNICODE support and staticaly linked runtime
    and no built-in wchar type:
    > premake\premake-win32.exe --target vs2005 --unicode --static-runtime --no-builtin-wchar

    For GNU makefile producing static library (static link of both wxWidgets libs and runtime) type:
    > premake\premake-win32.exe --target gnu --unicode --static-runtime

    wxShapeFramework bietet dir drei Möglichkeiten um die Library zu kompillieren, entweder mit Code::Blocks, mit Visual Studio 2005/2008 oder über ein Makefile. Wenn du mit MAKE arbeiten willst musst du also folgende Zeile ausführen:

    premake\premake-win32.exe --target gnu --unicode --static-runtime

    Nun werden die für eine Kompillierung mit Hilfe von MAKE notwendigen Dateien erstellt. Danach sollte mit der von dir angesprochenen Zeile...

    mingw32-make -f makefile.gcc WX_DIR=c:\path\to\my\wxWidgets WX_UNICODE=0/1 WX_DEBUG=0/1 WX_SHARED=0/1 WX_MONOLITHIC=0/1

    ... eigentlich funktionieren (natürlich mit angepassten Parameter).



  • Felsen schrieb:

    Hallo, ja ich benutze leider MinGW. Habe derzeit auch kein MSVC installiert. Ist es dann überhaupt möglich libs für meine IDE (wxDevC++) zu erstellen? Oder hat die IDE damit überhaupt nichts zu tun.

    Die IDE ist einfach nur eine grafische Steuereinheit für den Compiler. Insofern hat eine IDE nichts zwangsweise mit dem Bauen von Libs am Hut. Klar kann eine IDE auch Libs bauen, aber das tut sie auch nur, in dem sie ein Kommandozeilen-basiertes Tool (wie make oder nmake) aufruft. Ob du jetzt in der IDE einen Knopf drückst, oder direkt make eingibst, ist egal.

    Hatte nur gedacht, das du MSVC benutzt, weil du nmake angesprochen hattest.



  • Hallo,

    wxShapeFramework bietet dir drei Möglichkeiten um die Library zu kompillieren, entweder mit Code::Blocks, mit Visual Studio 2005/2008 oder über ein Makefile.

    Das verstehe ich leider nicht ganz. Ich will auch nicht unbedingt mit MAKEFILE arbeiten, ich will einfach nur dass es funktioniert, und das so wenig umständlich wie möglich. Aber nach eueren Erklärungen scheint es ja so zu sein, dass ich libs, die ich mit fremden IDE/Kompilern herstelle, ich dann später nicht in meiner IDE wxDevC++ bzw. mit meinem Kompiler gcc verwenden kann. Da ich ja weder MSVC noch Code::Blocks verwendet scheint doch der Weg über das MAKEFILE die einzige Möglichkeit zu sein, oder hab ichs wieder falsch verstanden.

    Wenn ich folgende Zeile ausführe

    premake\premake-win32.exe --target gnu --unicode --static-runtime

    erhalte ich folgende Fehlermeldung:

    No Premake scripts found!

    Wo befinden sich denn normalerweise diese premake skripts, irgendwo in diesem rießigen Dateiwirrwarr werden sie ja wahrscheinlich mitgeliefert worden sein. Hab schon die verschiedensten Dateien die es sein könnten mit in den Ordner in dem ich den MAKE Prozess aufrufe, hineinkopiert, aber alles ohne Erfolg, die Meldung bleibt die selbe. Ich habe testweise auch mal probiert das ganze für Code::Blocks zu kompilieren, aber wie zu erwarten auch da der selbe Fehler.

    Hatte nur gedacht, das du MSVC benutzt, weil du nmake angesprochen hattest.

    Nein, hatte nmake nur deswegen angesprochen, weil ich befürchtet habe, die meisten make Programme würden nur unter Linux laufen, und nmake war das einzige dass ich auf die schnelle mit Windows in Verbindung bringen konnte, aber eben leider nur in Kombination mit MSVC das ich nicht habe und mir auch ungern besorgen möchte.

    Noch eine kleine Information aus der Hilfe zum Abschluss, die wichtig sein könnte, bei der ich aber auch nicht weiß, wie ich sie zuordnen soll:

    When building on win32, go to the ./build subdirectory and simply type:

    > create_build_files.bat

    There are few standard build configurations defined in the batch file and you can freely modify it or you can
    inkove the premake system directly as follows:

    Examples of usage of the premake scripts:

    ... anschließend kämen noch die Anweisungen für die einzelnen Kompiliervorgäbge, aber die hab ich ja oben schon mal abgedruckt. Dieses genannte Batch File, hab ich auch ausgeführt, dadurch enstanten folgende Beiden Dateien:

    wxShapeFramework.sln
    wxShapeFramework.workspace

    Spielen etwa diese Dateien auch eine Rolle?

    Ich hoffe ihr werdet mit dem allen besser fertig als ich, ich hab versucht so viel Informationen zu geben wie möglich. Ich raffs einfach nicht. Bitte helft.

    Mfg Felsen

    WICHTIGER NACHTRAG:

    Es ist nun folgendes passiert: Ich hab einfach mal die premake-win32.exe aus dem premake Verzeichnis ins build Verzeichnis kopiert, weil von da an alle Dateien zur Verfügung stehen und hab dann einfach obigen premake-build Befehl nochmal ausgeführt, und (!!!) es hat sich tatsächlich was getan. Es wurde angezeigt, dass nun die Makefiles erstellt wurden. Ich habe jetzt eine "wxsf.bkl" und noch ein paar nebensächliche Dateien für Beispiele erhalten.

    Anschließend hab ich dann gleich versucht das Makefile auf folgende Weise auszuführen:

    > mingw32-make -f makefile.gcc WX_DIR=C:\wxWidgets-2.8.9

    und ich erhalte die gewohnte Meldung

    The selectes wxWidgtes build is noch available! Please use the options prefixed with WX_ to select another wxWidgets build

    Was genau verstehen die denn unter einer wxWidgets build?



  • Felsen schrieb:

    Das verstehe ich leider nicht ganz. Ich will auch nicht unbedingt mit MAKEFILE arbeiten, ich will einfach nur dass es funktioniert, und das so wenig umständlich wie möglich. Aber nach eueren Erklärungen scheint es ja so zu sein, dass ich libs, die ich mit fremden IDE/Kompilern herstelle, ich dann später nicht in meiner IDE wxDevC++ bzw. mit meinem Kompiler gcc verwenden kann. Da ich ja weder MSVC noch Code::Blocks verwendet scheint doch der Weg über das MAKEFILE die einzige Möglichkeit zu sein, oder hab ichs wieder falsch verstanden.

    Du hast leider noch ein Verständnisproblem, auch wenn dein Fazit korrekt ist.

    Was ist eine IDE? Eine grafische Oberfläsche die die Entwicklung vereinfacht. Ist in jeder IDE ein Compiler verpflanzt? Nein, eher selten. Deshalb hier mal ein Crashkurs:

    Menschen benutzen Compiler.
    Build-Tools benutzen Compiler.
    IDEs benutzen Compiler.

    So, du als Mensch kannst einen Compiler über die Konsole benutzen, z.B. so:

    g++.exe main.cpp

    Damit kompilierst und linkst du dein C++-Programm. Was macht ein Buildtool wie make? Genau, es macht das was du machen würdest. Was macht eine IDE? Das was du machen würdest.

    Was benutzt Code Blocks für einen Compiler? GCC MinGW, ICC, MSC o.a.
    Was benutzt VisualC++ für einen Compiler? MSC, ICC o.a.
    Was benutzt DevC++ für einen Compiler? GCC MinGW.

    Welche Build-Tools gibt es? make, bjam, Scons u.a.

    OK? IDEs aber bringen auch eigene Build-Tools mit, obwohl sie auch fremde Build-Tools benutzen können.

    Du siehst so langsam, worauf das hinaus läft? IDEs sind nur grafische Front-Ends die fremde Tools für dich fernsteuern (benutzen).

    Was heißt das für dich? Du mußt wissen, was DevC++ benutzt! DevC++ hat einen GCC MinGW Compiler dabei. Auch wenn DevC++ der letzte Schrott ist, weil es seit Jahren nicht mehr gepflegt wird, weißt du:
    "ich muss die Libs für MinGW bauen! Wie, ist egal!"

    Schauen wir mal:

    wxShapeFramework bietet dir drei Möglichkeiten um die Library zu kompillieren, entweder mit Code::Blocks, mit Visual Studio 2005/2008 oder über ein Makefile.

    CB und MSVC haben eigene Build-Tools eingebaut. Es ist erstmal unerheblich das es IDEs sind! Du kannst z.B. CB zum bauen benutzen, wenn CB mit dem MinGW ausgestattet ist. Und dann die Libs in deinem DevC++ benutzen. Warum? Weil DevC++ auch MinGW benutzt.

    Was ist der beste Kompromiss bei den ganzen Möglichkeiten? Ein Build-Tool das IDE-unabhängig ist. Und make ist ein Build-Tool von vielen... und das älteste. 😉

    Dieses genannte Batch File, hab ich auch ausgeführt, dadurch enstanten folgende Beiden Dateien:

    wxShapeFramework.sln
    wxShapeFramework.workspace

    Spielen etwa diese Dateien auch eine Rolle?

    Hier hast du dir Build-Files für das MSVC erzeugen lassen. D.h. du könntest jetzt für und mit MSVC den Build-Vorgang starten, wenn du denn MSVC hättest. Hast du nicht, willst du nicht. Also nutzlos für dich. 😃



  • Gut, da ich es ja wie durch ein Wunder geschafft habe das MAKEFILE wxSF.bkl zu erstellen, muss ich es ja jetzt nur noch durch dieses seltsame Programm "make" (ich nehme mal an es handelt sich hier einfach um meinen gcc Kompiler) schicken. Dabei bekomme ich aber zur oben abgerduckte Meldung, dass mein wxWidgets build nicht auffindbar ist. Was bedeutet das?


  • Mod

    Ich würde dir empfehlen das mit premake.exe und dann über C::B zu lösen. Sowieso ist ein Umstieg von DevC++ auf C::B eine Überlegung wert.


Anmelden zum Antworten