當前位置:星座運勢大全官網 - 八字算命 - 如何打印vf表格

如何打印vf表格

直接在VFP打印表格內容。

*-程序名:直接打印表單內容-*

*-以位圖形式打印窗口內容-*

*-程序作者:未知,由源論壇轉載-*

*-用法:您可以以-*的形式執行程序

*示例:表單中的命令-*

*按下按鈕執行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)