[Win32/C++/GDI] Alpha of fading effect met GDI (niet plus)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • vincentgr
  • Registratie: Mei 2007
  • Laatst online: 05-01-2021
Hallo,

(Ten eerste: ik ben nog maar kort bezig met Windows programmeren, al wat langer met C++ programmeren, maar ik ben er dus nog niet echt goed in.)
Ik ben bezig met een programmaatje die een tabelletje, getekend met simpele lijnen met LineTo, over het scherm kan laten bewegen. Aan de zijkanten wil ik het dan graag een soort uit laten faden, daarmee bedoel ik iets vergelijkbaars als dat je met een tekenprogramma een selectie maakt van de rand en daar een gradient van wit (de achtergrondkleur van het programma) 100% zichtbaar naar wit 0% zichtbaar, aan de linkerrand is dat dus links 100% zichtbaar en rechts 0% zichtbaar.
Ik ben nog niet begonnen met het bewegende gedeelte, en bij het doorzichtigheidsgedeelte loop ik eigenlijk al vast.
Ik weet namelijk dat het niet slim is om GetPixel en SetPixel te gebruiken voor het tekenen op het scherm, maar ik weet geen andere mogelijkheid. Het probleem is met deze twee functies dat ik ze, bij een tabel van 100 pixels hoog en een fading van 20 pixels lang (voorbeeldgetallen) 100*20 keer moet aanroepen. En dan ook nog eens de nieuwe kleurwaarde ervoor moet berekenen, voor elke pixel 3 kleuren (ik heb hiervoor gewoone en simpele formule gebruikt die x% van de waarde van kleur A neemt en 100-x% van de kleurwaarde van kleur B ). Als de boel dan ook nog eens gaat bewegen, zal het toch iets van 10x per seconde moeten verversen voor een beetje een niet-trillerig beeld, en dat loopt dus heel erg op. Ik heb al wat geprobeerd en het werkt inderdaad niet optimaal snel.
Nu weet ik dat er al een poos ook GDI+ bestaat, maar ik lees nog steeds Petzold's Programming Windows, en daarin wordt dat niet behandeld. Ik wil GDI+ ook best een keer leren, maar liever als ik verder ben.
Dus nu was mijn vraag: is er een snellere manier (via de GPU en GDI, dus) om bijvoorbeeld voor een rechthoek de kleuren in een bepaald percentage doorzichtigheid te mengen?
Als dat niet kan, kan iemand me dan in de juiste richting sturen met GDI+?
Heel erg bedankt,

Vincent

Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Ik vond een voorbeeld op MSDN: http://msdn.microsoft.com.../dd183353%28VS.85%29.aspx

Dit is al wel vrij geavanceerd, probeer eerst de functies BitBlt en CreateDIBSection te begrijpen. Naast GDI+ kan je je ook in OpenGL gaan verdiepen, dat is naast 3D ook heel geschikt op 2D applicaties te maken.

succes!

[ Voor 20% gewijzigd door epic007 op 15-10-2009 19:02 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gewoon de gradient in een bitmap zetten en dat StretchBlt()'en. Nog hardware accelerated ook.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • vincentgr
  • Registratie: Mei 2007
  • Laatst online: 05-01-2021
@epic007: ik ga morgen naar dit voorbeeld kijken, bedankt! het ziet er inderdaad vrij lastig uit, maar ik denk dat ik me er wel doorheen weet te slaan. Als het is gelukt zal ik het hier melden!
@.oisyn: Volgens mij kan dit niet, want je kan met GDI dus alleen een R een G en een B channel gebruiken (en geen A channel), en als het dan transparant moet zijn wordt het toch helemaal transparant, met NULL_BRUSH, dus. Ik zoek dus eigenlijk naar semi-transparantie, zoals dat volgens mij wordt genoemd. Of zijn er andere manieren om een gedeeltelijk doorzichtige gradient in een bitmap te laten tekenen?

Ik ga dus in ieder geval dat voorbeeld proberen. Allebei heel erg bedankt alvast, en ik laat van me horen.
Vincent

Acties:
  • 0 Henk 'm!

  • vincentgr
  • Registratie: Mei 2007
  • Laatst online: 05-01-2021
Ik ben er met het voorbeeld op msdn uitgekomen, heel erg bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

vincentgr schreef op donderdag 15 oktober 2009 @ 22:21:
@.oisyn: Volgens mij kan dit niet, want je kan met GDI dus alleen een R een G en een B channel gebruiken (en geen A channel)
Bitmaps kunnen weldegelijk een alpha channel hebben. Overigens begreep ik je probleem ietwat verkeerd (ik dacht dat je alleen een gradient wilde, en geen alpha blending) en moet je AlphaBlend() gebruiken, dat is een StretchBlt() met alpha blending :)

[ Voor 11% gewijzigd door .oisyn op 18-10-2009 19:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1