VB应用程序中一个很重要而且常用的输出对象就是打印机对象,程序中用关键字Printer来访问它。VB提供了三种打印机输出方式:(1)将文本用Print方法直接输出到打印机;(2)将绘制的图形用Line、Circle、Pset等方法输出到打印机;(3)将所欲输出的信息送往窗体,然后将窗体用PrintForm方法打印出来。显然,仅用VB为打印机对象所提供的方法来按照用户的要求灵活地打印位图是十分困难的。笔者在工作实践中,运用Windows API函数解决了这一难点。1.建立含有如下控件的窗体 图片框 Picture1 ScaleMode=3 '装载用户需要打印的位图 命令按钮 Command1 '进行打印操作2.建立模块窗口 在模块窗口加入程序所使用的Windows API函数声明、常量声明及全局变量声明。 Type BITMAP '14 bytes bmType As Integer bmWidth As Integer bmHeight As Integer bmWidthBytes As Integer bmPlanes As String * 1 bmBitsPixel As String * 1 bmBits As Long End Type Type BITMAPINFOHEADER '40 bytes biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Type BITMAPINFO 'Varies bmiHeader As BITMAPINFOHEADER bmiColors As String * 128 End Type Global Const srccopy = &HCC0020 ' (DWORD) dest = source Global Const BI_RGB = 0& Global Const GMEM_MOVEABLE = &H2 Global Const DIB_RGB_COLORS = 0 Global Const RC_DIBTODEV = &H200 ' supports DIBitsToDevice Global Const RASTERCAPS = 38 ' Bitblt capabilities Declare Function GlobalAlloc% Lib "Kernel" (ByVal wFlags%, ByVal dwBytes&) Declare Function CreateCompatibleDC% Lib "GDI" (ByVal hDC%) Declare Function CreateDIBitmap% Lib "GDI" (ByVal hDC%,lpInfoHeader As BITMAPINFOHEADER, ByVal dwUsage&, ByVal lpInitBits$, lpInitInfo As BITMAPINFO, ByVal wUsage%) Declare Function CreateDIBitmapBynum% Lib "GDI" Alias "CreateDIBitmap" (ByVal hDC%, lpInfoHeader As BITMAPINFOHEADER, ByVal dwUsage&, ByVal lpInitBits&, lpInitInfo As BITMAPINFO, ByVal wUsage%) Declare Function DeleteDC% Lib "GDI" (ByVal hDC%) Declare Function GlobalFree% Lib "Kernel" (ByVal hMem%) Declare Function GlobalLock& Lib "Kernel" (ByVal hMem%) Declare Function GlobalUnlock% Lib "Kernel" (ByVal hMem%) Declare Function GetDIBits% Lib "GDI" (ByVal aHDC%, ByVal hBitmap%, ByVal nStartScan%, ByVal nNumScans%, ByVal lpBits$, lpBI As BITMAPINFO, ByVal wUsage%) Declare Function GetDIBitsBynum% Lib "GDI" Alias "GetDIBits" (ByVal HDC%, ByVal hBitmap%, ByVal nStartScan%, ByVal nNumScans%, ByVal lpBits&, lpBI As BITMAPINFO, ByVal wUsage%) Declare Function SetDIBits% Lib "GDI" (ByVal aHDC%, ByVal hBitmap%,ByVal nStartScan%, ByVal nNumScans%, ByVal lpBits$,lpBI As BITMAPINFO, ByVal wUsage%) Declare Function SetDIBitsBynum% Lib "GDI" Alias "SetDIBits" (ByVal HDC%, ByVal hBitmap%, ByVal nStartScan%, ByVal nNumScans%,ByVal lpBits&, lpBI As BITMAPINFO, ByVal wUsage%) Declare Function StretchDIBits% Lib "GDI" (ByVal hDC%, ByVal x%, ByVal y%, ByVal dX%, ByVal dY%, ByVal SrcX%, ByVal SrcY%, ByVal wSrcWidth%, ByVal wSrcHeight%, ByVal lpBits$, lpBitsInfo As BITMAPINFO, ByVal wUsage%, ByVal dwRop&) Declare Function StretchDIBitsBynum% Lib "GDI" Alias "StretchDIBits" (ByVal hDC%, ByVal x%, ByVal y%, ByVal dX%, ByVal dY%, ByVal SrcX%, ByVal SrcY%, ByVal wSrcWidth%, ByVal wSrcHeight%, ByVal lpBits&, lpBI As BITMAPINFO, ByVal wUsg%, ByVal dwR&)3.编写打印位图子程序 在模块窗口中,编写打印位图子程序,程序代码清单如下: Sub PrintBitMap (ByVal hDC%, ByVal x1%, ByVal y1%, ByVal wx%, ByVal hy%) Dim Bi As BITMAPINFO Dim DCtemp% Dim Bufsize& Dim Bm As BITMAP Dim Ghnd% Dim Gptr& Dim Di% DCtemp% = CreateCompatibleDC(Picture1.hDC) Bi.bmiHeader.biSize = 40 Bi.bmiHeader.biWidth = Picture1.ScaleWidth Bi.bmiHeader.biHeight = Picture1.ScaleHeight Bi.bmiHeader.biPlanes = 1 Bi.bmiHeader.biBitCount = 4 Bi.bmiHeader.biCompression = BI_RGB Ghnd% = GlobalAlloc(GMEM_MOVEABLE, Bufsize&) Gptr& = GlobalLock&(Ghnd%) Di%=GetDIBitsBynum%(DCtemp%,Picture1.Picture,0, Picture1.ScaleHeight,Gptr&,Bi, DIB_RGBCOLORS) Di%=StretchDIBitsBynum(hDC%, x1, y1, wx, hy,0,0, Picture1.ScaleWidth, Picture1.ScaleHeight,Gptr&,Bi,DIB_RGB_COLORS, SRCCOPY) Di% = GlobalUnlock(Ghnd%) Di% = GlobalFree(Ghnd%) Di% = DeleteDC%(DCtemp%) End Sub4.位图的打印 在所建窗体上,双击命令按扭Command1,进入窗体Command1_Click事件代码窗口: Sub Command1_Click ( ) PrintBitMap CInt(Printer.hDC), x1, y1, wx, hy Printer.NewPage Printer.EndDoc End Sub 以上程序在Visual Basic 3.0环境下调试通过,能够在大多数打印机上成功地打印位图。
to bydisplay: 我怎么在msdn里查不到StretchDIBitsBynum这个函数? 请问有一副bmp位图,如何将其全屏幕显示?用stretchdibits可以吗?
应为:Public Declare Function StretchDIBits Lib "gdi32" Alias "StretchDIBits" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long 可以 看看 http://www.freewebs.com/ztsoft/jishu/jishuvc1.htm
【声明】 Public Declare Function StretchDIBits Lib "gdi32" Alias "StretchDIBits" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long 【说明】 将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景。这个函数在设备场景中定义了一个目标矩形,用于接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据。根据设备场景的StretchBlt模式(由SetStretchBltMode函数决定),源矩形会根据需要调整,以便符合目标矩形的要求 【返回值】 Long,如函数执行成功,返回欲复制的扫描线的数量;如返回常数GDI_ERROR,表示出错 【参数表】 hdc ------------ Long,一个设备场景的句柄。该场景用于接收位图数据 x,y ------------ Long,用逻辑坐标表示的目标矩形的起点 dx,dy ---------- Long,目标矩形的宽度及高度,以逻辑坐标表示 SrcX,SrcY ------ Long,用设备坐标表示的源矩形在DIB中的起点 wSrcWidth,wSrcHeight - Long,源矩形的宽度与高度,用设备坐标表示。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换 lpBits --------- Any,指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpBitsInfo指定的 lpBitsInfo ----- BITMAPINFO,对lpBits DIB的格式和颜色进行描述的一个结构 wUsage --------- Long,下述常数之一 DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hdc设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RG颜色 dwRop ---------- Long,欲进行的光栅运算
图片框 Picture1 ScaleMode=3 '装载用户需要打印的位图
命令按钮 Command1 '进行打印操作2.建立模块窗口
在模块窗口加入程序所使用的Windows API函数声明、常量声明及全局变量声明。
Type BITMAP '14 bytes
bmType As Integer
bmWidth As Integer
bmHeight As Integer
bmWidthBytes As Integer
bmPlanes As String * 1
bmBitsPixel As String * 1
bmBits As Long
End Type
Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Type BITMAPINFO 'Varies
bmiHeader As BITMAPINFOHEADER
bmiColors As String * 128
End Type
Global Const srccopy = &HCC0020 ' (DWORD) dest = source
Global Const BI_RGB = 0&
Global Const GMEM_MOVEABLE = &H2
Global Const DIB_RGB_COLORS = 0
Global Const RC_DIBTODEV = &H200 ' supports DIBitsToDevice
Global Const RASTERCAPS = 38 ' Bitblt capabilities
Declare Function GlobalAlloc% Lib "Kernel" (ByVal wFlags%, ByVal dwBytes&)
Declare Function CreateCompatibleDC% Lib "GDI" (ByVal hDC%)
Declare Function CreateDIBitmap% Lib "GDI" (ByVal hDC%,lpInfoHeader As
BITMAPINFOHEADER, ByVal dwUsage&, ByVal lpInitBits$, lpInitInfo As
BITMAPINFO, ByVal wUsage%)
Declare Function CreateDIBitmapBynum% Lib "GDI" Alias "CreateDIBitmap" (ByVal hDC%,
lpInfoHeader As BITMAPINFOHEADER, ByVal dwUsage&, ByVal lpInitBits&,
lpInitInfo As BITMAPINFO, ByVal wUsage%)
Declare Function DeleteDC% Lib "GDI" (ByVal hDC%)
Declare Function GlobalFree% Lib "Kernel" (ByVal hMem%)
Declare Function GlobalLock& Lib "Kernel" (ByVal hMem%)
Declare Function GlobalUnlock% Lib "Kernel" (ByVal hMem%)
Declare Function GetDIBits% Lib "GDI" (ByVal aHDC%, ByVal hBitmap%, ByVal nStartScan%,
ByVal nNumScans%, ByVal lpBits$, lpBI As BITMAPINFO, ByVal wUsage%)
Declare Function GetDIBitsBynum% Lib "GDI" Alias "GetDIBits" (ByVal HDC%, ByVal
hBitmap%, ByVal nStartScan%, ByVal nNumScans%, ByVal lpBits&, lpBI As
BITMAPINFO, ByVal wUsage%)
Declare Function SetDIBits% Lib "GDI" (ByVal aHDC%, ByVal hBitmap%,ByVal nStartScan%,
ByVal nNumScans%, ByVal lpBits$,lpBI As BITMAPINFO, ByVal wUsage%)
Declare Function SetDIBitsBynum% Lib "GDI" Alias "SetDIBits" (ByVal HDC%, ByVal
hBitmap%, ByVal nStartScan%, ByVal nNumScans%,ByVal lpBits&, lpBI As
BITMAPINFO, ByVal wUsage%)
Declare Function StretchDIBits% Lib "GDI" (ByVal hDC%, ByVal x%, ByVal y%, ByVal dX%,
ByVal dY%, ByVal SrcX%, ByVal SrcY%, ByVal wSrcWidth%, ByVal wSrcHeight%,
ByVal lpBits$, lpBitsInfo As BITMAPINFO, ByVal wUsage%, ByVal dwRop&)
Declare Function StretchDIBitsBynum% Lib "GDI" Alias "StretchDIBits" (ByVal hDC%, ByVal
x%, ByVal y%, ByVal dX%, ByVal dY%, ByVal SrcX%, ByVal SrcY%, ByVal
wSrcWidth%, ByVal wSrcHeight%, ByVal lpBits&, lpBI As BITMAPINFO, ByVal
wUsg%, ByVal dwR&)3.编写打印位图子程序
在模块窗口中,编写打印位图子程序,程序代码清单如下:
Sub PrintBitMap (ByVal hDC%, ByVal x1%, ByVal y1%, ByVal wx%, ByVal hy%)
Dim Bi As BITMAPINFO
Dim DCtemp%
Dim Bufsize&
Dim Bm As BITMAP
Dim Ghnd%
Dim Gptr&
Dim Di%
DCtemp% = CreateCompatibleDC(Picture1.hDC)
Bi.bmiHeader.biSize = 40
Bi.bmiHeader.biWidth = Picture1.ScaleWidth
Bi.bmiHeader.biHeight = Picture1.ScaleHeight
Bi.bmiHeader.biPlanes = 1
Bi.bmiHeader.biBitCount = 4
Bi.bmiHeader.biCompression = BI_RGB
Ghnd% = GlobalAlloc(GMEM_MOVEABLE, Bufsize&)
Gptr& = GlobalLock&(Ghnd%)
Di%=GetDIBitsBynum%(DCtemp%,Picture1.Picture,0,
Picture1.ScaleHeight,Gptr&,Bi,
DIB_RGBCOLORS)
Di%=StretchDIBitsBynum(hDC%, x1, y1, wx, hy,0,0,
Picture1.ScaleWidth,
Picture1.ScaleHeight,Gptr&,Bi,DIB_RGB_COLORS, SRCCOPY)
Di% = GlobalUnlock(Ghnd%)
Di% = GlobalFree(Ghnd%)
Di% = DeleteDC%(DCtemp%)
End Sub4.位图的打印
在所建窗体上,双击命令按扭Command1,进入窗体Command1_Click事件代码窗口:
Sub Command1_Click ( )
PrintBitMap CInt(Printer.hDC), x1, y1, wx, hy
Printer.NewPage
Printer.EndDoc
End Sub
以上程序在Visual Basic 3.0环境下调试通过,能够在大多数打印机上成功地打印位图。
我怎么在msdn里查不到StretchDIBitsBynum这个函数?
请问有一副bmp位图,如何将其全屏幕显示?用stretchdibits可以吗?
可以
看看
http://www.freewebs.com/ztsoft/jishu/jishuvc1.htm
Public Declare Function StretchDIBits Lib "gdi32" Alias "StretchDIBits" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long
【说明】
将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景。这个函数在设备场景中定义了一个目标矩形,用于接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据。根据设备场景的StretchBlt模式(由SetStretchBltMode函数决定),源矩形会根据需要调整,以便符合目标矩形的要求
【返回值】
Long,如函数执行成功,返回欲复制的扫描线的数量;如返回常数GDI_ERROR,表示出错
【参数表】
hdc ------------ Long,一个设备场景的句柄。该场景用于接收位图数据 x,y ------------ Long,用逻辑坐标表示的目标矩形的起点 dx,dy ---------- Long,目标矩形的宽度及高度,以逻辑坐标表示 SrcX,SrcY ------ Long,用设备坐标表示的源矩形在DIB中的起点 wSrcWidth,wSrcHeight - Long,源矩形的宽度与高度,用设备坐标表示。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换 lpBits --------- Any,指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpBitsInfo指定的 lpBitsInfo ----- BITMAPINFO,对lpBits DIB的格式和颜色进行描述的一个结构 wUsage --------- Long,下述常数之一
DIB_PAL_COLORS
颜色表是一个整数数组,其中包含了与目前选入hdc设备场景的调色板相关的索引
DIB_RGB_COLORS
颜色表包含了RG颜色 dwRop ---------- Long,欲进行的光栅运算
很有必要先好好地搞清楚GDI部分API,以及VB中stdPicture对象是怎么回事
用vc调用好的多。
,是不是用这个函数可以实现?怎么实现?里边的参数应该怎么写??
大家快帮忙想想.