VB中给DataReport指定打印机

  DataReport是VB的报表工具,其简单方便快捷,解决常用的报表问题还是不错的。不过在打印功能上有一个非常大的弱点,就是在代码中不能通过相关属性或方法来指定打印机,只能用系统默认打印机来打印报表。这个问题也是论坛上常议的话题,在网上搜索一下,你可以找到解决方法(我没测试过),不过代码量不小,而且大量的API和Printer对象,令初学者望而却步。一直在找一个较为简单的解决方案,于是想到了注册表,查阅了Microsoft相关文章(http://support.microsoft.com/kb/271257/zh-cn),通过实践,终于解决,示例代码如下:

' 通过注册表修改默认打印机,来指定Rpt的打印


' 模块中的代码:

Option   Explicit

 
' 打开一个主键
Public   Declare   Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
( _
    
ByVal hKey As Long, _
    
ByVal lpSubKey As String, _
    
ByRef phkResult As Long _
As Long
    
'关闭一个主键
Public Declare Function RegCloseKey Lib "advapi32.dll" _
( _
    
ByVal hKey As Long _
As Long
    
'创建或改变一个键值,lpData应由缺省的ByRef型改为ByVal型
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
( _
    
ByVal hKey As Long, _
    
ByVal lpValueName As String, _
    
ByVal Reserved As Long, _
    
ByVal dwType As Long, _
    
ByVal lpData As Any, _
    
ByVal cbData As Long _
As Long
    
'查询一个键值,lpData应由缺省的ByRef型改为ByVal型
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
( _
    
ByVal hKey As Long, _
    
ByVal lpValueName As String, _
    
ByVal lpReserved As Long, _
    
ByRef lpType As Long, _
    
ByVal lpData As Any, _
    
ByRef lpcbData As Long _
As Long

'根键常数
Const HKEY_CLASSES_ROOT = -2147483648#
Const HKEY_CURRENT_USER = -2147483647#
Const HKEY_LOCAL_MACHINE = -2147483646#
Const HKEY_USERS = -2147483645#
    
'键值类型
Const REG_SZ = 1&             '字符串值
Const REG_BINARY = 3&         '二进制值
Const REG_DWORD = 4&          'DWORD值


'通过修改注册表修改默认打印机
'
win2000,winXP: HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Windows

Public Sub SetDefaultPrinter(ByVal sPrinter As String)
    
    
Dim nKeyHandle As Long, nValueType  As Long, nLength As Long
    
Dim sValue As String
    
    
Dim p As Printer
    
For Each p In Printers
        
If p.DeviceName = sPrinter Then
            sValue 
= p.DeviceName & "," & p.DriverName & "," & p.Port
            
Exit For
        
End If
    
Next
    
Set p = Nothing    

    nValueType 
= REG_SZ
    nLength 
= 255

    
Call RegOpenKey(HKEY_CURRENT_USER, "Software/Microsoft/Windows NT/CurrentVersion/Windows", nKeyHandle)
    
'修改Device这个值
    Call RegSetValueEx(nKeyHandle, "Device"0, nValueType, sValue, nLength)
    
'查询Device这个值
    'sValue = Space(255)
    'Call RegQueryValueEx(nKeyHandle, "Device", 0, nValueType, sValue, nLength)
    'MsgBox sValue
    Call RegCloseKey(nKeyHandle)
       
End Sub


'DataReport中的代码:
'
指定DataReport打印机
Private Sub DataReport_Initialize()
    
Call SetDefaultPrinter("//PC1EPSON LQ-680K ESC/P 2")
End Sub


'完成报表打印后还原原有默认打印机,原有默认打印机可以由RegQueryValueEx获得
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
    
Call SetDefaultPrinter("//Pc8Legend LJ6112MFC")
    
End
End Sub

以上代码 VB6 SP6 + Windows XP SP2 下通过 

另外,更改默认打印机还可以用以下方法解决:

 

Option   Explicit

Private   Const  HWND_BROADCAST  As   Long   =   & HFFFF &
Private   Const  WM_WININICHANGE  As   Long   =   & H1A

Private   Declare   Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" ( _
    
ByVal hwnd As Long, _
    
ByVal msg As Long, _
    
ByVal wParam As Long, _
    lParam 
As Any _
As Long
   
Private Declare Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" ( _
   
ByVal pszPrinter As String _
As Long

Private Sub Command1_Click()
    
    
'直接更改默认打印机
    Call SetDefaultPrinter(Trim(CmbPrinter.Text))
    
'通知更改
    Call SendNotifyMessage(HWND_BROADCAST, _
                          WM_WININICHANGE, _
                          
0ByVal "windows")
    
End Sub


Private Sub Form_Load()
    
Dim p As Printer
    
For Each p In Printers
        CmbPrinter.AddItem p.DeviceName
    
Next
End Sub


'摘自http://community.csdn.net/Expert/topic/5774/5774558.xml?temp=.7473566

你可能感兴趣的:(VB6.0基础编程)