在pb中怎么样控制好打印呢?帮帮忙啊!要不奖金被扣了!!!!!!!

jdsnhan 2001-12-30 09:46:34
在pb中怎么才能将数据直接送到打印机而不送到打印队列中呢?怎样检测打印机的状态呢
怎样才能检测是否缺纸呢?请高手帮忙,要不领导要扣奖金了,救命啊
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Methodor 2001-12-30
  • 打赏
  • 举报
回复
给你一点参考:
一个设置打印机的函数:
of_setprinter()
//参数如下:
// 与打印机有关的操作
// PrinterName:打印机名称
// Command:命令
// =1: 取打印机驱动名称
// = 2: 取打印机端口名称
// = 3: 取打印机状态
// = 4: 取打印机属性
// = 5: 取打印机纸张
// = 6: 取打印机自定义纸张的大小
// = 7: 取打印方向
// = 8: 设置为缺省打印机
// = 101: 设置打印机的纸张
// = 102: 将打印机设为自定义纸张并设定自定义纸张的大小
// = 103: 设置打印方向

// outpara: 1,2,3,4, 打印机参数由此返回
// papersize: 打印纸大小
// pagerwidth, pagerheight:自定义打印纸尺
// 取得打印机打印纸
// return 1: 成功
// return -1: 不成功

str_Printer_info_2 lstr_info
str_Printer_defaults lstr_default
str_devmode lstr_devmode
Integer li_rc, li_i
string ls_DriverName, ls_PortName
ulong ll_handle, ll_cbbuf, ll_cbNeeded
blob lbl_buffer

// 打开打印机
If Not OpenPrinter ( printername, ll_handle, ref lstr_default ) Then Return -1
ll_cbbuf = 0

// 取打印机驱动名称
ll_cbBuf = 0

l_SetBuffer:
lbl_buffer = Blob ( Space ( ll_cbBuf ) )
If Not GetPrinter ( ll_handle, 2, ref lbl_buffer, ll_cbBuf, ll_cbNeeded ) Then
If ll_cbNeeded > ll_cbBuf Then
ll_cbBuf = ll_cbNeeded
Goto l_SetBuffer
Else
Return -1
End If
End If

// copy 至结构
CopyMem ( lstr_info, lbl_buffer, PRINTER_INFO_2_LEN )

// 驱动名、端口
ls_DriverName = String ( lstr_info.DriverName, "address" )
ls_PortName = String ( lstr_info.PortName, "address" )

Choose Case Command
Case 1
// 驱动名称
OutPara = ls_DriverName
li_rc = 1
Goto l_quit
Case 2
// 端口名称
OutPara = ls_PortName
li_rc = 1
Goto l_quit
Case 3
// 打印机状态
OutPara = lstr_info.Status
li_rc = 1
Goto l_quit
Case 4
// 打印机属性
OutPara = lstr_info.Attributes
li_rc = 1
Goto l_quit
Case 5,6
// 打印纸大小
CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN )
papersize = lstr_devMode.dmPaperSize
paperwidth = lstr_devMode.dmPaperWidth
paperlength = lstr_devMode.dmPaperLength
li_rc = 1
Goto l_quit
Case 7
// 打印方向
CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN )
OutPara = lstr_devMode.dmOrientation
li_rc = 1
Goto l_quit
Case 105
// 设置为缺省打印机
lstr_info.Attributes += PRINTER_ATTRIBUTE_DEFAULT
CopyMem ( lbl_buffer, lstr_info, PRINTER_INFO_2_LEN )
If SetPrinter ( ll_handle , 2, lbl_buffer, 0 ) Then
li_rc = 1
Else
li_rc = -1
end If
Goto l_quit
End Choose

If Command = 101 Or Command = 102 Then
// 取打印机支持的纸张
SetNull ( lbl_buffer )
ll_cbbuf = DeviceCapabilities ( printername, ls_PortName, DC_PAPERS, 0, 0 )
lbl_buffer = Blob ( Space ( 1024 ) ) // ll_cbbuf ) )
ll_cbbuf = DeviceCapabilities ( PrinterName, ls_PortName, DC_PAPERS, lbl_buffer, 0 )
If ll_cbbuf < 0 Then Return -1

// 检查是否支持用户指定纸张
For li_i =1 To Integer ( ll_cbbuf )
If integer ( BlobMid ( lbl_buffer, ( li_i - 1 ) * 2 + 1, 2 ) ) = papersize Then Exit
Next

If li_i > Integer ( ll_cbbuf ) Then
// 不支持自定久纸张
Return -1
End If
End If

// 取需要的空间
ll_cbbuf =DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0 , 0 )
If ll_cbbuf < 0 Then
li_rc = -1
Goto l_quit
End If

// 分配空间
lbl_buffer = Blob ( Space ( ll_cbbuf ) )
li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0, DM_OUT_BUFFER )

CopyMem ( lstr_devmode, lbl_buffer, DEVMODE_LEN )

Choose Case command
Case 101,102
lstr_devMode.dmPaperSize = papersize
lstr_devMode.dmFields = DM_PAPERSIZE
If PaperSize = DMPAPER_USER Then
lstr_devMode.dmPaperWidth = paperwidth
lstr_devMode.dmPaperLength = paperlength
lstr_devMode.dmFields += DM_PAPERLENGTH + DM_PAPERWIDTH
End If
Case 103
lstr_devMode.dmOrientation = outpara
lstr_devMode.dmFields = DM_ORIENTATION
End Choose

li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, 0, lstr_devmode, DM_IN_BUFFER + DM_OUT_DEFAULT )
If li_rc > 0 Then li_rc = 1

l_quit:
ClosePrinter ( ll_handle )
Return li_rc
killerdanny 2001-12-30
  • 打赏
  • 举报
回复
PB实现太苦难!!你问问SDK的高手吧!去VC,问问有没有DLL!
nanjQQ 2001-12-30
  • 打赏
  • 举报
回复
你在测试中有什么问题?
Methodor 2001-12-30
  • 打赏
  • 举报
回复
Winapi~~
不过比较麻烦-如果有多种打印机型~~

256

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧