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.