The information in this article applies to:
- Standard and Professional Editions of Microsoft Visual Basic for
Windows, version 2.0
- Microsoft Visual Basic programming system for Windows, version 1.0
SUMMARY
By using the Windows API Escape() function, an application can change the
paper size on the printer and obtain a list of available paper metrics for
the default printer.
To get the list of available paper metrics, pass the ENUMPAPERMETRICS
printer escape constant to the Escape() function. The function will return
either an array containing the paper metrics or the number of paper metrics
available.
NOTE: Paper metrics differ from the physical paper sizes in that paper
metrics delineate the actual region that can be printed to, whereas paper
size is the physical size of the paper including the non-printable regions.
To change the paper size, pass the GETSETPAPERMETRICS printer escape
constant along with the paper metrics to the Escape() function.
MORE INFORMATION
The example program listed below demonstrates how to use both printer
escape constants (ENUMPAPERMETRICS and GETSETPAPERMETRICS) with the
Windows API Escape() function.
An Important Note
The Windows API Escape() function is provided in Windows versions 3.0 and
3.1 for backward compatibility with earlier versions of Microsoft Windows.
Applications are supposed to use the GDI DeviceCapabilities() and
ExtDeviceMode() functions instead of the Escape() function, but neither
DeviceCapabilities() nor ExtDeviceMode() can be called directly from Visual
Basic. This is because they are exported by the printer driver, not by the
Windows GDI. The only way to use ExtDeviceMode() or DeviceCapabilities()
in Visual Basic is to create a DLL and call them from there. To execute the
ExtDeviceMode() function, you need to obtain a function pointer to it from
the current printer driver. Visual Basic does not support pointers.
Steps to Create Example
- Start Visual Basic or from the File menu, choose New Project (ALT, F, N)
if Visual Basic is already running. Form1 is created by default.
- From the File menu, choose New Module (ALT, F, M). Module1 is created
by default.
- Add the following code to the general declarations section of Module1:
Type Rect
Left As Integer
Top As Integer
Right As Integer
Bottom As Integer
End Type
' Enter each Declare as one, single line.
Declare Function EnumPaperMetricsEscape% Lib "GDI" Alias "Escape"
(ByVal hDC%, ByVal nEscape%, ByVal IntegerSize%, lpMode%,
lpOutData As Rect)
Declare Function SetPaperMetricsEscape% Lib "GDI" Alias "Escape"
(ByVal hDC%, ByVal nEscape%, ByVal RectSize%, NewPaper As Rect,
PrevPaper As Rect)
Declare Function GetDeviceCaps% Lib "gdi" (ByVal hDC%, ByVal nIndex%)
Global Const ENUMPAPERMETRICS = 34
Global Const GETSETPAPERMETRICS = 35
Global Const LOGPIXELSX = 88 ' Logical pixels/inch in X
Global Const LOGPIXELSY = 90 ' Logical pixels/inch in Y
- Add the following code to the General Declarations section of Form1:
Dim RectArray() As Rect
- Add a command button (Command1) to Form1.
- Add a list box (List1) to Form1.
- Add the following code to the Command1_Click event procedure. For
readability some lines of code are shown as two lines but must be
entered as a single line of code.
Sub Command1_Click ()
ReDim RectArray(1)
mode% = 0
' Enter the entire Result% statement as one, single line.
Result% = EnumPaperMetricsEscape(Printer.hDC, ENUMPAPERMETRICS,
2, mode%, RectArray(0))
If Result% = 0 Then ' If Result = 0, the call failed
MsgBox "Printer Driver does not Support EnumPaperMetrics", 48
Command1.Enabled = False
Exit Sub
End If
ReDim RectArray(Result% - 1) ' Result% contains num paper sizes
mode% = 1
' Enter the entire Result2% statement as one, single line.
Result2% = EnumPaperMetricsEscape(Printer.hDC, ENUMPAPERMETRICS,
2, mode%, RectArray(0))
HorzRatio% = GetDeviceCaps(Printer.hDC, LOGPIXELSX)
VertRatio% = GetDeviceCaps(Printer.hDC, LOGPIXELSY)
' Add Paper Sizes (Listed by actual printing region) in inches
' to the list box. Enter each of the PWidth$ and PHeight$ statements
' as one, single line.
For i% = 0 To Result% - 1
PWidth$ = Format$((RectArray(i%).Right - RectArray(i%).Left)
/ HorzRatio%) + Chr$(34) ' Enter as a single line
PHeight$ = Format$((RectArray(i%).Bottom - RectArray(i%).Top)
/ VertRatio%) + Chr$(34) ' Enter as a single line
List1.AddItem PWidth$ + " X " + PHeight$
Next i%
End Sub
- Add the following code to the List1_Click event procedure:
Sub List1_Click ()
Dim PrevPaperSize As Rect
' Enter the entire Result% statement as one, single line.
Result% = SetPaperMetricsEscape(Printer.hDC, GETSETPAPERMETRICS,
Len(PrevPaperSize), RectArray(List1.ListIndex), PrevPaperSize)
If Result% = 0 Then
MsgBox "Printer Driver does not support this Escape.", 48
ElseIf Result% < 0 Then
MsgBox "Error in calling Escape with GETSETPAPERMETRICS."
Else
MsgBox "Paper size successfully changed!"
End If
End Sub
- From the Run menu, choose Start (ALT, R, S) to run the program.
- Choose the Command1 button to display a list of available paper metrics
in the List1 box. The paper metrics represent the size of the printable
regions supported by the printer, not the physical paper sizes.
- Select one of the paper metrics shown in the List1 box. A message box
appears indicating whether or not the paper size was successfully
changed using the paper metrics you selected.
|