Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Imagen de portapapeles a QRImage (https://www.clubdelphi.com/foros/showthread.php?t=91314)

Angel.Matilla 29-12-2016 12:09:19

Imagen de portapapeles a QRImage
 
Tengo este código:
Código:

void __fastcall TfPersona::PerFicClick(TObject *Sender)
{
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    HDC hdcSrc = GetWindowDC(this->Handle);

    pBitmap->Width  = this->Width;
    pBitmap->Height = this->Height;
    BitBlt(pBitmap->Canvas->Handle, 0, 0, pBitmap->Width, pBitmap->Height, hdcSrc, 0, 0, SRCCOPY);
    Clipboard()->Assign(pBitmap);

    ReleaseDC(this->Handle, hdcSrc);

    if (Clipboard()->HasFormat(CF_BITMAP))
    {
          Application->CreateForm(__classid(TfFicPer), &fFicPer);

          Clipboard()->Open();
          pBitmap->LoadFromClipboardFormat(CF_BITMAP, Clipboard()->GetAsHandle(CF_BITMAP), 0);
          Clipboard()->Close();

          fFicPer->QRImage2->Picture->Assign(pBitmap);
          cReportTitle = "FICHA PERSONAL " + Nombre->Text + " " + Apellidos->Text;
          fFicPer->qFicPer->Preview();
          delete fFicPer;
    }
    delete pBitmap;
    this->SetFocus();
}

para volcar un copia de pantalla en un QucikReport a través del portapapeles. He comprobado que en el mismo sí está la imagen pero al hacer el Preview me sale el formulario en blanco. ¿Alguna idea?

ecfisa 30-12-2016 07:08:29

Hola.

Probe tu código y funciona de forma correcta, solo lo modifiqué un poco para darle reusabilidad:
Código PHP:

...
#include<clipbrd.hpp>
...

void WinCtrlToClipboard( TWinControl *wCtrl )
{
  
TClipboard *cb = Clipboard();
  
Graphics::TBitmap *bmp = new Graphics::TBitmap;
  
HDC hdc = GetWindowDC( wCtrl->Handle );

  
bmp->Width  = wCtrl->Width;
  
bmp->Height = wCtrl->Height;
  
BitBlt( bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, hdc, 0, 0, SRCCOPY );
  
cb->Assign( bmp );

  
ReleaseDC( wCtrl->Handle, hdc );
  
delete bmp;
} 

Ejemplo de uso:
Código PHP:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

  if ( 
fFicPer == NULL ) 
    
fFicPer = new TfFicPer( NULL );
  
Graphics::TBitmap *dest = fFicPer->QRImage1->Picture->Bitmap;

  
WinCtrlToClipboard( this );
  
dest->LoadFromClipboardFormat( CF_BITMAP, Clipboard()->GetAsHandle(CF_BITMAP), 0 );
  
fFicPer->qFicPer->Preview();

  
delete fFicPer;
  
fFicPer = NULL;
} 

Form:


Preview:


Declaré el parámetro de modo que la función pueda recibir cualquier descendiente de TWinControl, de modo que las siguientes llamadas tambien son correctas:
Código PHP:

  WinCtrlToClipboard( Panel1 );
  ...
  
WinCtrlToClipboard( Edit3 );
  ... 
  
WinCtrlToClipboard( Button1 );
  ... 

Saludos :)


La franja horaria es GMT +2. Ahora son las 04:13:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi