
Artículos Q145726 y Q176634
Textos con fondo transparente
Imprimiendo en Windows 95 o 98 la propiedad FontTransparent del objeto Printer no funciona. Esta propiedad determina cuándo el texto de fondo y los gráficos se verán entre los caracteres. El valor por defecto para Visual Basic es true, es decir, que el fondo se verá en los espacios entre caracteres. En Windows 95 y 98 el texto se imprimirá como si la propiedad estuviera a false, aunque esté a true. Además, después del método NewPage, todo el texto de la nueva página se imprimirá como si la propiedad estuviera a false, incluso si la página anterior se hubiera impreso correctamente.
Para solucionar este problema hay que llamar a la función SetBKMode cada vez que modifiquemos la propiedad FontTransparent :
Private Declare Function SetBkMode Lib "gdi32" _
(ByVal hdc As Long, ByVal nBkMode As Long) As Long
Private iBKMode as Long
Private Const TRANSPARENT = 1
Private Const OPAQUE = 2
Printer.Print ""
Printer.Line (0,0)-(10000, 2000), &HC0C0C0, BF
Printer.CurrentX = 0
Printer.CurrentY = 0
Printer.FontTransparent = True
'Poner el "background mix mode" a transparente
iBKMode = SetBKMode(Printer.Hdc, TRANSPARENT)
Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent
Printer.FontTransparent = False
'Poner el "background mix mode" a opaco
iBKMode = SetBKMode(Printer.Hdc, OPAQUE)
Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent
Printer.EndDoc
También se pone el "background mix mode" a Opaco al cambiar la orientación (propiedad Orientation) o al invocar el método Line por lo que debemos emplear el SetBKMode para ponerlo transparente.
Podremos ver el estado del "background mix mode" mediante el API :
Private Declare Function GetBkMode Lib "gdi32" _
(ByVal hDC As Long) As Integer
Círculos y cuadrados transparentes
Cuando usamos los métodos Circle o Line para dibujar círculos y cuadrados no serán transparentes aunque establezcamos la propiedad FillStyle a 1 (Transparente).
Para resolver este problema debemos modificar la propiedad FillStyle del objeto Printer antes de emplear los métodos Circle o Line para imprimir objetos transparentes :
Printer.FillStyle = 2
Printer.Print ""
Printer.FillStyle = 1

