Forum
Tipps
News
Menu-Icon

C++, Direct X und allgemeine Frames/Dialoge programmierung

Guten Tag erstmal,

bevor ich wie die meisten anderen anfange mein Problem zu beschreiben und dann mühsamst die Einzel-Informationen herausgequetscht werden müssen fang ich gleich mit der Lagebeschreibung an:

Ich habe vor ca. 1 Jahr mit Java angefangen und fadisiere mich jetzt, da ich schon alles kann.
--> C++, hab damit angefangen, bin begeistert auch wenns "***please notify moderator / bitte melden***" ist, denn leicht ist es ja mal auf keinen Fall.
Hab mir ein schönes Tutorial durchgelesen(ca. 200 Seiten + ca. 60 Seiten src-code), und kann jetzt mal so die allgemeinsten Sachen (class, struct, union, zeiger, funktionszeiger, referenzen, operatoren selbst definierung, etc.).

Alles gut und schön, jetzt will ich aber net dauernd Konsole haben, jetzt brauch ich mal n Frame :-D.

Also die erste Frage ist: Wie mache ich ein Frame, mit Buttons, TextFeldern, und dem restlichen Zeugs?
Natürlich kann man sich in jeder Programmierumgebung eine "Win32 Anwendung" generieren lassen, und man hat n Fenster. Aber da ist immernoch kein Button(irgendwie logisch :-D) drauf und es steht auch net wie es funktioniert^^.

Dann (wie jeder andere Jugendliche auch) will man ein Spiel programmieren. Alles gut und schön, Canvans 2D, super, ein bisschen Vektorgrafik reinklopfen, ein bisschen was mit "Mouse/Keylistener" herumhantieren und es is fertig.
Die 2. Frage: Wie greif ich auf DirectX zu, benutze es, etc.?

Bevor ihr eine Antwort schreibt: Ich bin leidenschaftlicher Java Programmierer, erst jetzt weis ich wie schwer, aber auch wie viel mehr Möglichkeiten C++ bietet. Wegen dem 3D, schreit micht nicht an, ich habe schon in Java die OpenGL einbindung verwendet und weis das 3D alles andere als leicht ist.

Die Antworten müssen keine Erklärung sein, sie können auch ein Verweis auf I-net Seiten sein, oder Online Bücher, die die Lösung beinhalteten (aber dann bitte gewählt und nicht einfach aus google vorschläge herauskopiert, und das auch bitte gratis)

mfg. und hoffe baldige Antwort.

P.S. Platform: Windows XP; Programmierumgebung: Eclipse/Dev-Cpp/Microsoft Visual C++;
 


Antworten zu C++, Direct X und allgemeine Frames/Dialoge programmierung:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du brauchst natürlich erstmal ne Grafikbibliothek. Also was AWT oder Swing unter Java sind. Unter Windows wird gern MFC verwendet, sonst auch Qt, GTK etc. Gute Tutorials kann ich dir hier nicht empfehlen, für MFC sollte es bei Microsoft genug Material geben, für Qt gibts hier eigentlich alles was man braucht.
Für DirectX kannst mal nen Blick hierauf werfen, das wurde mir empfohlen, als ich mal mit dem kram anfangen wollte (habs dann aber doch gelassen)

Mh... danke, aber gibt es für diese Bibliotheken der auch so ne art "API", also die Javadokumentation, als C++ Dokumentation, wo halt alles drin steht über die?

Und kurz 2 allgemeine Fragen:
1. Ist es nicht das beste (fast) alles mit Dynamischen Variablen und Zeigern zu programmieren?
2. Wenn man Klassen in .h Dateien deklariert, und extern in .cpp Dateien definiert, ist das dann gleich schnell beim Ausführen (nicht kompilieren!), wie wenn man alles inline definieren würde?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Mh... danke, aber gibt es für diese Bibliotheken der auch so ne art "API", also die Javadokumentation, als C++ Dokumentation, wo halt alles drin steht über die?
Sollte es eigentlich geben. Für MFC würde ich mal in die MSDN gucken:
http://msdn2.microsoft.com/en-us/library/d06h2x6e.aspx
Für Qt gibts sowas hier: http://doc.trolltech.com/
Einfach auf die gewünschte Version klicken, da gibts dann auch ne API-Dokumentation.
Für GTK & DirectX gibts sowas sicherlich auch irgendwo...

Zitat
Und kurz 2 allgemeine Fragen:
1. Ist es nicht das beste (fast) alles mit Dynamischen Variablen und Zeigern zu programmieren?
Hmm, das lässt sich so pauschal nicht beantworten. Ich bin kein Freund von Pointern und benutze fast überall "richtige" Objekte bzw. (konstante) Referenzen bei der Übergabe an Funktionen etc. In C++ muss man sich (im Gegensatz zu Java) da ja selbst drum kümmern, dass man wirklich call by reference kriegt und nicht call by value. IIRC tun sich Referenzen und Pointer bzgl. der Effizienz da nicht viel. Eventuell kann man ein bischen was rauskitzeln, wenn man nur Pointer benutzt, aber man muss da wirklich genau wissen, was man da tut und was wann/wie passiert...

Zitat
2. Wenn man Klassen in .h Dateien deklariert, und extern in .cpp Dateien definiert, ist das dann gleich schnell beim Ausführen (nicht kompilieren!), wie wenn man alles inline definieren würde?
Ja! Die getrennte Deklaration und Definition ist der standard way of working in C++. Du kannst den Kram natürlich auch im .h definieren, das wird aber allgemein als schlechter Stil angesehen.
Oder meintest du die inline-Definition von Funktionen (mit dem Keyword 'inline')? 

Danke, ich habe es genau so gemeint wie du es interpretiert hast.
Wobei, noch zum "inline" deklarieren:
Wie ist das dann mit gleichnamigen Variablen?, also z.B. ich definiere eine index-variable, fuer die aktuelle funktion, und dann rufe ich eine "inline" deklarierte methode auf, die eine gleichnamige Variable initialisiert. Kommt dann ein Fehler, oder sind dann eh nur mehr die Speicheradressen im Spiel, also ist das dann schon vom Compiler uebersetzt?

Und jetzt zu den Zeigern:
Die Frage war auf die Programmierun von Spielen bezogen. In diesem Fall 2D Spiele (Doppelgebufferte Echtzeit-Spiele). Denn wenn die X mal pro Sekunde neu zeichnet und dabei ueber Arrays drueber gehen, summieren sich die Index-Variablen, und da es ja kein "System.gc()" (in Java der manuelle Aufruf der Garbage-Collection) gibt, ist das dann ja nicht sehr Speicher-Freundlich.
Okay, man macht es eh meistens mit for-each Schleifen, aber das war nur ein Beispiel.

Ein besseres Beispiel villeicht, dass Einheiten (Grosse Objekte) erzeugt werden, und früher oder später sterben. Und dann is es wirklich nur "Speicher-Spamm".

Und die nächste Frage:
Ich hab mir in Visual C++ eine "Form" generieren hab lassen. Also ein Tool das mir den Code fuer die Grafische Oberfläche generiert.
Und da hab ich öfters bei Variablen ein '^' gesehen(im SRC-Code).
--> Was macht das, ist das auch sowas wie ein Zeiger?   

« Letzte Änderung: 01.01.08, 22:04:31 von Fuxi »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Wobei, noch zum "inline" deklarieren:
Wie ist das dann mit gleichnamigen Variablen?, also z.B. ich definiere eine index-variable, fuer die aktuelle funktion, und dann rufe ich eine "inline" deklarierte methode auf, die eine gleichnamige Variable initialisiert. Kommt dann ein Fehler, oder sind dann eh nur mehr die Speicheradressen im Spiel, also ist das dann schon vom Compiler uebersetzt?
Ja, das kriegt der Compiler schon auseinander. Die Namen werden meistens eh durch die Werte ersetzt. Im übrigen hat der Compiler dort die freie Wahl, das inline ganz oder teilweise zu ignorieren.

Zitat
Denn wenn die X mal pro Sekunde neu zeichnet und dabei ueber Arrays drueber gehen, summieren sich die Index-Variablen, und da es ja kein "System.gc()" gibt, ist das dann ja nicht sehr Speicher-Freundlich.
Dann mach halt vorher eine Index-Variable und verwende sie bei jedem Durchlauf wieder. Im Übrigen wird die Index-Variable ja idR in einem Scope (der Schleife) angelegt und automatisch ungültig (und damit gelöscht) wenn der Scope verlassen wird. Wenn du Pointer verwendest, musst du den Speicher am Ende der Schleife explizit wieder freigeben, weil sonst nur der Pointer weg ist, der Speicherbereich auf den er zeigt aber nicht. Das ist dann ein hübsches Speicherleck, weil du dann keine Chance mehr hast, ihn wieder freizugeben.

Zitat
Okay, man macht es eh meistens mit for-each Schleifen, aber das war nur ein Beispiel.
Gibts sowas in C++ mittlerweile auch? In Java wird das intern über Iteratoren gemacht oder?

Zitat
Ein besseres Beispiel villeicht, dass Einheiten (Grosse Objekte) erzeugt werden, und früher oder später sterben. Und dann is es wirklich nur "Speicher-Spamm".
In C++ musst du die natürlich explizit löschen, wenn du sie nicht mehr brauchst - es sei denn du nimmst "richtige" Objekte, die werden zerstört, sobald du aus dem Scope läufst, in dem sie angelegt wurden. Du musst natürlich aufpassen, dass du dann nur Referenzen/Pointer auf diese Objekte an Funktionen übergibst (die werden sonst eiskalt kopiert und das ist dann *wirklich* ineffizient).

Zitat
Und da hab ich öfters bei Variablen ein '^' gesehen(im SRC-Code).
--> Was macht das, ist das auch sowas wie ein Zeiger?   
Keine Ahnung. Nie gesehen - ich mache allerdings auch nicht viel mit Grafik und auch nicht unter Windows...
Zitat
Gibts sowas in C++ mittlerweile auch? In Java wird das intern über Iteratoren gemacht oder?
Ja, in Java wird es mit Iterator gemacht, ist somit schneller als eine "index-schleife". Und ja, das gibts auch in C++
Folgende syntax:
int arr[20];
for each (int i in arr) {
    std::cout < i;
}

Und jetzt zu dem ^:
array<int>^ arr = gcnew array<int>{0,1,2,5,7,8,11}Eine Ahnung was es ist, und warum es da steht?
« Letzte Änderung: 02.01.08, 16:08:43 von Fuxi »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du bist sicher, dass das nicht CLI ist mit dem ^? Das ist nicht wirklich "echtes" C++.
Das for each sieht mir auch mehr nach ner MS-spezifischen Erweiterung aus, im ANSI-Standard ist das nämlich nicht drin. Würde mich wundern, wenn man das mit dem gcc kompiliert kriegt.
 

Das kommt davon wenn man Produkte von Microsoft verwendet...
In diesem Fall "Microsoft Visual C++ 9.0 Express Edition".
Es ist wie du sagst, ich dachte "Endlich hab ich keine Komplette Dokumentation einer grafischen Oberflaeche gefunden (.NET Framework), und jetzt das!!!.
Danke auch fuer den Wikipedia link, hab es mir durch gelesen.
-->Na super, automatische Speicherverwaltung mit dem neuem Zeiger-operator ^. Da kann ich gleich Java nehmen, und es wird genau so langsam.
Deswegen bin ich ja eigtl von Java weg, weil es fuer Spiele zu langsam ist, zumindest fuer "Echtzeit-Spiele".

Grml, und nen normalen Zeiger (*) kann ich nicht verwenden.
Mh... muss ich wohl doch wieder weg von der Platform, und auf Dev-cpp umsteigen, was da geht, muss dann was Geischeites sein ;D.

Jetzt mal ne Frage (die nicht explizit an dich gerichtet ist Lisaa), ist es gut/schlecht das .NET Panel als Grafische Oberflaeche zu nutzen, und auf das Panel Doppelgebuffert zu zeichnen (fuer "Echtzeit-Spiele", also X mal pro Sekunde)?

Wobei ich mir schon die echte MFC Dokumentation angeschaut habe, und die is auch gut (von dem Link von dir vorher), und jetzt werd ich mich einfach da mal einarbeiten :-D.

mfg.

P.S. der grund warum ich auf des .NET Framework gekommen bin ist das "Form-Drawing" Tool von dem Microsoft Visual C++. Da klick ich halt auf "Button erstellen", und zieh in mit Drag'n'drop in die richtige Groesze/Position. 

« Letzte Änderung: 03.01.08, 00:46:52 von Fuxi »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Noch mal was grundsätzliches: Java ist ja deshalb so langsam, weil es eben erstmal in Java-Bytecode übersetzt wird, der dann zur Laufzeit von der VM interpretiert wird. Der Vorteil von C++ ist, dass direkt in ausführbaren Maschinencode kompiliert wird. .NET ist aber im Prinzip ähnlich wie Java, d.h. auch hier wird in eine Zwischenrepräsentation (CIL, Common Intermediate Language) übersetzt, die zur Laufzeit interpretiert wird. Ob .NET daher viel schneller ist als Java ist doch stark zu bezweifeln.
PS: Schonmal Eclipse mit C++ (CDT) Plugin verwendet? Falls du schon für Java mit Eclipse gearbeitet hast, dürfte der Umstieg dann leichter fallen.

Nun, das mit Eclipse... ich wollte urspruenglich auch Eclipse verwenden, nur dann kam immer der Fehler "Binaires not Found", beim Kompilieren. Gut dann hab ich im i-net gesucht.
Raus kam ich brauch dieses CDT Plugin, aber fuer das brauch ich wieder was anderes, und dieses andere wieder was. Dann hab ich es einfach gelassen, und Dev-cpp genommen.

Ma ne Frage zur Objektorientierung: Wie rufe ich von einem Konstruktor aus, einen anderen Konstruktor auf ???.
In Java geht das mit "this(params);", in C++ geht es auf diese weise nicht.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
myclass::bla( int x, int y )
{
    // do sth.
}

myclass::bla( int x, int y, int z ) 
: bla( x, y )
{
    // do sth.
}
 

Danke, aber das sind Methoden aufrufe, und nicht Konstruktoren aufrufe. Folgender Code:

Bruch::Bruch(void)
{
zaehler = new int;
nenner = new int;
}
Bruch::Bruch(int z, int n)
//BITTE OBRIGEN KONSTRUKTOR AUFRUFEN
{
*zaehler = z;
*nenner = n;
}
Und bei dem kommentar haett ich gern dass das obrige ausgefuehrt wird.

P.S. von der Sinnhaftigkeit des Codes abgesehen, man koennte es natuerlich auch anders loesen

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK, sorry, da habe ich mich versehen. Konstruktoren aufrufen geht an der Stelle nur für Konstruktoren der Basisklasse, von der die aktuelle Klasse abgeleitet ist. Konstruktoren der gleichen Klasse können in C++ *nicht* aus anderen Konstruktoren aufgerufen werden. Du wirst es also anders lösen müssen (z.B. mit ner init-Funktion oder so)


« Probelm in C++ ..kompiliern unter windows vista mit visual c++ »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Tag
Ein Tag ist ein englischer Begriff und bedeutet so viel wie Etikett, Mal, Marke, Auszeichner und Anhänger. Generell ist Tag eine Auszeichnung eines Datenbetandes mit...

Java
Java ist eine von der Firma SUN entwickelte Programmiersprache. Da Java unabhängig vom Betriebssystem läuft, kann ein einmal geschriebenes Programm auf allen Ja...

Javascript
JavaScript ist eine weit verbreitete Skriptsprache, die ursprünglich von Netscape für das DOM-Scripting für Webseiten entwickelt wurde. Sie hat sich seitde...