Microsoft KB Archive/145726

= BUG: Setting FontTransparent Has No Effect on Windows 95/98/Me =

Article ID: 145726

Article Last Modified on 5/7/2003

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Control Creation Edition
 * Microsoft Visual Basic 5.0 Learning Edition
 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition
 * Microsoft Visual Basic 4.0 Standard Edition
 * Microsoft Visual Basic 4.0 Professional Edition
 * Microsoft Visual Basic 4.0 Professional Edition
 * Microsoft Visual Basic 4.0 16-bit Enterprise Edition
 * Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

-



This article was previously published under Q145726



SYMPTOMS
When printing under Windows 95, Windows 98, and Windows Me, the FontTransparent property of the Printer object fails to change the way that the text is printed on the background. The FontTransparent property determines whether background text and graphics are displayed in the spaces around and within characters. The Visual Basic default for this property is True, meaning that the background will display in the spaces around the text. Under Windows 95, Windows 98, and Windows Me, the text will print as if FontTransparent is set to False, even though it is set to True.

Additionally, whenever a NewPage method is issued, all text on the new page will print as if FontTransparent is set to False even if it was printing correctly on the previous page.



CAUSE
The background mix mode, which directly relates to the Visual Basic FontTransparent property, and several other attributes of the printer device context, are modified at the start of a page by Windows 95, Windows 98, and Windows Me. This is a change in behavior from Windows NT and previous versions of Windows that is not addressed properly by the Visual Basic Printer Object. The problem should only affect the 32-bit version of Visual Basic, although some cases of the 16-bit version exhibiting this behavior have been reported. For more information on the cause, please see the following article in the Microsoft Windows SDK Knowledge Base:

125696 : StartPage/EndPage Resets Printer DC Attributes in Windows 95



RESOLUTION
To work around the problem, call the SetBKMode Windows API function to set the background mix mode. An example is shown in the More Information section below.



STATUS
Microsoft has confirmed this to be a problem in the Microsoft products listed at the beginning of this article.



MORE INFORMATION
This problem is printer driver-specific, meaning that the exact symptoms can vary from driver to driver. Some drivers do not experience this problem at all, while others reset the background mix mode to Opaque when any Printer object property is changed. This article describes the most common scenario. To make sure that you cover the worst possible case, you should call the SetBkMode function just before your Printer.Print calls. Then if you change any property of the Printer object, call SetBkMode again.

The code to duplicate the problem is as follows:

 Start Visual Basic. From the File menu, choose New Project (ALT, F, N). Form1 is created by default.  In the click event of the form, add the following code: Private Sub Form_Click

Printer.Line (0,0)-(10000, 2000), &HC0C0C0, BF     Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.FontTransparent = True Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent Printer.FontTransparent = False Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent Printer.EndDoc

End Sub

 From the Run menu, choose start (ALT, R, S), or press the F5 key to run the program. Click the form. The result should be a gray page with one line of black text in the upper left corner and another line of black text in a white box beneath the first. On Windows 95, Windows 98, and Windows Me, this will yield a gray page with a white box and black text for both lines.

The following steps correct the problem in the previous example:

  Add the following declarations to the General section of the form: #If Win32 Then

Private Declare Function SetBkMode Lib "gdi32" _ (ByVal hdc As Long, ByVal nBkMode As Long) As Long

Private iBKMode as Long

#Else

Private Declare Function SetBkMode Lib "GDI" (ByVal hDC As Integer _     , ByVal nBkMode As Integer) As Integer

Private iBKMode as Integer

#End If

Private Const TRANSPARENT = 1 Private Const OPAQUE = 2

</li>  Correct the code in the click event of the form as such: Private Sub Form_Click

Printer.Print "" Printer.Line (0,0)-(10000, 2000), &HC0C0C0, BF      Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.FontTransparent = True 'Correctly sets the background mix mode to transparent iBKMode = SetBKMode(Printer.Hdc, TRANSPARENT) Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent Printer.FontTransparent = False 'Correctly sets the background mix mode to opaque iBKMode = SetBKMode(Printer.Hdc, OPAQUE) Printer.Print "Printer.FontTransparent = " & Printer.FontTransparent Printer.EndDoc

End Sub

</li> From the Run menu, choose start (ALT, R, S), or press the F5 key to run the program.</li> Click the form. The text should now print as expected.</li></ol>

<div class="references_section">