Page 1 of 1
Quien me puede aclarar esta Duda IMPRIMIR MAS De Una Pagina
Posted: Sat Mar 09, 2019 12:08 am
by remtec
Amigos
Disculpen mi ignorancia.
Algun amigo me puede explicar lo que significa este Código que esta en Testrtf5.prg, en la función " function PrintBox( lPreview,oRTF ) ":
Code: Select all
oPrn:Box( aRTF[ 2 ], 500, aRTF[ 2 ] + 1000, 1500 )
aRTF := REPrintBox5( oRTF:hWnd, If( lPreview, oPrn:hDCOut, oPrn:hDC ), ;
oRTF:IsSelection(), ;
aRTF[ 2 ] + 10, 510, 1490, aRTF[ 2 ] + 990, aRTF[ 1 ] )
Que representa lo siguiente:
hWnd = ??
aRTF[ 2 ] = ??
IsSelection() = ??
hDCOut = ??
hDC = ??
Desde ya muchas gracias por su ayuda
Saludos
Antonio
Re: Quien me puede aclarar esta Duda.
Posted: Sat Mar 09, 2019 12:44 am
by carlos vargas
Esto es por experiencia no es por que me lo explicaran, asi que puedo estar equivocado
hWnd
en windows todos los controles son ventanas, cada una con sus propias características las cuales les permite al sistema saber que hacer con ellas, en fwh la clase windows es la madres de las ventanas, dialogos, ventanas mdi, ventanas child, todos los controles, ya sean nativos o no, es en la data hWnd donde se almacena el valor de la estructura que define a ese control o ventana.
ejemplo:
Code: Select all
if ! Empty( oWnd:hWnd )
::Create( CTRL_CLASS )
::SendMsg( WM_SETFONT, ::oFont:hFont, 0 )
::Default()
oWnd:AddControl( Self )
else
oWnd:DefControl( Self )
endif
....
::hWnd = CreateWindowExW( cClsName, ::cCaption, ::nStyle, ;
::nLeft, ::nTop, ::nRight - ::nLeft + 1, ;
::nBottom - ::nTop + 1, ;
If( ::oWnd != nil, ::oWnd:hWnd, 0 ), ;
::nId,, ::nExStyle )
oWnd:hWnd,oDlg:hWnd,oButton:hWnd,oXbrowse:hWnd... oRichedit:hWnd
IsSelection()
Me imagino que es una data de la clase que nos permite saber si hay un bloque de texto seleccionado o no.
Code: Select all
METHOD IsSelection() CLASS TRichEdit
local aGetSel := ::GetSelection()
return aGetSel[ 1 ] != aGetSel[ 2 ]
...
METHOD GetSelection() CLASS TRichEdit
local nStart := 0
local nEnd := 0
REGetSelection( ::hWnd, @nStart, @nEnd )
return { nStart, nEnd }
hDC
es un dispositivo de contexto, es como un área de la ventana a control de la cual se puede extraer informacion de lo que contiene, como por ejemplo un texto, un color o similar.
aca por ejemplo se dibuja una elipse en esa area (es como un lienzo)
Code: Select all
METHOD Circle( nRow, nCol, nWidth ) CLASS TWindow
::GetDC()
Ellipse( ::hDC, nCol, nRow, nCol + nWidth - 1, nRow + nWidth - 1 )
::ReleaseDC()
return nil
hDCOut
lo mismo de lo anterior pero para efectuar acciones similares.
aRTF[ 2 ]
me parece que esto imprimir el texto contenido en el control trichedit5 en el area que definamos con hDC
Code: Select all
METHOD PrintBox( hDC, nTop, nLeft, nRight, nBottom, nFrom ) CLASS TRichEdit5
DEFAULT nFrom := 0
if hDC != 0
nFrom := REPrintBox5( ::hWnd, hDC, ::IsSelection(), ;
nTop, nLeft, nRight, nBottom, nFrom )
endif
return nFrom
Re: Quien me puede aclarar esta Duda.
Posted: Sat Mar 09, 2019 1:36 am
by remtec
Hola Carlos
Muchas gracias por tu explicación, la verdad que hice unas pruebas aplicando lo que entendi, pero no logro dar con la solucion.
Muchos Saludos.
Antonio.
Re: Quien me puede aclarar esta Duda.
Posted: Sat Mar 09, 2019 2:49 am
by cnavarro
Antonio, pon un pequeño ejemplo con un control rtf que contenga un texto enriquecido y un boton de "imprimir", y podemos trabajar sobre él
Como muy bien te ha explicado Carlos,
// Definimos las coordenadas ( en unidades de impresora ), del box ( rectángulo ) que se va a pintar en la impresora ( o en la pantalla si lo mandas a Preview )
oPrn:Box( aRTF[ 2 ], 500, aRTF[ 2 ] + 1000, 1500 )
// hWnd -> identificador de la ventana ( area ) del control, cada control, diálog o ventana tiene un hWnd que lo representa
Es una data de cada control, y se genera de forma automática al crear el control. Tú solo necesitas usarla.
// Para estos dos: mira esto ->
https://docs.microsoft.com/en-us/window ... user-getdc
// hDCOut: si es a pantalla
// hDC: si es a impresora
// IsSelection: si hay texto seleccionado o no
aRTF := REPrintBox5( oRTF:hWnd, If( lPreview, oPrn:hDCOut, oPrn:hDC ), ;
oRTF:IsSelection(), ;
aRTF[ 2 ] + 10, 510, 1490, aRTF[ 2 ] + 990, aRTF[ 1 ] )
Re: Quien me puede aclarar esta Duda.
Posted: Sat Mar 09, 2019 4:06 pm
by remtec
Hola Cesar
Muchas gracias por tu tiempo y tremenda explicación.
Gran Maestro, con tu Ayuda y la de Carlos, he logrado entender, muchas gracias a ambos por su dedicación.
Muchos Saludos.
Antonio
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 12:44 pm
by remtec
Hola Cesar.
Como estas?
Una consulta sobre la exaplicacion.
Todo lo demas bastante claro, pero no entendi cual es la variable que trae el texto a imprimir, " oRTF:IsSelection "?
Muchos saludos
Antonio
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 12:59 pm
by cnavarro
Antonio,
Si te refieres a mi explicación, mi nombre es Cristobal, y si utilizas la function REPrintBox, no necesitas conocer la data que contiene el texto, ya que la function se ocupa de extraer el texto del control
De todas formas puedes intentar conocer el texto del control con el método oRtf:cText()
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 2:11 pm
by remtec
Cristobal
Que tremendo ERROR, mil disculpas por haberme equivocado en tu nombre, me quede con una consulta que hice en otro Post mas abajo, sobre un codigo que me facilito Cesar. Reitero mis disculpas.
Si mi pregunta era para ti, muy agradecido por todo lo que haces y todo el tiempo que destinas a ayudarnos.
Mi duda viene de usar esta Function para pasarle una variable con contenido enriquesido y mandar a imprimir directo a la impresora.
Muchos Saludos.
Antonio.
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 3:20 pm
by cnavarro
remtec wrote:Cristobal
Mi duda viene de usar esta Function para pasarle una variable con contenido enriquesido y mandar a imprimir directo a la impresora.
Como te dije antes, esa function se ocupa de todo
si utilizas la function REPrintBox, no necesitas conocer la data que contiene el texto, ya que la function se ocupa de extraer el texto del control
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 3:24 pm
by remtec
Cristobal
Mil gracias por tu ayuda y mil disculpas por molestar tanto.
Lo que no he podido hacer funcionar que desde el Boton "#8034", vaya a imprimir el contenido cd la variable cTxt a la Function Printbox().
Muhos Saludos
Antonio
Codigo de Prueba Origen Texto Enriquecido:
Code: Select all
#include "FiveWin.ch"
function Main()
local oDlg, oRich
local hRichDLL := LoadLibrary( "riched20.dll" )
local lSyntaxHL := .f.
local tbl[3][4] , cName1
Static cTxt := ""
use exa2
go top
cTxt=exa2->cod_det
closearea()
DEFINE DIALOG oDlg RESOURCE "#100"
oRich = TRichEdit():Redefine( 100, bSETGET( cTxt ), oDlg )
oRich:SetText( cTxt )
REDEFINE BTNBMP ID 153 Resource "GRABA" OF oDlg TOOLTIP "Graba Informe" TRANSPARENT ADJUST 2007;
ACTION (cTxt := oRich:SaveAsRTF(),Graba(cTxt))
REDEFINE BTNBMP ID 4012 Resource "#8034" OF oDlg TOOLTIP "Imprime Informe" TRANSPARENT ADJUST 2007;
ACTION .................
REDEFINE BTNBMP ID 152 Resource "#8004" OF oDlg TOOLTIP "Volver a Lista de Pacientes" TRANSPARENT ADJUST 2007;
ACTION (oDlg:END())
ACTIVATE DIALOG oDlg CENTERED ; //
ON INIT ( oRich:LoadRtf( cTxt ), oRich:PostMsg( WM_KEYDOWN, VK_HOME, 0 ) ) ; //oRich:SetText( cTxt ) ; //
VALID ( cTxt := oRich:SaveAsRTF(), .T. ) // oRich:GetText(), .T. )
FreeLibrary( hRichDLL )
Return nil
Function PrintBox()
Code: Select all
function PrintBox( lPreview )
local oPrn
local aRTF := { 100, 1000 } // { nFrom, nTop }
//DEFAULT lPreview := .f.
if lPreview
PRINT oPrn NAME "FWH RICHEDIT FILE" PREVIEW
else
PRINT oPrn NAME "FWH RICHEDIT FILE"
endif
if Empty( oPrn:hDC )
MsgStop( "Printer not ready!" )
return nil
endif
PAGE
CursorWait()
oPrn:Box( aRTF[ 2 ], 500, aRTF[ 2 ] + 1000, 1500 )
aRTF := REPrintBox5( oRTF:hWnd, If( lPreview, oPrn:hDCOut, oPrn:hDC ), ;
oRTF:IsSelection(), ;
aRTF[ 2 ] + 10, 510, 1490, aRTF[ 2 ] + 990, aRTF[ 1 ] )
CursorArrow()
ENDPAGE
ENDPRINT
return nil
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 7:25 pm
by cnavarro
Prueba esto
Code: Select all
#include "FiveWin.ch"
#include "richedi5.ch"
//----------------------------------------------------------------------------//
function Main()
local oDlg
local oRich
//local hRichDLL := LoadLibrary( "riched20.dll" )
local lSyntaxHL := .f.
local cTxt := ""
local uVal
FWSetLanguage( 2 )
USE RTFCODE
GO TOP
cTxt += rtfcode->memcode
CLOSE
//? cTxt
// Simulo la lectura del contenido del campo
//cTxt := "{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Microsoft Sans Serif;}{\f1\fnil\fcharset0 Microsoft Sans Serif;}}" + ;
// "{\colortbl ;\red128\green0\blue0;\red0\green0\blue0;\red0\green128\blue0;\red255\green0\blue0;}" + ;
// "\viewkind4\uc1\pard\cf1\b\i\f0\fs28 JH\cf2\b0\i0 - Sue let me \cf3 know\cf2 that their rep had noticed that they were not performing the yearly \cf4\ul\b\fs24 escrow\cf2\ulnone\b0\fs28 analysis.\cf0\f1\fs17\par" + ;
// "}"
DEFINE DIALOG oDlg RESOURCE "Test"
oDlg:lHelpIcon := .F.
REDEFINE BUTTON ID 110 ;
ACTION ( oRich:SetText( cTxt ) )
REDEFINE CHECKBOX lSyntaxHL ID 115 OF oDlg ;
ON CHANGE ( oRich:lHighLight := lSyntaxHL, ;
oRich:SetText( oRich:GetText() ) )
REDEFINE BUTTON ID 120 ;
ACTION oRich:LoadFromRTFFile( cGetFile( "RTF file (*.rtf) | *.rtf" ) )
REDEFINE BUTTON ID 130 ;
ACTION oRich:SaveToRTFFile( cGetFile( "RTF file (*.rtf) | *.rtf",;
"Please write a filename", "test" ) )
REDEFINE BUTTON ID 998 ACTION PrintBox( oRich, .T. )
//( oRich:GoToLine( 10 ), oRich:SetFocus() )
oRich := TRichEdit5():Redefine( 100, bSETGET( cTxt ), oDlg )
//oRich:lHighLight = .T.
ACTIVATE DIALOG oDlg CENTERED ; //
ON INIT ( oRich:LoadRtf( cTxt ), oRich:PostMsg( WM_KEYDOWN, VK_HOME, 0 ) ) ; //oRich:SetText( cTxt ) ; //
VALID ( cTxt := oRich:SaveAsRTF(), .T. ) // oRich:GetText(), .T. )
//MemoEdit( cTxt )
//MemoEdit( uVal )
//XBrowse( hb_aTokens( uVal ) )
//FreeLibrary( hRichDLL )
return nil
//----------------------------------------------------------------------------//
function PrintBox( oRtf, lPreview )
local oPrn
local aRTF := { 100, 1500 } // { nFrom, nTop }
DEFAULT lPreview := .f. // if .T., to screen
if lPreview
PRINT oPrn NAME "FWH RICHEDIT FILE" PREVIEW
else
PRINT oPrn NAME "FWH RICHEDIT FILE"
endif
if Empty( oPrn:hDC )
MsgStop( "Printer not ready!" )
return nil
endif
PAGE
CursorWait()
oPrn:Box( aRTF[ 1 ] + 10, 90, aRtf[ 2 ] + 1000, aRTF[ 1 ] + 1010 )
/*
nFrom := REPrintBox5( ::hWnd, hDC, ::IsSelection(), ;
nTop, nLeft, nRight, nBottom, nFrom )
// El ultimo parámetro indica a partir de qué número de carácter dentro del texto quieres empezar a imprimir.
*/
aRTF := REPrintBox5( oRTF:hWnd, If( lPreview, oPrn:hDCOut, oPrn:hDC ), ;
oRTF:IsSelection(), ;
aRTF[ 1 ] + 20, 110, aRTF[ 1 ] + 1000, aRtf[ 2 ] + 990, 0 )
CursorArrow()
ENDPAGE
ENDPRINT
return nil
//----------------------------------------------------------------------------//
Necesitas el RC
Code: Select all
#include "winapi.ch"
#define IDC_EDIT1 101
Test DIALOG 41, 64, 409, 199
STYLE DS_MODALFRAME | 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Testing the RichEdit control"
FONT 8, "MS Sans Serif"
{
// CONTROL "", 100, "RichEdit20A", 4100 | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 6, 12, 398, 163
CONTROL "", 100, "RichEdit50W", 4100 | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 6, 12, 398, 163
PUSHBUTTON "&Load text file", 110, 5, 179, 50, 16
CHECKBOX "Activate syntax highlight", 115, 65, 182, 92, 11, BS_AUTOCHECKBOX | WS_TABSTOP
PUSHBUTTON "L&oad RTF file", 120, 162, 179, 50, 16
PUSHBUTTON "&Save RTF file", 130, 226, 179, 50, 16
PUSHBUTTON "&End", IDCANCEL, 290, 179, 50, 16
PUSHBUTTON "&Print", 998, 354, 179, 50, 16
}
Re: Quien me puede aclarar esta Duda.
Posted: Mon Mar 11, 2019 9:32 pm
by remtec
Hola Cristobal.
Muchas gracias por tu ayuda.
Use tu ejemplo, hice algunos ajustes en el ancho de la pagina, se logro imprimir, el problema es que solo obtengo 1 pagina, no logro que imprima las demás paginas, en mi caso, son 4 paginas.
Asi es que sigo luchando, cada vez con menos tiempo para la entrega.
Muchos Saludos.
Antonio