Ein Simples Fenster mit eigener GUI erstellen - Bitte helft mir!



  • Hallo Leute

    Kurz zu mir, ich programmiere seit knappe zwei Wochen mit der WinAPI & C++(Mit C++ schon länger).
    Ich möchte jetzt sehr gerne ein eigenes Fenster(eigene GUI) erstellen. Habe im Netzt von Layered Windows und so gelesen
    und bin jetzt ehrlich gesagt leicht verwirrt. Ich weiss nicht, wie ich zu meinem gewünschten Ergebnis komme.

    Ich möchte ein Bild(kein JPEG sondern PNG, also mit Alpha) sozusagen als Fenster erstellen und dazu noch ein "ownerdrawn"-Button, der als Schließ-Button dienen soll.

    Wäre echt cool, wenn mir weitergeholfen wird, danke!



  • Fenster mit WS_POPUP erstellen und in der WndProc dann WM_PAINT abfangen und alles so bearbeiten, wie du es gerne möchtest (in deinem Fall wohl erstmal hauptsächlich das Hintergrundbild setzen). Den Button musst du dann mit BS_OWNERDRAW erstellen, da gibt es auch jede Menge Tutorials für.

    Layered Windows ist hier einem PNG mit Alpha vorzuziehen (meine Sicht), weil es unnötige Arbeit abnimmt. Dazu musst du eigentlich nur SetLayeredWindowAttributes () mit deinen gewünschten Einstellungen aufrufen (deine Fenster braucht dann noch den WS_EX_LAYERED Style).



  • @Fake oder Echt

    Danke schon mal für deine Antwort, werde ich noch testen.

    Layered Windows ist hier einem PNG mit Alpha vorzuziehen (meine Sicht), weil es unnötige Arbeit abnimmt.

    Ich möchte aber ein Fenster erstellen, dessen Bild gerundete Ecken hat(also Transparenz). Was meinst du genau damit?



  • Ich würde dir GDI+ empfehlen. Damit kannst du auch ganz leicht PNGs und viele ander Formate darstellen.



  • Wenn du sowieso schon dein Fenster quasi selbst baust, dann kannst du auch gleich auf Regions zurückgreifen. Siehe dazu CreateRoundRectRgn etc. Es gibt zu diesem Thema einige Tutorials im Netz. Und besonders wenn du nur die Ecken transparent haben möchtest, brauchst du weder PNG mit Alpha, noch Layered Windows.

    Grob gesagt:
    Fenster mit WS_POPUP erstellen, WM_PAINT abfangen, darin mithilfe der Regions die gewünschten abgerundeten Ecken erstellen und zu guter letzt das Bild in deinen DC blitten.

    Bemühe Google und versuche dich daran, wenn du dabei (Verständnis-)Probleme bekommst, dann frag ruhig weiter nach. 🙂

    hi schrieb:

    Ich würde dir GDI+ empfehlen. Damit kannst du auch ganz leicht PNGs und viele ander Formate darstellen.

    Für seine Zwecke wohl über das Ziel hinaus, für PNGs etc. aber an sich gut geeignet.

    EDIT: Du bist ein gutes Beispiel für falsche Beratung. Deine Ziele sind für mich eher verschwommen und an denen versuche ich dann dir die besten Tipps für dein Problem zu geben. Wichtig wäre, was genau dein/e Ziel/e ist/sind, dann kann dir hier auch gezielter geholfen werden (sowohl Layered Windows, als auch PNGs mit Alpha-Channel scheinen aus meiner Sicht für dein Problem zu überzogen, also quasi das Berühmte mit Kanonen auf Spatzen schießen).



  • Ich würde dir GDI+ empfehlen. Damit kannst du auch ganz leicht PNGs und viele ander Formate darstellen.

    Das mit GDI+ und PNGs an sich stellt ja kein Problem da. Ich komme nur irgend wie nicht darauf, wie ich damit ein eigenes Fenster mache.

    Wenn du sowieso schon dein Fenster quasi selbst baust, dann kannst du auch gleich auf Regions zurückgreifen.

    Ich habe es mal mit Regions(Tutorial im Netz) versucht. Hat auch geklappt, jedoch gibt es dort kein "Antialiasing", wenn du verstehst, was ich meine.

    Und besonders wenn du nur die Ecken transparent haben möchtest, brauchst du weder PNG mit Alpha, noch Layered Windows.

    Es geht nicht nur um Ecken. Einen Kreis z.b würde ich mit Regions ja nicht perfekt Glatt(Ränder) bekommen. Von daher dachte ich,
    PNGs mit Alpha wäre die einfachste Methode.

    Wichtig wäre, was genau dein/e Ziel/e ist/sind

    Im Grunde habe ich fürs erste ein "einfaches" Ziel.
    Das Folgende Bild habe ich zum Veranschaulichen erstellt.

    http://www.directupload.net/file/d/3530/k6a2oahu_png.htm

    Der Kleine Teil oben rechts soll der Schließ-Button werden. Ich weiss nicht, aber ich denke nicht, das Regions hier die beste Wahl sind.
    Wie schon erwähnt, habe ich dieses Bild nur erstellt, damit ihr wisst, was ich meine.

    Vielen dank bis jetzt für euren Antworten. Hoffe auf weitere 🙂



  • Du tust deinen Nutzern keinen Gefallen damit, dass sie pixelgenau deinen kleinen Button treffen müssen. Nimm eine Region. Dass das Klicken auf die Ecke als Klicken zählt ist kein Bug, sondern ein Feature 🤡



  • Du tust deinen Nutzern keinen Gefallen damit, dass sie pixelgenau deinen kleinen Button treffen müssen. Nimm eine Region.

    Sorry, das ich jetzt so frage, aber hab ich was verpasst? Ich habe dieses Bild
    doch nur zu Demonstrationszwecken erstellt.

    Dass das Klicken auf die Ecke als Klicken zählt ist kein Bug, sondern ein Feature

    Was meinst du jetzt damit? Ich habe doch nichts gesagt?



  • @nwp3
    Vielleicht habe ich mich auch schlecht ausgedrückt. Nicht der kleine rote Punkt soll den Butten darstellen, sondern das ganze in der Ecke oben.



  • Just me schrieb:

    Ich komme nur irgend wie nicht darauf, wie ich damit ein eigenes Fenster mache.

    Am besten alles selbst auf das layered window zeichnen; Rahmen, Sysbuttons, Controls etc. inkl. Logik. GDI+ bietet die nötigen Zeichenoperationen.



  • AntiAliasing ist alles andere als einfach. Richte dann die Umsetzung nach deinem Bedarf. Ich persönlich halte relativ wenig von zu vielen Schatten und anderem BlingBling, bevorzuge also klare Linien. Sieht bei richtiger Umsetzung IMO besser aus und ist insgesamt auch einfacher umzusetzen. Dementsprechend wäre erstmal bei Bedarf von abgerundeten Ecken eben Regions das Richtige. Dein Beispiel verlange Gdi+ mit AntiAliasing. Jetzt musst du nur noch für dich eine Entscheidung treffen, kombinieren ließen siche beide Varianten ja auch.



  • Und mit GDI+ gibt es auch Antialiasing.


Log in to reply