Forum: PC-Programmierung Mit Visual Studio 2022 C++ möglich?


von Hans B. (hans_wdf)


Lesenswert?

Hallo, ich möchte ein Windowsprogramm erstellen, bei dem sich ein Ball 
in einem Fenster zufällig hin und her bewegt und sich, wenn man ihn 
anklickt, verfärbt. Das ist ein Trainer für Computerspiele.

Ich habe das vor Jahren schon mal mit Qt realisiert, aber meine 
Festplatte ist kaputt gegangen und ich komme mit dem heutigen Qt 
irgendwie nicht mehr zurecht und möchte auch mal was anderes probieren.

Dafür habe ich mir Visual Studio 2022 C++ installiert und mir dazu das 
Buch von Richard Kaiser gekauft und darin auch schon einiges gelesen.

Meine Frage: Ist das, was ich vorhabe mit Visual Studio 2022 C++ 
überhaupt machbar?

Grüße
Hans

von Michael B. (laberkopp)


Lesenswert?

Hans B. schrieb:
> Ist das, was ich vorhabe mit Visual Studio 2022 C++ überhaupt machbar?

Natürlich.

Aber es gibt ungefähr 1 Dutzend Möglichkeiten, von GDI bis HTML5, ind du 
musst dir eine aussuchen die am Besten zum Test passt.

DirectX ?

von Harald K. (kirnbichler)


Lesenswert?

Hans B. schrieb:
> Ist das, was ich vorhabe mit Visual Studio 2022 C++
> überhaupt machbar?

Natürlich.

Auf drölfzig verschiedene Arten und Weisen.

Du kannst ein reines C-Programm schreiben, das die Win32-API verwendet, 
Du kannst das gleiche in C++ machen, Du kannst ein C++-Programm 
schreiben, das eine C++-Klassenbibliothek wie die mit VC mitgelieferte 
MFC verwendet, oder eine andere, die Du Dir dann allerdings noch 
besorgen müsstest (wxWidgets, Qt etc.), Du kannst auch auf das moderne 
.Net-Geraffel zurückgreifen und eine der dafür vorgesehenen 
.Net-Sprachen wie C# oder "C++/CLI" bzw. "Managed C++" verwenden (die 
haben zwar C++ im Namen, sind aber kein C++), und dann heißt das ganze 
dann je nach Wetterlage Windows Forms, Windows Presentation Foundation 
(WPF), WinRT oder WinUI ...

All' das kannst Du mit Visual Studio 2022 machen. Und sicher noch mehr, 
die Liste erhebt keinerlei Anspruch auf Vollständigkeit.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Von Haus aus gingen noch OpenGL und Vulkan (mit diversen 
Programmeniersprachen). Mit externen Frameworks wie SDL, Cairo, und 
natürlich auch Qt ginge es ebenso.

C# + WinUI wäre die modernste Variante, die dann auch nahtlos sowohl 
Touchscreens also auch Mausbedienung unterstützt und auch Integration in 
den Microsoft Store ermöglicht. Allerdings ist das noch nicht sehr 
ausgereift.

von Klaus (feelfree)


Lesenswert?

Hans B. schrieb:
> Hallo, ich möchte ein Windowsprogramm erstellen, bei dem sich ein Ball
> in einem Fenster zufällig hin und her bewegt und sich, wenn man ihn
> anklickt, verfärbt. Das ist ein Trainer für Computerspiele.

So was hat mein Sohn in Klasse 7 gemacht, mit Scratch...

von Bri (bri)


Lesenswert?

Wenn es nicht unbedingt C++ sein muss, dann wäre vielleicht Python mit 
pygame eine bessere Alternative.

C++ hat heutzutage noch seine Anwendungsgebiete. Aber meiner Meinung 
nach gibt es für Desktopanwendungen mittlerweile bessere 
Programmiersprachen.

von Harald K. (kirnbichler)


Lesenswert?

Die beste Programmiersprache ist die, die man bereits kennt. Der 
Threadstarter hat bereits C++-Erfahrung, sonst hätte er vor seinem 
Festplattendefekt nicht schon erfolgreich mit Qt arbeiten können.

In so einem Fall grenzt es an Unfug, zu einer anderen Programmiersprache 
zu raten.

von Klaus (feelfree)


Lesenswert?

Harald K. schrieb:
> Die beste Programmiersprache ist die, die man bereits kennt.

Widerspruch. Ich entwickle seit Jahrzehnten beruflich mit C++. Wenn ich 
die Aufgabe des TEs lösen wollte, wäre C++ trotzdem meine allerletzte 
Wahl.

von Harald K. (kirnbichler)


Lesenswert?

Klaus schrieb:
> Wenn ich die Aufgabe des TEs lösen wollte, wäre C++ trotzdem
> meine allerletzte Wahl.

Aha. Und was mögen Deine Beweggründe dafür sein? Daß die Aufgabe aus 
einem Bereich kommt, mit dem Du in Deinen bisherigen Jahrzehnten noch 
nie zu tun hattest?

Wenn Du beispielsweise als Embedded-Entwickler arbeitest, und jetzt 
Erstkontakt zur Windows-GUI-Programmierung hast, dann kann ich derartige 
Gedanken nachvollziehen.

Mir fallen aus dem Stegreif gleich mehrere andere Programmiersprachen 
ein, mit denen ich die Aufgabe noch weniger lösen wollen würde als in 
C++ - dazu gehören C, Assembler, Pascal, Basic, Cobol, Fortran und auch 
Forth. Was C betrifft - ich habe schon Windows-GUI-Programmierung in C 
betrieben. Ich kenne das, und ich weiß, daß ich das mir nich nochmal 
antun muss. Allerdings: Mir hat das damals geholfen, das 
Nachrichtenkonzept der Windows-GUI zu verstehen, das war also keine 
verlorene Zeit, sondern Grundlagenwissen, das mir verstehen hilft, was 
die eine oder andere C++-Klassenbibliothek zu abstrahieren versucht.

In anderen Bereichen fühle ich mich mit C aber auch heute noch sehr wohl 
- ich setze es halt da ein, wo es für mich passt.

von Klaus (feelfree)


Lesenswert?

Harald K. schrieb:
> Und was mögen Deine Beweggründe dafür sein? Daß die Aufgabe aus
> einem Bereich kommt, mit dem Du in Deinen bisherigen Jahrzehnten noch
> nie zu tun hattest?

Hast es erkannt. Und obwohl ich eben gaaaanz viel C++ Erfahrung habe, 
aber fast keinerlei Erfahrung mit GUI-Programmierung, ich also auf 
diesem Gebiet blutiger Laie bin, würde ich niemals auf die Idee kommen, 
deinen Leitspruch

> Die beste Programmiersprache ist die, die man bereits kennt.

zu beherzigen.
Sondern mir etwas suchen, was einfach und schnell geht, vielleicht zB 
das hier als Startpunkt: https://p5js.org/examples/games-circle-clicker/

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Visual Studio 2022 kann ja bestimmt auch openGL. Danach würde ich
zuerst suchen. Da hast du deinen Ball, bzw. Kugel (Sphere) und
klatscht die entsprechende Tapete (Textur) drauf. Und das alles noch
im 3D - Raum. Das Verfärben kann man dann über verschiedenfarbige
Texturen machen. Und Rotieren geht natürlich auch.
Ich denke, das das noch leichter ist, als über GDI bzw. Win-API selber 
zu malen.

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Bri schrieb:
> Wenn es nicht unbedingt C++ sein muss, dann wäre vielleicht Python

War ja klar, dass in einem Thread in dem explizit nach C++ gefragt wird 
nicht noch irgendein Honk daher kommt der genau das nicht verstanden hat 
und unbedingt verlautbaren lassen muss dass er eine andere Sprache 
empfiehlt.

von Klaus (feelfree)


Lesenswert?

Michael B. schrieb:
> War ja klar, dass in einem Thread in dem explizit nach C++ gefragt wird
> nicht noch irgendein Honk daher kommt der genau das nicht verstanden hat
> und unbedingt verlautbaren lassen muss dass er eine andere Sprache
> empfiehlt.

Wenn also in einem anderen Thread jemand fragen würde, ob ein 
HSS-Spiralbohrer dazu geeignet ist, sich ins Knie zu bohren, wäre deine 
Antwort  vermutlich: Ja, geht.

Ja, kann man so sehen.

von Hans B. (hans_wdf)


Lesenswert?

Ich bedanke mich für alle Tipps!

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Harald K. schrieb:

> Mir fallen aus dem Stegreif gleich mehrere andere Programmiersprachen
> ein, mit denen ich die Aufgabe noch weniger lösen wollen würde als in
> C++ - dazu gehören C, Assembler, Pascal, Basic, Cobol, Fortran und auch
> Forth.

Wieso nicht Basic? Zumindest in der Form von VB(.net) ist 
GUI-Programmierung damit überhaupt kein Problem. Lauft exakt genauso ab 
wie in C#. Was natürlich erwartbar ist, da das darunter liegende 
Framework dasselbe ist.

> Allerdings: Mir hat das damals geholfen, das
> Nachrichtenkonzept der Windows-GUI zu verstehen

Dieses Wissen kannst du an sehr vielen Stellen auch bei Benutzung des 
.net-Framework verwenden. Viele Komponenten des Framework (insbesondere 
natürlich der Kram in Windows.Forms) sind mehr oder weniger nur Wrapper 
um die altbekannten Common Controls, zumindest in der 
Windows-Inkarnation des Frameworks.

Allerdings: für schnelle und flüssige Grafik ist dieses ganze 
Win-API-basierte Zeug nur eher notdürftig geeignet. Ja, man kann OnPaint 
überschreiben, also das machen, was du als Behandlung der 
WM_PAINT-Nachricht kennst, bloß etwas komfortabler. Aber die mögliche 
Zeichengeschwindigkeit ist doch eher beschränkt und viel schlimmer: es 
gibt keine Möglichkeit, das Geschehen mit dem Refresh des Bildschirms zu 
synchronisieren, was zu den bekannten Tearing-Effekten führt.

Das ist OK z.B. für das Menüsystem eines Spiels o.Ä., aber die 
eigentliche Spielfläche schreit nach etwas anderem, und das ist: DirectX 
oder OpenGL. DirectX ist etwas einfacher zu programmieren und meist auch 
schneller, aber wenn's möglicherweise portabel werden soll, dann ist 
OpenGL vorzuziehen.

Und damit ist man dann beim großen Nachteil von .net. Die dauernden 
Wechsel zwischen managed und unmanaged Code bremsen das gegenüber einer 
nativen Implementierung doch ganz erheblich aus. Klar, für einfache 
2D-Spiele reicht das auf heutiger Hardware noch locker aus, aber wenn 
das Endergebnis mal ein Spiel mit wirklich anspruchsvoller 3D-Grafik 
werden soll, dann würde ich an Stelle des TO auch bei C++ bleiben. Ist 
zwar am Anfang erstmal viel mehr Aufwand, aber wenn's dann irgendwann an 
den Kern der Sache geht, deutlich einfacher als der Ansatz aus Richtung 
.net

von Klaus (feelfree)


Lesenswert?

Ob S. schrieb:
> wenn
> das Endergebnis mal ein Spiel mit wirklich anspruchsvoller 3D-Grafik
> werden soll

dann wäre das halt was ganz anderes als

Hans B. schrieb:
> ein Windowsprogramm [..], bei dem sich ein Ball
> in einem Fenster zufällig hin und her bewegt und sich, wenn man ihn
> anklickt, verfärbt

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Klaus schrieb:

> dann wäre das halt was ganz anderes als
>
> Hans B. schrieb:
>> ein Windowsprogramm [..], bei dem sich ein Ball
>> in einem Fenster zufällig hin und her bewegt und sich, wenn man ihn
>> anklickt, verfärbt

Ja, stimmt, die ursprüngliche Zielstellung hatte ich bei meinen 
Betrachtungen etwas aus den Augen verloren.

Ja klar, solch einfache Sachen kann man noch problemlos und 
hinreichender Darstellungsqualität mit dem .net-Framework (und dem 
darunter liegenden Win-API) umsetzen. Also mit Windows.Forms und C# oder 
VB als Sprache.

Um diese LowEnd-Grafik etwas hübscher (vor allem: ganz erheblich 
flackerärmer) zu bekommen kann man dann auch gleich ein eingebautes 
Feature des Framework verwenden, die man ansonsten erst selber hinzu 
programmieren müsste. Nämlich: double buffering. Kostet nur eine Zeile 
Quelltext, das für die Client-Zeichenfläche eines Controls zu 
aktivieren.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Darf ich mal etwas (anderes) empfehlen?

Sieh dir mal die Software von "Processig" an! Das ist eine einfache IDE, 
die Sprache ist halb C++, halb Java und das ganze System ist stark 
grafik-orientiert. Erstaunlich performant! Für den Einstieg in die 
Spiele- und Grafik-Programmierung m.E. sehr gut geeignet.

Das lauffähige Ergebnis ist ein Java-Jar, läuft auf allen PC-Plattformen 
(Win, Mac, Linux). Wahlweise mit oder ohne eingebettetes JRE.

https://processing.org/

Beispiele:

https://processing.org/examples/bouncingball.html
https://processing.org/examples/accelerationwithvectors.html

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Frank E. schrieb:
> Darf ich mal etwas (anderes) empfehlen?

Klar darfst du, ich hatte oben ähnliches schon in der 
Javascript-Variante empfohlen:

Klaus schrieb:
> das hier als Startpunkt: https://p5js.org/examples/games-circle-clicker/

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Klaus schrieb:
> Frank E. schrieb:
>> Darf ich mal etwas (anderes) empfehlen?
>
> Klar darfst du, ich hatte oben ähnliches schon in der
> Javascript-Variante empfohlen:
>
> Klaus schrieb:
>> das hier als Startpunkt: https://p5js.org/examples/games-circle-clicker/

Ahhh ... da schließt sich quasi der Kreis: p5.js ist eng mit Processing 
verbunden, man kann wahlweise nach Java oder Javascript exportieren. :-)

von Tim (timgabinski)


Lesenswert?

Da es sich um eine 2D-Anwendung handelt, würde ich das mit MFC und GDI 
in C** lösen. Das erfordert die geringste Einarbeitungszeit. Mit OpenGL 
geht's schöner, aber falls man das noch nicht kennt, ist die Lernkurve 
zu steil für diesen Anwendungsfall.

von Michael B. (laberkopp)


Lesenswert?

Tim schrieb:
> MFC und GDI

Es gibt fertige Sprite samples.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Leider kann Visual Studio ja keine DOS-Executables erzeugen, sonst 
könnte man z.B. mit VGA Mode 13h die Grafik darstellen 😉

von Harald K. (kirnbichler)


Lesenswert?

Niklas G. schrieb:
> Leider kann Visual Studio ja keine DOS-Executables erzeugen, sonst
> könnte man z.B. mit VGA Mode 13h die Grafik darstellen

Viele PCs haben kein CSM mehr in ihrer UEFI-Firmware. Damit ist DOS tot.

Selbst wenn man einen DOS-Compiler verwenden würde (was dem Einsatz von 
DOSbox o.ä. voraussetzt), wäre der damit gewonnene Blumentopf leer.

von Tim (timgabinski)


Lesenswert?

Michael B. schrieb:
> Tim schrieb:
>> MFC und GDI
>
> Es gibt fertige Sprite samples.

Bitte mal erklären! Ich mache immer double-buffering. Geht's auch 
anders?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Tim schrieb:
> Michael B. schrieb:
>> Tim schrieb:
>>> MFC und GDI
>>
>> Es gibt fertige Sprite samples.
>
> Bitte mal erklären! Ich mache immer double-buffering. Geht's auch
> anders?

Naja, echte Sprites gibt's ja auf PC-Hardware heutzutage gar nicht mehr. 
Bei dem, was Tim da meint, handelt es sich eher um das, was z.B. beim 
Amiga zur Unterscheidung von echten Sprites (die der Amiga auch hatte) 
"Blob" genannt wurde.

Im Prinzip funktionieren diese Dinger ebenfalls mit Double Buffering. 
Der Unterschied zu dem, was heutzutage üblicherweise gemacht wird, ist 
folgender: Heute wird der komplette Background als Bitmap vorgehalten, 
bei diesen Blobs (Pseudo-Sprites) wird der Background hingegen nur für 
die Bereiche vorgehalten, in denen sich diese Dinger aktuell befinden. 
Der Vorteil der Blob-Methode ist schlicht, dass man dafür weniger 
Grafikspeicher benötigt, denn der war damals ziemlich knapp. Der 
Nachteil ist auch klar: Bevor man den Backbuffer für irgendwas verwenden 
kann, muss er erstmal angelegt werden. Man braucht also mehr 
"Rechenzeit" als bei der heute üblichen Methode. Rechenzeit deshalb in 
Anführungsstrichen, weil das Umkopieren der Daten typisch per DMA 
erledigt wird (auch damals beim Amiga schon).

von Hmmm (hmmm)


Lesenswert?

Ob S. schrieb:
> was z.B. beim Amiga zur Unterscheidung von echten Sprites (die der Amiga
> auch hatte) "Blob" genannt wurde.

Bobs, auch wenn es für "Blitter Objects" stand.

Ob S. schrieb:
> Der Vorteil der Blob-Methode ist schlicht, dass man dafür weniger
> Grafikspeicher benötigt, denn der war damals ziemlich knapp.

Grafikspeicher war nicht so das Thema, auf dem Atari ST waren das z.B. 
gerade mal 32.000 Bytes, die konnte man sich bei 1MB RAM auch 2x gönnen. 
Der Hauptvorteil eines Blitters war die Geschwindigkeit.

Ein Grafikobjekt in den Bildschirmspeicher zu bekommen, kostet 
(insbesondere bei "krummen" Koordinaten) CPU-Zeit, und dem Blitter 
musste man nur mitteilen, wie er mit Objekt, Maske und Ziel umgehen 
sollte.

Noch schöner waren natürlich Hardware-Sprites wie auf dem C64, aber die 
kamen dann wieder mit anderen Haken (insbesondere limitierte Zahl).

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hmmm schrieb:

> Grafikspeicher war nicht so das Thema, auf dem Atari ST waren das z.B.
> gerade mal 32.000 Bytes, die konnte man sich bei 1MB RAM auch 2x gönnen.

Der AtariST war ja im Bezug auf die Grafikfähigkeiten im Vergleich zum 
Amiga auch eher so lala...

> Der Hauptvorteil eines Blitters war die Geschwindigkeit.

Ja klar. Weil halt nicht die CPU rechnen musste, sondern der Blitter 
sowohl den Transport der Daten per DMA als auch die nötigen logischen 
Verknüpfungen erledigen konnte. Das konnte er allerdings nur leisten, 
wenn alle Quellen (bis zu drei) und das Ziel komplett in einem 
Speicherbereich lagen, der überhaupt per DMA erreichbar war. Beim Amiga 
war das auschließlich der sog. "Chip-RAM". Wieviel Chip-RAM möglich war, 
hing davon ab, welche Version des AGNUS-Chip auf dem Board war. Wieviel 
Chip-RAM tatsächlich installiert war, hing davon ab, wie tief der 
Besitzer in's Portemonnaie greifen konnte...

> Ein Grafikobjekt in den Bildschirmspeicher zu bekommen, kostet
> (insbesondere bei "krummen" Koordinaten) CPU-Zeit

Das war damals so (unabhängig vom Speicher-Layout) und ist heute auf dem 
PC im Prinzip noch ganz genau so.

> Noch schöner waren natürlich Hardware-Sprites wie auf dem C64

Wie schon erwähnt: der Amiga hatte auch echte Hardware-Sprites.

> aber die
> kamen dann wieder mit anderen Haken (insbesondere limitierte Zahl).

Das war auch beim Amiga so: eingeschränkte Zahl, eingeschränkte Größe 
und eingeschränkte Farbauflösung. Allerdings konnte man die Dinger auf 
dem Amiga zeilenweise recyclen und damit die Einschränkungen teilweise 
aufheben. Allerdings war dann wieder die CPU gefordert, um das möglich 
zu machen, was dem Sinn der Hardware-Sprites doch leicht zuwieder lief. 
Nichtsdestotrotz wurde das recht oft gemacht. Praktische jede 
Partikelwolke  einer Explosion wurde auf diese Art umgesetzt.

von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

Ich programmiere meine Windows Anwendungen normalerweise auch in C++ mit 
ATL/WTL. Aber für so eine Spielerei würde ich doch HTML/CSS/JScript 
nehmen. Versuche das mal in C++ mit ca. 60 Codezeilen hin zu bekommen 
;-)

Das Beispiel habe in nach 2 min Suche gefunden und dir zu einem File 
zusammenkopiert. https://codepen.io/Kit_Nickson/pen/bGEKxvB
Du kannst VS2022, aber auch jeden x-beliebigen Editor verwenden.
Debugger ist dein Browser.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hans-Georg L. schrieb:

> Das Beispiel habe in nach 2 min Suche gefunden und dir zu einem File
> zusammenkopiert. https://codepen.io/Kit_Nickson/pen/bGEKxvB

Also DAS kann man in VB oder C# sogar in wesentlich weniger als 60 
(selbst zu schreibenden) Zeilen realisieren.

von Falk S. (falk_s831)


Lesenswert?

Die Anforderungen für das Ballspiel kann man theoretisch ab Qt5 direkt 
mit Qml bauen, komplett ohne C++, nur per qml_scene mit allen möglichen 
Effekten.

Für C++ sollte das aber mit Qt normalerweise auch bloß ne Fingerübung 
sein.

Aber wenn darum geht, mal nen Dialog mitm Studio zusammenzuklickern, das 
Paint-Event zu überschreiben - Hardcore per GDI oder per DirectX/SDL - 
alle Möglichkeiten sind gegeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.