Using the Win32 API

Top  Previous  Next

The Microsoft Knowledgebase article Q175535 has information on using the Win32 API from Visual Basic.  The Win32 API can be used when the Printer object does not provide the necessary functionality.

 

1.        Create a Standard EXE project in Visual Basic 6.0. Form1 is created by default.        

2.        Add 2 CommandButtons to Form1.        

3.        Add the following code to the General Declarations section of Form1:        

 

 Option Explicit

 

  Private Const LF_FACESIZE = 32

 

  Private Type LOGFONT

     lfHeight As Long

     lfWidth As Long

     lfEscapement As Long

     lfOrientation As Long

     lfWeight As Long

     lfItalic As Byte

     lfUnderline As Byte

     lfStrikeOut As Byte

     lfCharSet As Byte

     lfOutPrecision As Byte

     lfClipPrecision As Byte

     lfQuality As Byte

     lfPitchAndFamily As Byte

     lfFaceName As String * LF_FACESIZE

  End Type

 

  Private Type DOCINFO

     cbSize As Long

     lpszDocName As String

     lpszOutput As String

     lpszDatatype As String

     fwType As Long

  End Type

 

  Private Declare Function CreateFontIndirect Lib "gdi32" Alias _

  "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long

 

  Private Declare Function SelectObject Lib "gdi32" _

  (ByVal hdc As Long, ByVal hObject As Long) As Long

 

  Private Declare Function DeleteObject Lib "gdi32" _

  (ByVal hObject As Long) As Long

 

  Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _

  (ByVal lpDriverName As String, ByVal lpDeviceName As String, _

  ByVal lpOutput As Long, ByVal lpInitData As Long) As Long

 

  Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) _

  As Long

 

  Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _

  (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _

  ByVal lpString As String, ByVal nCount As Long) As Long ' or Boolean

 

  Private Declare Function StartDoc Lib "gdi32" Alias "StartDocA" _

  (ByVal hdc As Long, lpdi As DOCINFO) As Long

 

  Private Declare Function EndDoc Lib "gdi32" (ByVal hdc As Long) _

  As Long

 

  Private Declare Function StartPage Lib "gdi32" (ByVal hdc As Long) _

  As Long

 

  Private Declare Function EndPage Lib "gdi32" (ByVal hdc As Long) _

  As Long

 

  Const DESIREDFONTSIZE = 12     ' Could use variable, TextBox, etc.

 

  Private Sub Command1_Click()

  ' Combine API Calls with the Printer object

     Dim OutString As String

     Dim lf As LOGFONT

     Dim result As Long

     Dim hOldfont As Long

     Dim hPrintDc As Long

     Dim hFont As Long

 

     Printer.Print "Printer Object"

     hPrintDc = Printer.hdc

     OutString = "Hello World"

 

     lf.lfEscapement = 1800

     lf.lfHeight = (DESIREDFONTSIZE * -20) / Printer.TwipsPerPixelY

     hFont = CreateFontIndirect(lf)

     hOldfont = SelectObject(hPrintDc, hFont)

     result = TextOut(hPrintDc, 1000, 1000, OutString, Len(OutString))

     result = SelectObject(hPrintDc, hOldfont)

     result = DeleteObject(hFont)

 

     Printer.Print "xyz"

     Printer.EndDoc

  End Sub

 

  Private Sub Command2_Click()

  ' Print using API calls only

     Dim OutString As String  'String to be rotated

     Dim lf As LOGFONT        'Structure for setting up rotated font

     Dim temp As String       'Temp string var

     Dim result As Long       'Return value for calling API functions

     Dim hOldfont As Long     'Hold old font information

     Dim hPrintDc As Long     'Handle to printer dc

     Dim hFont As Long        'Handle to new Font

     Dim di As DOCINFO        'Structure for Print Document info

 

     OutString = "Hello World"   'Set string to be rotated

 

  ' Set rotation in tenths of a degree, i.e., 1800 = 180 degrees

     lf.lfEscapement = 1800

     lf.lfHeight = (DESIREDFONTSIZE * -20) / Printer.TwipsPerPixelY

     hFont = CreateFontIndirect(lf)  'Create the rotated font

     di.cbSize = 20                  ' Size of DOCINFO structure

     di.lpszDocName = "My Document" ' Set name of print job (Optional)

 

  ' Create a printer device context

     hPrintDc = CreateDC(Printer.DriverName, Printer.DeviceName, 0, 0)

 

     result = StartDoc(hPrintDc, di) 'Start a new print document

     result = StartPage(hPrintDc)    'Start a new page

 

  ' Select our rotated font structure and save previous font info

     hOldfont = SelectObject(hPrintDc, hFont)

 

  ' Send rotated text to printer, starting at location 1000, 1000

     result = TextOut(hPrintDc, 1000, 1000, OutString, Len(OutString))

 

  ' Reset font back to original, non-rotated

     result = SelectObject(hPrintDc, hOldfont)

 

  ' Send non-rotated text to printer at same page location

     result = TextOut(hPrintDc, 1000, 1000, OutString, Len(OutString))

 

     result = EndPage(hPrintDc)      'End the page

     result = EndDoc(hPrintDc)       'End the print job

     result = DeleteDC(hPrintDc)     'Delete the printer device context

     result = DeleteObject(hFont)    'Delete the font object

  End Sub

 

  Private Sub Form_Load()

     Command1.Caption = "API with Printer object"

     Command2.Caption = "Pure API"

  End Sub

 

4.   Run the Project and click API with Printer object . This will print a single page to the current default printer with "Printer Object" and "xyz" printed normally and "Hello World" printed rotated 180 degrees.

 

5.   Click Pure API . This will print a single page to the current default printer with "Hello World" printed normally and rotated 180 degrees.