*-程序名:直接打印表單內容-*
*-以位圖形式打印窗口內容-*
*-程序作者:未知,由源論壇轉載-*
*-用法:您可以以-*的形式執行程序
*示例:表單中的命令-*
*按下按鈕執行doprintform。PRG-*
*-定義常數
#定義LOGPIXELSX 88
#定義LOGPIXELSY 90
#定義物理偏移量X 112
#定義物理偏移量113
#定義SRCCOPY 13369376
#定義DIB_RGB_COLORS 0
*-調用該程序段中的子進程。
做decl
*-定義變量
私有pnWidth、pnHeight、lnBitsPerPixel、lnBytesPerScan
將0存儲到pnWidth、pnHeight、lnBitsPerPixel、lnBytesPerScan
本地hwnd、hFormDC、hPrnDC、hMemDC、hMemBmp、hSavedBitmap
xOffsPrn,yOffsPrn,xScale,yScale,lcDocInfo,lcBInfo,lpBitsArray
*-獲取打印機設備的坐標偏移量。
HPR NDC = getDefaultPrnDC()& amp;& amp未執行任何錯誤檢查。
xOffsPrn = GetDeviceCaps(hPrnDC,PHYSICALOFFSETX)
yOffsPrn = GetDeviceCaps(hPrnDC,PHYSICALOFFSETY)
*-獲取屏幕的窗口句柄,以及它們的寬度、高度等。
hwnd = GetFocus()& amp;& amp具有鍵盤焦點的窗口
hFormDC = GetWindowDC(hwnd)
= getWinRect (hwnd,@pnWidth,@pnHeight)
*-根據屏幕和打印機得到縮放值。
xScale = GetDeviceCaps(hPrnDC,LOGPIXELSX)/GetDeviceCaps(hFormDC,LOGPIXELSX)
yScale = GetDeviceCaps(hPrnDC,LOGPIXELSY)/GetDeviceCaps(hFormDC,LOGPIXELSY)
*-將屏幕內容創建為位圖圖像數據。
hme MDC = CreateCompatibleDC(hFormDC)
hme mbmp = CreateCompatibleBitmap(hFormDC,pnWidth,pnHeight)
hSavedBitmap = select object(hme MDC,hMemBmp)
*-將位圖數據從屏幕復制到虛擬設備。
= BitBlt (hMemDC,0,0,pnWidth,pnHeight,hFormDC,0,0,SRCCOPY)
= SelectObject(hMemDC,hSavedBitmap)
*將兼容位圖中的位檢索到緩沖區中
*作為具有BitsPerPixel值的獨立於設備的位圖(DIB)
*作為打印機設備上下文之壹
lcBInfo = InitBitmapInfo(hPrnDC)
lpBitsArray = InitBitsArray()
= GetDIBits (hMemDC,hMemBmp,0,pnHeight,;
lpBitsArray,@lcBInfo,DIB_RGB_COLORS)
lcDocInfo = Chr(20) + Repli(Chr(0),19)& ampDOCINFO結構- 20字節
IF StartDoc(hPrnDC,@ lcDocInfo)& gt;0
=起始頁(hPrnDC)
= StretchDIBits (hPrnDC,xOffsPrn,yOffsPrn,;
xOffsPrn + Int(xScale * pnWidth),;
yOffsPrn + Int(yScale * pnHeight),;
0,0,pnWidth,pnHeight,;
lpBitsArray,@lcBInfo,DIB_RGB_COLORS,SRCCOPY)
= EndPage(hPrnDC)
= EndDoc(hPrnDC)
ENDIF
*-退出時釋放系統資源。
= GlobalFree(lpBitsArray)
=刪除對象(hMemBmp)
= DeleteDC(hMemDC)
= DeleteDC(hPrnDC)
= ReleaseDC(hwnd,hFormDC)
返回
過程getWinRect (lnHwnd,lnWidth,lnHeight)
*-返回帶有指定句柄的窗口的寬度和高度。
#定義maxDword 4294967295 & amp& amp0xffffffff
本地lpRect、lnLeft、lnTop、lnRight、lnBottom
lpRect = REPLI (Chr(0),16)
= GetWindowRect (lnHwnd,@lpRect)
lnRight = buf 2d word(SUBSTR(lpRect,9,4))
ln bottom = buf 2d word(SUBSTR(lpRect,13,4))
lnLeft = buf2dword(SUBSTR(lpRect,1,4))
如果lnLeft & gtlnRight
lnLeft = lnLeft - maxDword
ENDIF
lnTop = buf2dword(SUBSTR(lpRect,5,4))
如果lnTop & gtlnBottom
lnTop = lnTop - maxDword
ENDIF
lnWidth = lnRight - lnLeft
ln height = ln bottom-in top
返回
函數getDefaultPrnDC
*返回默認打印機的設備上下文
#DEFINE PD_RETURNDC 256
# DEFINE PD _ return default 1024
局部結構,標記
ln flags = PD _ return default+PD _ return DC
*填充PRINTDLG結構
LC struct = num 2 dword(66)+Repli(Chr(0),16)+;
num2dword(lnFlags) + Repli(Chr(0),42)
IF print DLG(@ LC struct)& lt;& gt0
返回buf2dword (SUBSTR(lcStruct,17,4))
ENDIF
返回0
函數InitBitmapInfo(hTargetDC)
#定義BI_RGB 0
# DEFINE RGBQUAD _ SIZE 4 & amp& ampRGBQUAD
#定義BHDR _ SIZE 40 & amp& ampBITMAPINFOHEADER
本地lnRgbQuadSize、lcRgbQuad、lcBIHdr
*使用打印機的BitPerPixel值
lnBitsPerPixel = 24
*初始化BitmapInfoHeader結構
lcBIHdr = num 2 dword(BHDR _ SIZE)+;
num 2 dword(pn width)+num 2 dword(pn height)+;
num 2 word(1)+num 2 word(lnBitsPerPixel)+;
num2dword(BI_RGB) + Repli(Chr(0),20)
*為顏色表創建緩沖區
如果lnBitsPerPixel & lt= 8
lnrgbquadsize =(2^lnbitsperpixel)* rgbquad _ size
lcRgbQuad = Repli(Chr(0),lnRgbQuadSize)
其他
lcRgbQuad = " "
ENDIF
返回lcBIHdr + lcRgbQuad
InitBitsArray()過程
#定義GMEM _固定0
本地lnPtr,lnAllocSize
*確保該值是DWORD對齊的
lnBytesPerScan = Int((pn width * lnBitsPerPixel)/8)
IF Mod(lnBytesPerScan,4)& lt;& gt0
lnBytesPerScan = lnBytesPerScan+4-Mod(lnBytesPerScan,4)
ENDIF
lnAllocSize = pn height * lnBytesPerScan
lnPtr = global alloc(GMEM _固定,lnAllocSize)
= ZeroMemory (lnPtr,lnAllocSize)
返回輸入
函數num2word (lnvalue)
RETURN Chr(MOD(m.lnvalue,256)) + CHR(INT(m.lnvalue/256))
函數num2dword (lnvalue)
#定義m0 256
#定義m1 65536
#定義m2 16777216
本地b0,b1,b2,b3
b3 = Int(lnvalue/m2)
B2 = Int((ln value-B3 * m2)/m 1)
b 1 = Int((ln value-B3 * m2-B2 * m 1)/m0)
b0 = Mod(lnvalue,m0)
返回Chr(B0)+Chr(b 1)+Chr(B2)+Chr(B3)
函數buf2word (lcBuffer)
返回Asc(SUBSTR(lcBuffer,1,1))+;
Asc(SUBSTR(lcBuffer,2,1)) * 256
函數buf2dword (lcBuffer)
返回Asc(SUBSTR(lcBuffer,1,1))+;
Asc(SUBSTR(lcBuffer,2,1))* 256+;
Asc(SUBSTR(lcBuffer,3,1))* 65536+;
Asc(SUBSTR(lcBuffer,4,1)) * 16777216
程序decl & amp& amp他們中的許多人在這裏聲明
在user32中聲明整數GetFocus
在gdi32整數hdc中聲明整數EndDoc
在user32 INTEGER hwnd中聲明整數GetWindowDC
在gdi32 INTEGER hObject中聲明INTEGER DeleteObject
在gdi32 INTEGER hdc中聲明INTEGER CreateCompatibleDC
在user32 INTEGER hwnd,INTEGER hdc中聲明整數ReleaseDC
在user32 INTEGER hwnd中聲明INTEGER GetWindowRect,STRING @lpRect
在kernel32 INTEGER wFlags,INTEGER dwBytes中聲明INTEGER GlobalAlloc
在gdi32中聲明整數GetDeviceCaps INTEGER hdc,INTEGER nIndex
在gdi32 INTEGER hdc,INTEGER hObject中聲明INTEGER SelectObject
在gdi32 INTEGER hdc中聲明整數StartDoc,STRING @ lpdi
在kernel32 INTEGER hMem中聲明整數GlobalFree
在comdlg32 STRING @ lppd中聲明整數PrintDlg
在gdi32整數hdc中聲明整數DeleteDC
在gdi32整數hdc中聲明整數起始頁
在gdi32整數hdc中聲明整數結束頁
將kernel32中的RtlZeroMemory聲明為ZeroMemory
整數目標,整數數字字節
在gdi32中聲明整數CreateCompatibleBitmap
整數hdc,整數nWidth,整數nHeight
在gdi32中聲明整數BitBlt
整數hDestDC,整數x,整數y,;
INTEGER nWidth,INTEGER nHeight,INTEGER hSrcDC,;
整數xSrc,整數ySrc,整數dwRop
在gdi32中聲明整數StretchDIBits
整數hdc,整數XDest,整數YDest,;
INTEGER nDestWidth,INTEGER nDestHeight,INTEGER XSrc,;
整數YSrc,整數nSrcWidth,整數nSrcHeight,;
整數lpBits,STRING @lpBitsInfo,;
整數用法
在gdi32中聲明整數GetDIBits
整數hdc,整數hbmp,整數uStartScan,;
INTEGER cScanLines,INTEGER lpvBits,STRING @lpbi,;
整數用法
返回& amp& amp偏差
▲可以控制表單中的打印區域嗎?
●
當然可以。只需調整下面代碼的左、上、寬、高,比如下面的代碼打印整個表單。
*-將位圖數據從屏幕復制到虛擬設備。
= BitBlt (hMemDC,0,0,pnWidth,pnHeight,hFormDC,0,0,SRCCOPY)
= SelectObject(hMemDC,hSavedBitmap)
下面的代碼只打印了窗體中間區域的壹部分。
*-將位圖數據從屏幕復制到虛擬設備。
= BitBlt (hMemDC,-30,-30,pnWidth+60,pnHeight+60,hFormDC,0,0,SRCCOPY)
= SelectObject(hMemDC,hSavedBitmap)