Constellation Knowledge Network - Preguntas y respuestas sobre Bagua - Cómo imprimir un formulario vf

Cómo imprimir un formulario vf

Imprima el contenido de la tabla directamente en VFP.

*-Nombre del programa: Imprimir el contenido del formulario directamente-*

*-Imprimir el contenido de la ventana en forma de mapa de bits-*

*-Autor del programa: Desconocido, reimpreso del foro fuente -*

*-Uso: Puede ejecutar el programa en forma de -*

*Ejemplo: Comando en forma -*

* Ejecute el doprintform al presionar el botón. PRG-*

*-Definir constante

#Definir LOGPIXELSX 88

#Definir LOGPIXELSY 90

#Definir desplazamiento físico X 112

#Definir desplazamiento físico 113

#Definir SRCCOPY 13369376

#Definir DIB_RGB_COLORS 0

*-Llame a este subproceso de segmento de programa en .

Hacer decl

*-Definir variables

Privado pnWidth, pnHeight, lnBitsPerPixel, lnBytesPerScan

Almacenar 0 en pnWidth, pnHeight, lnBitsPerPixel , lnBytesPerScan

Hwnd local, hFormDC, hPrnDC, hMemDC, hMemBmp, hSavedBitmap

xOffsPrn, yOffsPrn, xScale, yScale, lcDocInfo, lcBInfo, lpBitsArray

* - Obtenga el desplazamiento de coordenadas del dispositivo de impresión.

HPR NDC = getDefaultPrnDC()& no realiza ninguna comprobación de errores.

xOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETX)

yOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETY)

*-Obtiene el identificador de ventana de la pantalla, así como su ancho, alto, etc.

hwnd = GetFocus()&& Ventana con foco de teclado

hFormDC = GetWindowDC(hwnd)

= getWinRect(hwnd, @pnWidth, @pnHeight)

*-Obtiene el valor de escala según la pantalla y la impresora.

xScale = GetDeviceCaps(hPrnDC, LOGPIXELSX)/GetDeviceCaps(hFormDC, LOGPIXELSX)

yScale = GetDeviceCaps(hPrnDC, LOGPIXELSY)/GetDeviceCaps(hFormDC, LOGPIXELSY)

* - Crea contenido de pantalla como datos de imagen de mapa de bits.

hme MDC = CreateCompatibleDC(hFormDC)

hme mbmp = CreateCompatibleBitmap(hFormDC, pnWidth, pnHeight)

hSavedBitmap = seleccionar objeto(hme MDC, hMemBmp)

*: copia datos de mapa de bits de la pantalla al dispositivo virtual.

= BitBlt (hMemDC, 0, 0, pnWidth, pnHeight, hFormDC, 0, 0, SRCCOPY)

= SelectObject (hMemDC, hSavedBitmap)

* Recuperar bits de un mapa de bits compatible en un búfer

* Como mapa de bits independiente del dispositivo (DIB) con un valor BitsPerPixel

* Como uno de los contextos del dispositivo de impresora

p >

lcBInfo = InitBitmapInfo(hPrnDC)

lpBitsArray = InitBitsArray()

= GetDIBits (hMemDC, hMemBmp, 0, pnHeight,;

lpBitsArray, @lcBInfo, DIB_RGB_COLORS)

lcDocInfo = Chr(20) + Repli(Chr(0), 19)& estructura ampDOCINFO - 20 bytes

IF StartDoc(hPrnDC, @lcDocInfo )> ;0

=PáginaInicio(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

* - Libera recursos del sistema al salir.

= GlobalFree(lpBitsArray)

=Eliminar objeto (hMemBmp)

= DeleteDC(hMemDC)

= DeleteDC(hPrnDC)

= ReleaseDC(hwnd, hFormDC)

Retorno

Procedimiento getWinRect (lnHwnd, lnWidth, lnHeight)

*-Retorno con el especificado Maneja el ancho y alto de la ventana.

#Define maxDword 4294967295 & amp& amp0xffffffff

Local lpRect, lnLeft, lnTop, lnRight, lnBottom

lpRect = REPLI (Chr(0), 16)

= GetWindowRect (lnHwnd, @lpRect)

lnRight = buf palabra 2d(SUBSTR(lpRect, 9, 4))

ln bottom = buf palabra 2d( SUBSTR(lpRect, 13, 4))

lnLeft = buf2dword(SUBSTR(lpRect, 1, 4))

Si lnLeft & gtlnRight

lnLeft = lnLeft - maxDword

ENDIF

lnTop = buf2dword(SUBSTR(lpRect, 5, 4))

If lnTop & gtlnBottom

lnTop = lnTop - maxDword

ENDIF

lnWidth = lnRight - lnLeft

ln height = ln de abajo hacia arriba

Regresar

Función getDefaultPrnDC

*Devuelve el contexto del dispositivo de la impresora predeterminada

#DEFINE PD_RETURNDC 256

# DEFINE PD _ return default 1024

Estructura local, flags

ln flags = PD _ return default+PD _ return DC

*Rellenar la estructura PRINTDLG

LC struct = num 2 dword(66 )+Repli(Chr(0), 16)+;

num2dword(lnFlags) + Repli(Chr(0), 42)

IF print DLG(@ LC struct)& lt; & gt0

Devuelve buf2dword (SUBSTR(lcStruct, 17, 4))

ENDIF

Devuelve 0

Función InitBitmapInfo( hTargetDC)

#Definir BI_RGB 0

# DEFINIR RGBQUAD _ TAMAÑO 4 & amp& ampRGBQUAD

#Definir BHDR _ TAMAÑO 40 & amp& ampBITMAPINFOHEADER

Local lnRgbQuadSize, lcRgbQuad, lcBIHdr

*Usa el valor BitPerPixel de la impresora

lnBitsPerPixel = 24

*Inicializa la estructura BitmapInfoHeader

lcBIHdr = num 2 dword(BHDR _ TAMAÑO)+;

num 2 dword(pn ancho)+num 2 dword(pn alto)+;

num 2 palabra( 1)+num 2 word(lnBitsPerPixel)+;

num2dword(BI_RGB) + Repli(Chr(0), 20)

*Crear un buffer para la tabla de colores

Si lnBitsPerPixel & lt= 8

lnrgbquadsize =(2^lnbitsperpixel)* rgbquad _ size

lcRgbQuad = Repli(Chr(0), lnRgbQuadSize)

Otro

lcRgbQuad = " "

ENDIF

Devolver lcBIHdr + lcRgbQuad

Proceso InitBitsArray()

#Define GMEM _Fixed 0

LnPtr nativo, lnAllocSize

* Asegúrese de que el valor esté alineado con DWORD

lnBytesPerScan = Int((ancho de pn * lnBitsPerPixel) /8)

IF Mod(lnBytesPerScan, 4)<& gt0

lnBytesPerScan = lnBytesPerScan+4-Mod(lnBytesPerScan, 4)

ENDIF

lnAllocSize = pn altura * lnBytesPerScan

lnPtr = global alloc(GMEM_fixed, lnAllocSize)

= ZeroMemory (lnPtr, lnAllocSize)

Devolver entrada

Función num2palabra (lnvalue)

RETURN Chr(MOD(m.lnvalue, 256)) + CHR(INT(m.lnvalue/256))

Función num2dword (lnvalue)

#define m0 256

#define m1 65536

#define m2 16777216

Local b0, b1, b2 , b3

b3 = Int(lnvalor/m2)

B2 = Int((ln valor-B3 * m2)/m 1)

b 1 = Int((ln valor-B3 * m2-B2 * m 1)/m0)

b0 = Mod(lnvalor, m0)

Regresar Chr(B0)+Chr(b 1 )+Chr(B2)+Chr(B3)

Función buf2word (lcBuffer)

Devuelve Asc(SUBSTR(lcBuffer, 1, 1))+;

Asc(SUBSTR(lcBuffer, 2, 1)) * 256

Función buf2dword (lcBuffer)

Devuelve Asc(SUBSTR(lcBuffer, 1, 1))+;

Asc(SUBSTR(lcBuffer, 2, 1))* 256+

Asc(SUBSTR(lcBuffer, 3, 1))* 65536+; ( SUBSTR(lcBuffer, 4, 1)) * 16777216

Programa decl & amp& ampmuchos de ellos declarados aquí

Declaración de número entero GetFocus en usuario32

Declarar número entero EndDoc en gdi32 integer hdc

Declarar entero GetWindowDC en user32 INTEGER hwnd

Declarar INTEGER DeleteObject en gdi32 INTEGER hObject

Declarar en gdi32 INTEGER hdc Declarar INTEGER en CreateCompatibleDC

Declarar entero ReleaseDC en usuario32 INTEGER hwnd, INTEGER hdc

Declarar INTEGER en usuario32 INTEGER hwnd GetWindowRect, STRING @lpRect

En kernel32 INTEGER wFlags, INTEGER dwBytes declarados en INTEGER GlobalAlloc

Entero GetDeviceCaps declarado en gdi32 INTEGER hdc, INTEGER nIndex

INTEGER SelectObject declarado en gdi32 INTEGER hdc, INTEGER hObject

Declarar entero StartDoc en gdi32 INTEGER hdc , STRING @ lpdi

Declarar entero GlobalFree en kernel32 INTEGER hMem

Declarar entero PrintDlg en comdlg32 STRING@lppd

Declarar entero DeleteDC en gdi32 entero hdc

Declarar página de inicio entera en gdi32 integer hdc

Declarar página final entera en gdi32 integer hdc

Declarar RtlZeroMemory en kernel32 como ZeroMemory

Destino entero, byte numérico entero

Declarar entero CreateCompatibleBitmap en gdi32

Entero hdc, entero nWidth, entero nHeight

Declarar entero BitBlt en gdi32

Entero hDestDC, entero x, entero y,;

INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;

Entero xSrc, entero ySrc, entero dwRop

Declarar entero StretchDIBits en gdi32

Entero hdc, entero XDest, entero YDest,;

INTEGER nDestWidth, INTEGER nDestHeight, INTEGER XSrc,;

Entero YSrc, entero nSrcWidth, entero nSrcHeight,;

Entero lpBits, STRING @lpBitsInfo,;

Uso de enteros

Declarar entero GetDIBits en gdi32

Entero hdc, entero hbmp, entero uStartScan,;

INTEGER cScanLines, INTEGER lpvBits, STRING @lpbi,;

p>

Uso de enteros

Retorno & amp& amp desviación

▲¿Se puede controlar el área de impresión en el formulario?

Por supuesto. Simplemente ajuste la izquierda, la parte superior, el ancho y la altura del código a continuación. Por ejemplo, el código a continuación imprime el formulario completo.

* - Copia datos de mapa de bits de la pantalla al dispositivo virtual.

= BitBlt (hMemDC, 0, 0, pnWidth, pnHeight, hFormDC, 0, 0, SRCCOPY)

= SelectObject (hMemDC, hSavedBitmap)

Abajo El código solo imprime parte del área central del formulario.

* - Copia datos de mapa de bits de la pantalla al dispositivo virtual.

= BitBlt (hMemDC, -30, -30, pnWidth+60, pnHeight+60, hFormDC, 0, 0, SRCCOPY)

= SelectObject(hMemDC, hSavedBitmap)

上篇: 下篇: ¿Cómo gana QQ Lottery Assistant?
Artículos populares