dim prtTemp as printermsgbox prtTemp.屬性

解决方案 »

  1.   


    Call CopyMemory(PI2, Temp(0), nSize)
     |
     V
    Call CopyMemory(pi2, temp(0), Len(pi2))
      

  2.   

    Printer drivers store their default settings in a structure called the DEVMODE.When you define or select a page size, four members of this structure may beinvolved: - dmPaperSize - dmPaperLength - dmPaperWidth - dmFormNameThe dmPaperLength and dmPaperWidth members contain values on all operating systems, but they can only be used to select or define a size on systems thatare running Windows 95, Windows 98, or Windows Me. The dmFormName member is only valid for systems that are running Windows NT or Windows 2000. The dmPaperSize member can be used on any 32-bit Windows operating system, as long as the value that is assigned to it corresponds to a size or form that is defined on thatsystem.Thus, on systems that are running Windows 95, Windows 98, or Windows Me, you can define custom page sizes by height (length) and width or by a predefined papersize. Windows NT-based or Windows 2000-based systems only use defined forms for page sizes, which you can select in one of two ways: set dmFormName or assign avalid "constant" value to dmPaperSize.To use a particular paper size on Windows NT or Windows 2000, you must define a form for it. The Visual Basic Printer object has PageSize, Height, and Widthproperties that expose the dmPaperSize, dmPaperLength, and dmPaperWidth members of the DEVMODE. However, the Printer object does not expose a way to select aform by name, nor does it have a method to add a custom form at run time. We must use the Win32 application programming interface (API) to create a customform and/or select a form by name.How to Programmatically Select a Form:This article uses the EnumForms basic process to list all forms that are supported for the current printer and to check the height and width of eachform. If the specified size is found, it is selected. If it is not found, the code adds the form and then selects it.There are three ways to programmatically select a form: - Retrieve the printer's DEVMODE structure, set the dmFormName member, and use the ResetDC function to set this form as the current form for the Device   Context (DC) of the printer. When this form is selected for the DC, it is only selected for the calling process and does not change the driver's default setting. This does not  require any special permissions. This method is preferred for applications that change a printer's settings. - Call the SetForm function to change the default form for the printer driver. This method requires full access permissions to the driver. When the default form is changed, it affects every application that uses this driver to print. If this is a network printer, most users do not have the necessary permissions to make this call. - Assign the system-defined value for the custom form to Printer.PaperSize.Only the first method is demonstrated in this article's sample code; the sample does not demonstrate the call to SetForm or the value assignment to Printer.PaperSize. The sample captures the system-assigned value of the new custom form by returning the value of its ordinal position in the list that EnumForms returns. Note that this only works for custom forms. Predefined forms have constant values assigned to them that do not correspond to their ordinal position in this list.When you use the AddForm function to add your custom form, the form is given its own number, if available, which then remains consistent across all printers that use the form. In this case, the form is defined and given a "constant" value for the current system. You can then assign this value to Printer.PaperSize to select it. However, because the number assignment is simply one more than the number of forms that is listed for the current printer when the form was added, this number may not be available because a predefined form is already using that number. Therefore, it is not recommended that you use this value to select a form, and this value is not demonstrated here. If you use this number assignment, and the value for it is unavailable, it will either select the wrong form or raise run-time error 380: "Invalid Property Value."Form Sources and Functions:Most forms are defined by the operating system and are available to all local printers. However, forms for network printers are defined on the printer server. Some forms may be defined specifically for a given printer driver and only appear in the list for that driver. Another source for forms is custom-defined or user-defined forms, which can be created manually or through code and are available to all local printers on the system. Both printer-specific and user-defined forms are stored in the registry.It must be emphasized that some of these functions require Full Control permissions on the printer. Therefore, the SetForm, AddForm, and DeleteForm functions almost never work for printers that are installed as "network printers." This is because the drivers for network printers are not installed locally but reside on the printer server, and your User account is unlikely to have Administrator rights on the printer server. This differs from systems that are running Windows 95, Windows 98, or Windows Me, in which all printer drivers (even network printers) are always installed locally. However, you can install network printers as local printers in Windows NT or Windows 2000 and set the Port to the printer queue. Then you can use these functions to make changes without affecting other users who share the printer.Step-by-Step Example:1. Set a local printer as the default printer. To do this, follow these steps:   a. On the Start menu, point to Settings, and then click Printers.   b. Right-click the icon for a local printer, and then click "Set as default".2. Start a new Standard EXE project in Visual Basic. Form1 is created by   default.3. Add three CommandButtons and a ListBox control to Form1.
      

  3.   


    4. Paste the following code into the module of Form1:   Option Explicit   Private Sub Command1_Click()   Dim FormName As String   FormName = "MyCustomForm"   ' Use special, user-defined form.   UseForm FormName   End Sub   Private Sub Command2_Click()   Dim FormName As String   ' Get FormName from the ListBox.   On Error GoTo ListBoxERR    ' Trap for no selection.   FormName = Mid(List1.Text, 1, InStr(1, List1.Text, " -") - 1)   On Error GoTo 0             ' Turn off Error trap.   UseForm FormName   Exit Sub   ListBoxERR:   MsgBox "Select a printer from the ListBox before using this option.", _      vbExclamation   End Sub   Private Sub Command3_Click()   Dim RetVal As Long   Dim PrinterHandle As Long   ' Handle to printer   Dim PrinterName As String   Dim FormName As String   Dim Continue As Long   ' Delete form that is selected in ListBox.   PrinterName = Printer.DeviceName  ' Current printer   If OpenPrinter(PrinterName, PrinterHandle, 0&) Then       On Error GoTo ListBoxERR    ' Trap for no selection.       FormName = Mid(List1.Text, 1, InStr(1, List1.Text, " -") - 1)       On Error GoTo 0             ' Turn off Error trap.              Continue = MsgBox("Are you sure you want to permanently remove " & _                  FormName & " from " & PrinterName & "?", vbYesNo)       If Continue = vbYes Then           RetVal = DeleteForm(PrinterHandle, FormName & Chr(0))           If RetVal <> 0 Then ' DeleteForm succeeded.               List1.Clear     ' Reflect the deletion in the ListBox.               Form_Load       ' Rebuild the list.               MsgBox FormName & " deleted!", vbInformation, "Success!"           Else               MsgBox FormName & " not deleted!" & vbCrLf & vbCrLf & _                  "Error code: " & Err.LastDllError, vbInformation, "Failure!"           End If       End If       ClosePrinter (PrinterHandle)   End If   Exit Sub   ListBoxERR:   MsgBox "Select a printer from the ListBox before using this option.", _      vbExclamation   ClosePrinter (PrinterHandle)   End Sub   Private Sub Form_Load()   Dim NumForms As Long, I As Long   Dim FI1 As FORM_INFO_1   Dim aFI1() As FORM_INFO_1           ' Working FI1 array   Dim Temp() As Byte                  ' Temp FI1 array   Dim BytesNeeded As Long   Dim PrinterName As String           ' Current printer   Dim PrinterHandle As Long           ' Handle to printer   Dim FormItem As String              ' For ListBox   Dim RetVal As Long   Dim FormSize As SIZEL               ' Size of desired form   PrinterName = Printer.DeviceName    ' Current printer   If OpenPrinter(PrinterName, PrinterHandle, 0&) Then       With FormSize   ' Desired page size           .cx = 214000           .cy = 216000       End With       ReDim aFI1(1)       RetVal = EnumForms(PrinterHandle, 1, aFI1(0), 0&, BytesNeeded, _                NumForms)       ReDim Temp(BytesNeeded)       ReDim aFI1(BytesNeeded / Len(FI1))       RetVal = EnumForms(PrinterHandle, 1, Temp(0), BytesNeeded, _                BytesNeeded, NumForms)       Call CopyMemory(aFI1(0), Temp(0), BytesNeeded)       For I = 0 To NumForms - 1           With aFI1(I)               ' List name and size including the count (index).               FormItem = PtrCtoVbString(.pName) & " - " & .Size.cx / 1000 & _                  " mm X " & .Size.cy / 1000 & " mm   (" & I + 1 & ")"               List1.AddItem FormItem           End With       Next I       ClosePrinter (PrinterHandle)   End If   End Sub   Private Sub UseForm(FormName As String)   Dim RetVal As Integer   RetVal = SelectForm(FormName, Me.hwnd)   Select Case RetVal       Case FORM_NOT_SELECTED   ' 0           ' Selection failed!           MsgBox "Unable to retrieve From name", vbExclamation, _              "Operation halted!"       Case FORM_SELECTED   ' 1           ' Selection succeeded!           PrintTest     ' Comment this line to avoid printing       Case FORM_ADDED   ' 2           ' Form added and selected.           List1.Clear   ' Reflect the addition in the ListBox           Form_Load     ' by rebuilding the list.   End Select   End Sub
      

  4.   


    5. From the Project menu, add a new Module, Module1.6. Paste the following code into Module1:   Option Explicit   Public Declare Function EnumForms Lib "winspool.drv" Alias "EnumFormsA" _       (ByVal hPrinter As Long, ByVal Level As Long, ByRef pForm As Any, _       ByVal cbBuf As Long, ByRef pcbNeeded As Long, _       ByRef pcReturned As Long) As Long   Public Declare Function AddForm Lib "winspool.drv" Alias "AddFormA" _       (ByVal hPrinter As Long, ByVal Level As Long, pForm As Byte) As Long   Public Declare Function DeleteForm Lib "winspool.drv" Alias "DeleteFormA" _       (ByVal hPrinter As Long, ByVal pFormName As String) As Long          Public Declare Function OpenPrinter Lib "winspool.drv" _       Alias "OpenPrinterA" (ByVal pPrinterName As String, _       phPrinter As Long, ByVal pDefault As Long) As Long   Public Declare Function ClosePrinter Lib "winspool.drv" _       (ByVal hPrinter As Long) As Long   Public Declare Function DocumentProperties Lib "winspool.drv" _       Alias "DocumentPropertiesA" (ByVal hwnd As Long, _       ByVal hPrinter As Long, ByVal pDeviceName As String, _       pDevModeOutput As Any, pDevModeInput As Any, ByVal fMode As Long) _       As Long   Public Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" _       (ByVal hdc As Long, lpInitData As Any) As Long   Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _       (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)   Public Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" _       (ByVal lpString1 As String, ByRef lpString2 As Long) As Long          ' Optional functions not used in this sample, but may be useful.   Public Declare Function GetForm Lib "winspool.drv" Alias "GetFormA" _       (ByVal hPrinter As Long, ByVal pFormName As String, _       ByVal Level As Long, pForm As Byte, ByVal cbBuf As Long, _       pcbNeeded As Long) As Long          Public Declare Function SetForm Lib "winspool.drv" Alias "SetFormA" _       (ByVal hPrinter As Long, ByVal pFormName As String, _       ByVal Level As Long, pForm As Byte) As Long   ' Constants for DEVMODE   Public Const CCHFORMNAME = 32   Public Const CCHDEVICENAME = 32   Public Const DM_FORMNAME As Long = &H10000   Public Const DM_ORIENTATION = &H1&   ' Constants for PRINTER_DEFAULTS.DesiredAccess   Public Const PRINTER_ACCESS_ADMINISTER = &H4   Public Const PRINTER_ACCESS_USE = &H8   Public Const STANDARD_RIGHTS_REQUIRED = &HF0000   Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _     PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)        ' Constants for DocumentProperties() call   Public Const DM_MODIFY = 8   Public Const DM_IN_BUFFER = DM_MODIFY   Public Const DM_COPY = 2   Public Const DM_OUT_BUFFER = DM_COPY   ' Custom constants for this sample's SelectForm function   Public Const FORM_NOT_SELECTED = 0   Public Const FORM_SELECTED = 1   Public Const FORM_ADDED = 2   Public Type RECTL           Left As Long           Top As Long           Right As Long           Bottom As Long   End Type   Public Type SIZEL           cx As Long           cy As Long   End Type   Public Type SECURITY_DESCRIPTOR           Revision As Byte           Sbz1 As Byte           Control As Long           Owner As Long           Group As Long           Sacl As Long  ' ACL           Dacl As Long  ' ACL   End Type   ' The two definitions for FORM_INFO_1 make the coding easier.   Public Type FORM_INFO_1           Flags As Long           pName As Long   ' String           Size As SIZEL           ImageableArea As RECTL   End Type   Public Type sFORM_INFO_1           Flags As Long           pName As String           Size As SIZEL           ImageableArea As RECTL   End Type   Public Type DEVMODE           dmDeviceName As String * CCHDEVICENAME           dmSpecVersion As Integer           dmDriverVersion As Integer           dmSize As Integer           dmDriverExtra As Integer           dmFields As Long           dmOrientation As Integer           dmPaperSize As Integer           dmPaperLength As Integer           dmPaperWidth As Integer           dmScale As Integer           dmCopies As Integer           dmDefaultSource As Integer           dmPrintQuality As Integer           dmColor As Integer           dmDuplex As Integer           dmYResolution As Integer           dmTTOption As Integer           dmCollate As Integer           dmFormName As String * CCHFORMNAME           dmUnusedPadding As Integer           dmBitsPerPel As Long           dmPelsWidth As Long           dmPelsHeight As Long           dmDisplayFlags As Long           dmDisplayFrequency As Long   End Type   Public Type PRINTER_DEFAULTS           pDatatype As String           pDevMode As Long    ' DEVMODE           DesiredAccess As Long   End Type   Public Type PRINTER_INFO_2           pServerName As String           pPrinterName As String           pShareName As String           pPortName As String           pDriverName As String           pComment As String           pLocation As String           pDevMode As DEVMODE           pSepFile As String           pPrintProcessor As String           pDatatype As String           pParameters As String           pSecurityDescriptor As SECURITY_DESCRIPTOR           Attributes As Long           Priority As Long           DefaultPriority As Long           StartTime As Long           UntilTime As Long           Status As Long           cJobs As Long           AveragePPM As Long   End Type