Screen Flash

  • Hi,

    ich habe ein normales Fenster, in das ich mit GDI+ zeichne.

    Jetzt möchte ich einen "screen flash" machen. Damit meine ich eine Art fade-out Effekt, der sehr schnell vorüber ist. Ich weiß nicht wie ich es besser erklären kann... man könnte es vielleicht vergleichen mit dem Blitz, der kommt, wenn man ein Foto macht.

    Ich habe z. B. die Farbe grün (#00ff00) mit anfänglich keiner Transparenz (ff00ff00). Die Farbe blende ich dann ein und ändere dann schrittweise ganz schnell die Transparenz so, dass diese immer größer wird bis schlussendlich volle Transparenz ist (0000ff00).

    Leider weiß ich nicht wie ich das machen könnte. Meine Idee wäre einen Brush der Farbe zu erstellen und dann in einer Schleife die Transparenz schrittweise zu ändern, aber ich weiß wie gesagt nicht wie ich anfangen soll...

    Ich hoffe mir kann jemand helfen.

    Einmal editiert, zuletzt von pete_gzome (12. März 2012 um 10:41)

  • Zeichneimmer wieder ein Rechteck über das gesamte Fenster. Den Brush für dieses Rechteck kannst du Scritt für Schritt so anpassen:

    [autoit]

    _GDIPlus_BrushSetSolidColor($hBrush, BitShift($iTrans, -32) + 0x00FF00 ;Ungetestet, ich weiß nicht ob AutoIt mit so großen Integern umgeht wie ich es mir vorstelle...)

    [/autoit]


    $iTrans darf nur Integerwerte von 0 (Transparent) bis 255 (nicht Transparent) annehmen. Die zweite Hexadezimalzahl stellt die Farbe dar die dein Rechteck nachher haben soll im Format RRGGBB.
    Am Anfang sollte der Brush mit $iTrans = 255 erstellt werden, danach kannst du bis auf 0 herunterzählen (nicht unter 0, danach muss abgebrichen werden!). Wenn du willst, kannst du auch die Sinusfunktion verwenden, um einen "weicheren" Übergang zu erzeugen, nur musst du dann mit Round oder Int die Zahl auf den einen ganzzahligen Wert runden.

  • ICH würde es so machen:

    Spoiler anzeigen
    [autoit]

    For $i = 4294967295 To 16777215 Step -16777216
    _GDIPlus_BrushSetSolidColor($hBrush, BitAND(0xFF00FF00, $i))
    ; Hier Zeichnest du das Rechteck
    Sleep(1)
    Next

    [/autoit]


    Falls dich die Zahlen verwirren, eigentlich sollte es so sein:
    For $i = 0xFFFFFFFF To 0x00FFFFFF Step -0x01000000
    Leider akzeptiert AutoIt aber heine Hex-Zahlen in For-Schleifen, wie ich gerade feststellen musste. Wenns dir zu langsam ist nimmst du für den Step einfach die Dezimalen Werte von 0x02000000 oder 0x03000000.

    Gruss Shadowigor

  • Danke für die Antworten!

    Ich habe heute leider keine Zeit mehr es auszuprobieren, werde es aber morgen tun und mich hier dann noch einmal melden.

  • Ich habe es jetzt so gemacht:

    [autoit]

    For $i = 4294967295 To 16777215 Step -117440512
    ;...
    _GDIPlus_BrushSetSolidColor($brushScreenFlash, BitAND($screenFlashColor, $i))
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, $iWidth, $iHeight, $brushScreenFlash)
    ;...
    Sleep(1)
    Next

    [/autoit]

    Funktioniert perfekt.

    Vielen Dank!