Carlos,
Gracias por tus aclaraciones. Aqui van mis conclusiones:
1.- ::CmSay() -> Realiza el cálculo de coordenadas usando la funcion Cmtr2Pix() posicionando en las coordenadas exactas, independientemente de la impresora usada y en consecuencia del offset de esta. A excepcion de todo lo que se imprime por debajo del offset, es decir, en este pequeño ejemplo:
- Code: Select all Expand view
// Printing in portrait and in landscape
#include "fivewin.ch"
#define PAD_LEFT 0
#define PAD_RIGHT 1
#define PAD_CENTER 2
function Main()
local oPrn, oFont, oPen, nrow, ncol
Local nLinI, nColI, nLinF, nColF
PRINT oPrn NAME "Impresión en Vertical.." PREVIEW
DEFINE FONT oFont NAME "Arial" SIZE 0, -10 BOLD OF oPrn
DEFINE PEN oPen WIDTH 2 OF oPrn
oPrn:SetPage(9) // A4
oPrn:SetPortrait() //Vertical
PAGE
// Parece Correcto, si lo tomamos como base en 0, 0. Realmente se produce desplazamiento poruqe fisicamente no se imprime en 0,0
oPrn:cmSay( 0, 0, "::CmSay() Superior Izquierda ( 0, 0)" , oFont,,CLR_BLACK,,PAD_LEFT )
// Parece Incorrecto en relacion al primer CmSay(0,0) si lo tomamos como origen y correcto respecto al borde de la hoja
oPrn:cmSay( 10, 10, "::CmSay() (10,10)" , oFont,,CLR_BLACK,,PAD_LEFT )
// Parece Incorrecto en relacion al primer CmSay(0,0) y correcto respecto al borde de la hoja
oPrn:cmSay( 28, 20, "::CmSay() Inferior Derecha (28,20)" , oFont,,CLR_BLACK,,PAD_RIGHT )
ENDPAGE
ENDPRINT
return nil
En este ejemplo, el segundo y tercer CMSay() se imprimem en la posicion correcta en coordenadas fisicas, pero si tomamos el primer CmSay en (0,0) veremos como realmente no hay la distancia correcta. Es decir, que el primer CmSay() tendra distintas "distancias" con los otros CmSay() en funcion de la impresora.
2.- Si usamos por ejemplo la funcion ::ImportWMF(), se imprime a partir del desplazamiento. Que quiere decir esto ? Si yo tomo como origen 0,0 el desplazamiento de X e Y, y todas las funciones de Impresion SAY, BOX, ... las calculo en funcion del Offset, cuadra toda la impresion independientemente de la impresora. Es cierto que una imprimira todo partir del punto (100,100) y otra a partir del (150,120), pero todo sera en relacion a este punto de origen.
3.- Para experimentarlo, he creado un archivo emf, con un rectangulo que ocupa toda la hoja. Entiendo q este rectangulo va desde la parte superior izquierda (0,0) hasta la inferior derecha. Si imprimo este EMF y realizo el posicionamiento de coordenadas a partir del offset (como el EMF), se imprime todo correctamente independientemente del tipo de impresora.
- Code: Select all Expand view
// Printing in portrait and in landscape
#include "fivewin.ch"
#define PAD_LEFT 0
#define PAD_RIGHT 1
#define PAD_CENTER 2
function Main()
local oPrn, oFont, oPen
Local nLinI, nColI, nLinF, nColF
PRINT oPrn NAME "Impresión en Vertical.." PREVIEW
DEFINE FONT oFont NAME "Arial" SIZE 0, -10 BOLD OF oPrn
DEFINE PEN oPen WIDTH 2 OF oPrn
oPrn:SetPage(9) // A4
oPrn:SetPortrait() //Vertical
PAGE
oPrn:ImportWMF( 'test.emf' )
nLinF := 0
nColF := 0
nLinF := Max( 0, ( nLinF * 10 * oPrn:nVertRes() / oPrn:nVertSize() ) )
nColF := Max( 0, ( nColF * 10 * oPrn:nHorzRes() / oPrn:nHorzSize() ) )
oPrn:Say( nLinF, nColF, "Say() Superior Izquierda (0,0)", oFont,,CLR_BLACK,,PAD_LEFT )
nLinF := 28
nColF := 20
nLinF := Max( 0, ( nLinF * 10 * oPrn:nVertRes() / oPrn:nVertSize() ) )
nColF := Max( 0, ( nColF * 10 * oPrn:nHorzRes() / oPrn:nHorzSize() ) )
oPrn:Say( nLinF, nColF, "Say() Inferior Derecha (0,0)", oFont,,CLR_BLACK,,PAD_RIGHT )
ENDPAGE
ENDPRINT
return nil
Como lo veis ?