Page 1 of 2

QR en portapapeles

Posted: Sat Feb 08, 2025 3:50 pm
by FiveWiDi
Hola a todos,

¿Ustedes sabrían como hacer para generar un código QR, y dejarlo en el portapapeles para luego en otra aplicación realizar un 'pegar'?

Muchas gracias,

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 5:01 pm
by Antonio Linares
Carlos,

Aqui tenemos un muy buen ejemplo de QR de César:
viewtopic.php?p=276837#p276837

y luego seria cuestión de usar FW_CopyToClipboard( ... ) proporcionandole la imagen del QR.

nos falta ese paso... pensando...

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 5:28 pm
by Cgallegoa
Tocayo,

Code: Select all | Expand

#include "FiveWin.ch"

REQUEST FWZEBRA    // *** Indispensable para dibujar código QR

Function Inicio()
   LOCAL oDlg, hBmp
   LOCAL cTxt4QR := "Prueba de Copy - Paste" + CRLF + "FiveWin 2025" 

   hBmp := FW_BarCodeBmp( cTxt4QR, "QRCODE", 250, 250 )
   hBmp := bmp2alpha( hBmp )   // *** Sin esta línea QRcode tiene un feo marco negro
 // *** Siguiente línea hace la magia y guarda en el portapapeles, luego,
 // *** puedes hacer PASTE (Ctrl+V) en Paint, PhotoShop, Word,  etc., y recuperas tu código QR
   FW_CopyToClipboard(hBmp)
   
   DEFINE DIALOG oDlg SIZE 400,300 PIXEL TRUEPIXEL
        @ 20,20 XIMAGE oImg SIZE -20,-20 OF oDlg PIXEL RESOURCE hBmp
   ACTIVATE DIALOG oDlg CENTERED
return nil
//-----------------------------------------------------------------------//

Function bmp2alpha( hBmp1 )
   local hBmp, oBmp
   oBmp  := GdiBmp():New()
   oBmp:CreateFromRes( hBmp1, 0 )
   oBmp:Conver24to32Alpha( .F. )
   hBmp  := oBmp:GetGDIHbitmap()
   oBmp:Set32Bits(.F.)
   oBmp:Destroy()
   DeleteObject( hBmp1 )
return hBmp
//------------------------------------------------------------------------------//

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 5:36 pm
by FiveWiDi
Antonio Linares wrote: Sat Feb 08, 2025 5:01 pm Carlos,

Aqui tenemos un muy buen ejemplo de QR de César:
viewtopic.php?p=276837#p276837

y luego seria cuestión de usar FW_CopyToClipboard( ... ) proporcionandole la imagen del QR.

nos falta ese paso... pensando...
Si, si. En el documento ya lo consigo imprimir, la intención es disponer de él en el clipboard.

Estoy mirando esto:
hBitmap := FW_BarCodeBmp( cText, "QR-CODE", 3.5, 3.5, Nil )
SetClipboardData( 2, hBitmap )
FW_CopyToClipBoard( cText )
FW_CopyToClipBoard( hBitmap, 2 )

Pero no me funciona, al menos en el Word no consigo que 'pegue' el Qr. (el cText sin problema).

A ver que se te ocurre.

Muchas gracias,

EDITADO
=======

FW_BarCodeBmp( cText, "QR-CODE", 3.5, 3.5, Nil ) creo que debía ser FW_BarCodeBmp( cText, "QRCODE", 3.5, 3.5, Nil )

Por otra parte, las unidades de FW_BarCodeBmp( cText, "QRCODE", 3.5, 3.5, Nil ), son pixels, pulgadas, centímetros?

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 5:52 pm
by FiveWiDi
Vamos bien!!!!

Por otra parte, las unidades de FW_BarCodeBmp( cText, "QRCODE", 3.5, 3.5, Nil ), son pixels, pulgadas, centímetros?

Me ha creado un QR que no parece correcto, desde el móvil no lo identifica.
Lo he 'pagado' en el Word, le he impreso y nada, que no le gusta.

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 6:17 pm
by sysctrl2
el tamaño estandard de un QR es 4.0
FW_BarCodeBmp( cText, "QR-CODE", 4.0, 4.0, Nil )

prueba hacerlo asi o mas grande

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 6:28 pm
by FiveWiDi
sysctrl2 wrote: Sat Feb 08, 2025 6:17 pm el tamaño estandard de un QR es 4.0
FW_BarCodeBmp( cText, "QR-CODE", 4.0, 4.0, Nil )

prueba hacerlo asi o mas grande
És para Verifactu, nos permiten entre 3 y 4 cm., lo voy a poner a 3,5cm.

He visto que CGallego utiliza 250,250 además de QRCODE.

FW_BarCodeBmp( cText, "QR-CODE", 3500, 350, Nil )
El QR mide 9,5 cm. aproximadamente, he probado con 129,129 y 'pagado' en un Word a DIN A4 mide 3,5 cm; para mi el tamaño correcto.

Ahora bien, me dibuja el marco negro y el lector no lo identifica como un QR válido.

Mi función es esta:

// Para usar QR precisa de "REQUEST FWZEBRA"
REQUEST FWZEBRA

FUNCTION VFQr2Clipboard( AMPAARRA, cNIF, cVFCODFAC, dDataFact, nImpotota )

Local cText := ""
Local hBitmap := 0

cText := VF_URL_QR( AMPAARRA, ;
AllTrim( cNIF ), ;
AllTrim( cVFCODFAC ), ;
dDataFact, ;
nImpoTota ;
)

Traza( 1, "cText=", cText )

MsgInfo( cText, "B" )

hBitmap := FW_BarCodeBmp( cText, "QRCODE", 129, 129, Nil )

hBitmap := bmp2alpha( hBitmap )

FW_CopyToClipBoard( hBitmap )

Return Nil
/* *********************************************************************************** */]

EDITO
=====
Da igual que use "QR-CODE" que "QRCODE"

EDITO-2
======
Y no necesita REQUEST FWZEBRA.

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 6:57 pm
by FiveWiDi
He cortado con las tijeras el marco negro y el QR es correcto.

Venderé el soft con un kit de tijeras para QR.
:D :D :D

Y todo es digital, el soft digital, las tijeras con los dedos (digital). :wink:

Venga, que alguien me eche una mano. :oops:

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 7:38 pm
by Cgallegoa
Parece que es un bug en FW_CopyToClipboard()

Otra opción es con oImg:bPainted. Hace el copy sin el feo marco

Code: Select all | Expand

#include "FiveWin.ch"

REQUEST FWZEBRA    // *** Indispensable para dibujar código QR

Function Inicio()
   LOCAL oDlg, hBmp
   LOCAL cTxt4QR := "Prueba de Copy - Paste" + CRLF + "FiveWin 2025" 

   hBmp := FW_BarCodeBmp( cTxt4QR, "QRCODE", 250, 250 )
   hBmp := bmp2alpha( hBmp )   // *** Sin esta línea QRcode tiene un feo marco negro
 // *** Siguiente línea hace la magia y guarda en el portapapeles, luego,
 // *** puedes hacer PASTE (Ctrl+V) en Paint, PhotoShop, Word,  etc., y recuperas tu código QR
 //  FW_CopyToClipboard(hBmp)    // *** También genera marco negro al hacer paste.
   
   DEFINE DIALOG oDlg SIZE 400,350 PIXEL TRUEPIXEL
        @ 03,20 BUTTON oBtn PROMPT "Copy" OF oDlg PIXEL SIZE 80,25 ACTION oImg:CopytoClipBoard(.T.)  

        @ 40,20 XIMAGE oImg SIZE -20,-20 OF oDlg PIXEL RESOURCE hBmp
        oImg:bPainted := {||oImg:CopytoClipBoard(.T.)}   // *** Hace el paste correcto, sin el cuadro negro.

   ACTIVATE DIALOG oDlg CENTERED
return nil
//-----------------------------------------------------------------------//

Function bmp2alpha( hBmp1 )
   local hBmp, oBmp
   oBmp  := GdiBmp():New()
   oBmp:CreateFromRes( hBmp1, 0 )
   oBmp:Conver24to32Alpha( .F. )
   hBmp  := oBmp:GetGDIHbitmap()
   oBmp:Set32Bits(.F.)
   oBmp:Destroy()
   DeleteObject( hBmp1 )
return hBmp
//------------------------------------------------------------------------------//
Ya no hace falta que incluyas las tijeras :)

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 8:16 pm
by FiveWiDi
Ostras!! :|

El caso es que no lo muestro en pantalla.

Voy a investigar XIMAGE a ver que hace.

Y anulo el pedido a Amazon de las 35698 tijeras que he pedido.

Supongo que si Antonio nos lee quizás resuelva el bug de FW_CopyToClipboard()

Muchas gracias por el interés.
Sigo investigando.

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 8:49 pm
by Antonio Linares
Carlos,

Has probado asi ?

FW_BarCodeBmp( cText, "QRCODE", 129, 129, Nil, CLR_WHITE )

No encuentro el código de Bmp2Alpha(), donde está ? :)

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 9:13 pm
by FiveWiDi
Antonio Linares wrote: Sat Feb 08, 2025 8:49 pm Carlos,

Has probado asi ?

FW_BarCodeBmp( cText, "QRCODE", 129, 129, Nil, CLR_WHITE )

No encuentro el código de Bmp2Alpha(), donde está ? :)
Sigue apareciendo el marco negro alrededor. QR no identificable.

Function bmp2alpha( hBmp1 )
local hBmp, oBmp
oBmp := GdiBmp():New()
oBmp:CreateFromRes( hBmp1, 0 )
oBmp:Conver24to32Alpha( .F. )
hBmp := oBmp:GetGDIHbitmap()
oBmp:Set32Bits(.F.)
oBmp:Destroy()
DeleteObject( hBmp1 )
return hBmp

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 9:35 pm
by Antonio Linares
Carlos,

Estoy probando asi pero desde el mspaint al pegar se ve todo en negro:

Code: Select all | Expand

#include "FiveWin.ch"

function Main()

   FW_CopyToClipBoard( bmp2Alpha( FW_BarCodeBmp( "Hola", "QRCODE", 400.0, 400.0 ) ) )

return nil

Function bmp2alpha( hBmp1 )
   local hBmp, oBmp
   oBmp := GdiBmp():New()
   oBmp:CreateFromRes( hBmp1, 0 )
   oBmp:Conver24to32Alpha( .F. )
   hBmp := oBmp:GetGDIHbitmap()
   oBmp:Set32Bits(.F.)
   oBmp:Destroy()
   DeleteObject( hBmp1 )
   return hBmp

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 10:07 pm
by FiveWiDi
Antonio Linares wrote: Sat Feb 08, 2025 9:35 pm Carlos,

Estoy probando asi pero desde el mspaint al pegar se ve todo en negro:

Code: Select all | Expand

#include "FiveWin.ch"

function Main()

   FW_CopyToClipBoard( bmp2Alpha( FW_BarCodeBmp( "Hola", "QRCODE", 400.0, 400.0 ) ) )

return nil

Function bmp2alpha( hBmp1 )
   local hBmp, oBmp
   oBmp := GdiBmp():New()
   oBmp:CreateFromRes( hBmp1, 0 )
   oBmp:Conver24to32Alpha( .F. )
   hBmp := oBmp:GetGDIHbitmap()
   oBmp:Set32Bits(.F.)
   oBmp:Destroy()
   DeleteObject( hBmp1 )
   return hBmp
Precisamente lo que comentaba Carlos Gallego.
Al parecer antes sin la función bmp2alpha() se veía negro (eso está anotado en el código de ejemplo que ha publicado).
De ahí el uso de la función bmp2alpha(), para que no se viera todo en negro.

Yo incluso estaba pensando en crear un DIALOG, meterle el QR, usar métodos de la clase WINDOW y ver si se puede capturar; vamos una solución parecida que ha encontrado Carlos Gallego ante el error que se da ahora.
Pero yo crearía el DIALOG, le meto el QR, lo capturo y cierro DIALOG.
Al menos tendré respuesta al problema aunque no me guste mucho. De momento todo es teoría, es sólo una idea.
A ver mañana como me levanto y sigo con ello.

Muchas gracias,

Re: QR en portapapeles

Posted: Sat Feb 08, 2025 10:24 pm
by Antonio Linares
Le consulto a Rao, el implementó estas funciones