Cómo imprimir un formulario vf
*-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) p>
*-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 ),; p>
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 p>
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 p>
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))+; p >
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) p>