Wenn Sie Text ohne Hintergrundfüllung zeichnen möchten, SetBkMode(hdc,TRANSPARENT)
sagt GDI, den Hintergrund beim Zeichnen von Text zu verlassen.
Um die Vordergrundfarbe des Textes mit Alpha zu rendern, wird es komplizierter. GDI unterstützt die Alpha-Kanäle nicht wirklich umfassend in seinen APIs. Außerhalb von AlphaBlend ist eigentlich nur der Kanal erhalten. Es ist eigentlich nicht gültig, die oberen Bits eines COLLEF auf Alpha-Werte zu setzen, da das High-Byte tatsächlich für Flags verwendet wird, um anzuzeigen, ob der COLLEF ein Paletteneintrag ist (und nicht ein RGB-Wert).
Ihr unglücklicher Weg ist also:
* Es kann ausreichen, den DIBSection einfach mit einem 50% Alpha zu memsen, bevor Sie den DrawText ausführen, und sicherstellen, dass der BKColor schwarz ist. Ich weiß nicht, was DrawText mit dem Alpha-Kanal machen könnte. Einige Experimente sind erforderlich.
Einfache und einfache Lösung:)
Hatte dieses Problem, ich versuchte, Alpha-Werte und Premultiply zu ändern, aber es gab ein anderes Problem - Antialiased und Cleartype Schriftarten, die nicht korrekt angezeigt wurden (hässliche Kanten). Also was ich getan habe ...
Ich denke du hast es verstanden:)
Hmmmm - ich versuche, das gleiche hier zu tun - wundernd - Ich sehe, dass Sie beim Erstellen eines dib-Abschnitts die "Masken" angeben, die eine R-, G-, B- (und Alpha) -Maske sind.
IF und das ist ein großes, wenn es wirklich nicht den Alpha chhannel ändert, dann könnten Sie die Maske für zwei Bitmap-Header anders angeben. ONe spezifiziert RGB an den richtigen Stellen, der andere macht alle Bits dem Alphakanal zugewiesen. (Setzen Sie in diesem Fall die Textfarbe auf Weiß.) Rendern Sie dann in zwei Durchgängen, einen zum Laden der Farbwerte, den anderen zum Laden der Alpha-Werte.
???? sowieso nur grübeln:)
Während es bei dieser Frage darum geht, Text halbtransparent zu machen, hatte ich das umgekehrte Problem.
DrawText war , wodurch der Text in meinem Layer-Fenster (UpdateLayeredWindow) halbtransparent wurde ... und ich wollte es nicht haben.
Sehen Sie sich diese andere Frage an, da ich in der anderen Frage posten muss etwas Code, den Sie leicht ändern könnten ... und ist fast genau das, was Chris Becke in seiner Antwort vorschlägt.
Eine begrenzte Antwort für eine bestimmte Situation:
Wenn Sie eine Grafik mit Alpha-Kanal haben und über einen lokal undurchsichtigen Hintergrund undurchsichtigen Text zeichnen möchten, bereiten Sie zuerst Ihre 32-Bit-Bitmap mit 32-Bit-Pinseln vor, die mit CreateDIBPatternBrushPt
erstellt wurden. Durchsuchen Sie dann die Bitmap-Bits, die den Alpha-Kanal invertieren, zeichnen Sie Ihren Text wie gewohnt (einschließlich SetBkMode
bis TRANSPARENT
) und invertieren Sie dann das Alpha in der Bitmap erneut. Sie können die erste Inversion überspringen, wenn Sie das Alpha Ihrer Pinsel invertieren.