Graphiken verändern und verschieben



  • Hallo Forum,
    ich möchte ein Feuerwerk entwickeln und habe folgende Frage: Wie kann ich mit C++ und Win32API am Besten Graphiken ändern (farblich) und verschieben?
    lg heinz



  • "Am Besten" hängt von deiner Metrik ab. Also anders gesagt: am Besten für was?

    Davon abgesehen: was meinst du mit "Graphiken ändern (farblich) und verschieben"? Meinst du du willst ein Bild laden, dann dessen Farben ändern, Bildbereiche innerhalb des Bildes verschieben und dann das Ergebnis anzeigen?

    Oder willst du nur die Farben ändern und dann das Bild an verschiebenen Positionen innerhalb deines Fensters anzeigen?


    Falls du mit "am Besten" meinst: es soll einfach sein und nicht zu langsam... in dem Fall kannst du dir mal die Windows GDI Funktionen ansehen, z.B. BitBlt: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-bitblt
    Falls du das Bild auch in der Grösse verändern möchtest kannst du z.B. StretchBlt oder StretchDIBits verwenden.
    Was das Ändern der Farben angeht gibt es auch mehrere Varianten, z.B.:

    1. Du verwendest ein Bild mit "Palette" und änderst eben diese Palette bevor du das Bild anzeigst.
    2. Du verwendest ein True-Color Bild und änderst direkt die Pixeldaten.

    Also... ich würde sagen: fang damit an erstmal genauer (detailierter & konkreter) zu beschreiben was du eigentlich machen/erreichen willst.



  • Dieser Beitrag wurde gelöscht!


  • @hustbaer
    "Am Besten" ist wohl etwas unglücklich, "wie allgemein üblich" triffts wohl besser.
    Ja, ich meine kleine Bildpunkte - oder auch Sterne - die ihre Größe und Farbe ändern und sich strahlenförmig ausdehnen. Ich habe bisher an Bitmaps und dessen Funktionen gedacht (wobei ich keine Schiebefunktion gefunden habe) aber vielleicht gibt es noch andere Möglichkeiten.
    lg heinz



  • Möchtest du denn unbedingt mit der rohen WinAPI arbeiten? Nimm doch ein GUI-Framework (Qt, wxWidgets, ...) oder eben auch SFML.

    Die WinAPI-Funktionen zum Zeichnen findest du unter Windows GDI (selbst wenn du sie nicht direkt benutzt, sind sie eine gute Doku).

    Für die Ausgabe in einem Fenster benötigst du dann noch zusätzlich einen Timer, so daß du in jedem Timer-Step die Grafikdaten (Position, Größe, Farbe, etc.) veränderst und neu zeichnen läßt (Refresh/Update).



  • @znieh99
    Welche Ansprüche stellst du denn an das Feuerwerk und was ist der Zweck?
    Ich glaube, dass die WinAPI nur eingeschränkt dazu fähig ist, was Vernünftiges auf den Bildschirm zu bringen, dazu braucht man schon ein Multimedia Framework wie DirectX oder OpenGL.
    Oder du benutzt fertige (möglicherweise kostenpflichtige) Tools, mit denen man sein eigenes Feuerwerk erzeugen kann, dabei wird dann wohl sowas wie ein animiertes GIF oder ein Videoclip herauskommen. Auf die Schnelle habe ich das hier gefunden: Create your own fireworks.
    Wenn aber der Weg das Ziel ist und du dir ein Feuerwerk als Projekt vorgenommen hast, dann ist die WinAPI vielleicht kein schlechter Einstieg.



  • @DocShoe
    Ja, ich möchte WinAPI gut kennenlernen.
    lg heinz



  • @DocShoe sagte in Graphiken verändern und verschieben:

    Ich glaube, dass die WinAPI nur eingeschränkt dazu fähig ist, was Vernünftiges auf den Bildschirm zu bringen, dazu braucht man schon ein Multimedia Framework wie DirectX oder OpenGL.

    Verwendet WinAPI nicht auch DirectX?



  • @znieh99
    AFAIK benutzen einige Grafikfunktionen des GDI+ intern DirectX, aber ich würde nicht soweit gehen und sagen, dass die WinAPI auf DirectX aufbaut.

    Ja, ich möchte WinAPI gut kennenlernen.

    Erklär´uns doch bitte, was genau du erreichen möchtest. Nur mit der WinAPI kann man auch heute zwar noch Anwendungen programmieren, aber das ist doch sehr umständlich. Wenn wir wüssten, was du erreichen möchtest, könnte man ggf. Alternativen anbieten.



  • GDI+ ist soweit ich weiss rein Software-Rendering.
    Die WinAPI intern verwendet soweit ich weiss auch nicht DirectX sondern plaudert direkt mit dem Grafikkarten-Treiber. DirectX ist dann eine weitere API (bzw. eine Sammlung von APIs) mit denen man Funktionen des Grafikkarten-Treibers nutzen kann.

    @znieh99

    "Am Besten" ist wohl etwas unglücklich, "wie allgemein üblich" triffts wohl besser.

    "Allgemein üblich" ist auch davon abhängig was man genau machen möchte, und oft gibt es kein "allgemein üblich".

    Wenn du einzelne Pixel in ein Fenster malen willst, dann würde ich dir mal die Funktion SetPixel empfehlen: https://docs.microsoft.com/ru-ru/windows/win32/api/wingdi/nf-wingdi-setpixel
    Viel einfacher als das geht's nicht.

    Dann kannst du dich in Themen wie DCs und Bitmaps (DDBs und DIBs) einlesen. Und/oder in GDI+.



  • @DocShoe sagte in Graphiken verändern und verschieben:

    Ich glaube, dass die WinAPI nur eingeschränkt dazu fähig ist, was Vernünftiges auf den Bildschirm zu bringen, dazu braucht man schon ein Multimedia Framework wie DirectX oder OpenGL.

    Definiere vernünftig.



  • @hustbaer sagte in Graphiken verändern und verschieben:

    @DocShoe sagte in Graphiken verändern und verschieben:

    Ich glaube, dass die WinAPI nur eingeschränkt dazu fähig ist, was Vernünftiges auf den Bildschirm zu bringen, dazu braucht man schon ein Multimedia Framework wie DirectX oder OpenGL.

    Definiere vernünftig.

    Das fängt doch schon damit an, dass man mit der WinAPI keine guten Timer hat, die man für eine flüssige Darstellung von Animationen braucht. Gut, vielleicht ist das mit einem CreateTimerQueueTimer möglich, meine Erfahrungen liegen da schon einige Zeit zurück. Damals wollte ich eine Laufschrift am unteren Fensterrand anzeigen, und das war mit einem CreateTimer - Timer eher holprig. Vielleicht ist das beim Zeichnen weniger störend.



  • @Th69 sagte in Graphiken verändern und verschieben:

    Möchtest du denn unbedingt mit der rohen WinAPI arbeiten? Nimm doch ein GUI-Framework (Qt, wxWidgets, ...) oder eben auch SFML.

    Ich dachte mir, dass die WinAPI die Basis für alle GUI-Frameworks ist.
    lg heinz



  • Ist sie ja auch oftmals, aber damit direkt ein Projekt machen ist sehr mühsam - schau dir nur den Standard-Code des WinAPI-Vorlagen-Projekts an: Exemplarische Vorgehensweise: Erstellen einer herkömmlichen Windows Desktopanwendung (C++) (unter "Erstellen des Codes"). Und diesen Boilerplate-Code nehmen die (anderen) GUI-Framework einem ab und als Entwickler kann man sich auf die Logik des eigentlichen Programms konzentrieren (und muß z.B. nicht direkt die Windows-Messages abfangen und auch nicht direkt mit den [komplexen] Windows-Strukturen arbeiten).



  • @DocShoe sagte in Graphiken verändern und verschieben:

    @hustbaer sagte in Graphiken verändern und verschieben:

    @DocShoe sagte in Graphiken verändern und verschieben:

    Ich glaube, dass die WinAPI nur eingeschränkt dazu fähig ist, was Vernünftiges auf den Bildschirm zu bringen, dazu braucht man schon ein Multimedia Framework wie DirectX oder OpenGL.

    Definiere vernünftig.

    Das fängt doch schon damit an, dass man mit der WinAPI keine guten Timer hat, die man für eine flüssige Darstellung von Animationen braucht.

    Weiss nicht genau was du mit Timer meinst, DirectX hat doch gleich gar keine Timer...? Was mit DX allerdings geht ist Present() mit VSync. Da ist es tatsächlich etwas doof dass es da ausserhalb von DirectX nix vernünftiges gibt. (Also es gibt DwmFlush, aber das setzt halt nen aktiven DWM voraus.)



  • @znieh99 sagte in Graphiken verändern und verschieben:

    @Th69 sagte in Graphiken verändern und verschieben:

    Möchtest du denn unbedingt mit der rohen WinAPI arbeiten? Nimm doch ein GUI-Framework (Qt, wxWidgets, ...) oder eben auch SFML.

    Ich dachte mir, dass die WinAPI die Basis für alle GUI-Frameworks ist.
    lg heinz

    Kommt jetzt drauf an was du mit WinAPI meinst und von was für GUI Frameworks wir reden. Wenn mit WinAPI die "klassische" WinAPI gemeint ist (KERNEL32, USER32, GDI, GDI+), und bei GUI Frameworks auch etwas modernere wie WPF & Co gemeint sind, dann ist die Antwort: nö. Denn einige moderne GUI Frameworks verwenden Direct3D bzw. OpenGL um ihr Zeuchs anzuzeigen.


  • Mod

    Du wirst kein besserer Autofahrer, wenn du vor der ersten Fahrstunde lernst, wie man einen Motor konstruiert.

    Du wirst kein besserer Musiker, wenn du damit beginnst, selber ein Instrument zu schnitzen.

    Du wirst kein besserer Programmierer, wenn du zuerst mit Assembler beginnst.

    Du wirst keine besserer GUI-Frameworknutzer, wenn du zuerst mit WinAPI beginnst.

    Es ist wahr, dem Profi mag es später nutzen, wenn er das letzte aus seinem Auto/Instrument/Programm/GUI rausholen will, wenn er die darunter liegenden Vorgänge versteht. Aber für den absolut überwiegenden Teil aller Anwendungsfälle, und ganz besonders für alle Anfänger gilt: Lerne direkt das, was du lernen möchtest!

    PS: Und eine zweite Sache: Du hast ein XY-Problem, bei deiner Frage danach, wie man Grafiken skaliert, obwohl dein eigentliches Problem ist, wie man ein Feuerwerk macht. Ein XY-Problem hat man oft. Es ist eine nützliche Fähigkeit, das selber erkennen zu können, damit man sich nicht zu sehr auf Problemlösungen versteift, die nicht zum Erfolg führen. Daher empfehle ich dir, selbst zu reflektieren, warum dir das hier passiert ist, und wie du das in Zukunft vermeiden kannst.
    Das gilt wohl auch bei deinem Vorhaben allgemein, wie man mit der WinAPI umgeht, wenn es dir anscheinend doch in Wahrheit darum geht, andere Frameworks besser zu verstehen.



  • @SeppJ
    Nun, ich weiß logisch schon wie man ein Feuerwerk entwickelt (habe es in Java programmiert), aber mir fehlt in C++ das Wissen über die Werkzeugkiste. Ich glaube das ist mein Problem.


  • Mod

    @znieh99 sagte in Graphiken verändern und verschieben:

    @SeppJ
    Nun, ich weiß logisch schon wie man ein Feuerwerk entwickelt (habe es in Java programmiert), aber mir fehlt in C++ das Wissen über die Werkzeugkiste. Ich glaube das ist mein Problem.

    Grafiken skaliert anzuzeigen klingt aber nicht wirklich nach der besten oder üblichen Methode, das zu machen.



  • @Th69 sagte in Graphiken verändern und verschieben:

    Und diesen Boilerplate-Code nehmen die (anderen) GUI-Framework einem ab

    Ok, von welchen GUI-Frameworks sprichst du?



  • Wie oben schon geschrieben, z.B. Qt oder wxWidgets, s.a. [HOWTO] Welches Toolkit für GUIS?

    Wenn du bisher noch nie mit externen Libs gearbeitet hast, dann ist das natürlich eine zusätzliche Herausforderung (Installation, Projekteinstellungen, Doku lesen, ...).

    Ich nehme an, du benutzt Visual Studio (Community Edition) als IDE?!
    Dann könntest du auch MFC (ein "Wrapper" der WinAPI) benutzen (empfehle ich zwar sonst nicht, aber ist direkt im VS nutzbar) - gibt auch ein Subforum dazu hier: MFC.

    Edit: Die Doku dazu gibt es unter MFC-Desktopanwendungen sowie als Projekt-Einstieg Erstellen einer MFC-Anwendung.
    Die Doku zu den anderen GUI-Frameworks gibt es auf den zugehörigen Webseiten.


Anmelden zum Antworten