Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ayuda para completar código:Traducción de Delphi a Builder (https://www.clubdelphi.com/foros/showthread.php?t=44134)

Pernorak 29-05-2007 14:40:42

Ayuda para completar código:Traducción de Delphi a Builder
 
Hola tengo el siguiente código que lo que hace es:
1º) copiar la imagen de la ficha Form1 en un componente Bitmap y
2º) pega dicha imagen en la ficha Form2

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Creamos el componente Bitmap
Graphics::TBitmap *BitmpPrueba = new Graphics::TBitmap(); //Bitmap := TBitmap.Create;
//Copiamos la imagen de la Form en un Bitmap
CopyControlImage(Form1, BitmpPrueba); //Tb se podría poner Screen->ActiveForm
//Dibujamos el Bitmap en una nueva form
Form2->Canvas->Draw(0,0,BitmpPrueba);
//La mostramos
Form2->Show();

delete BitmpPrueba;
}

- Aqui está el código del Procedimiento que copia la imagen de la Form1 a un Bitmap:

//DESCRIPICION: Se pretende capturar en un BitMap un control cualquiera que se le pasa como parámetro.
void TForm1::CopyControlImage(TWinControl *Control,
Graphics::TBitmap * BitmpPrueba){
HDC DC; //Pasar de Delphi a Builder C++ --> esto para que sirve???
//Ajustamos las dimensiones del bitmap BitmpPrueba a las del Control
BitmpPrueba->Width = Control->Width;
BitmpPrueba->Height = Control->Height;
//Copia de la imagen de la Form en el control Bitmap BitmpPrueba
//--------------------------------------------------------------------
Pasar de Delphi a Builder C++ estas instrucciones
DC.GetWindowDC(Control->Handle);
BitBlt(BitmpPrueba->Canvas->Handle, 0, 0, Control->Width, Control->Height, DC, 0, 0, SRCCOPY);
ReleaseDC(Control->Handle, DC);

//--------------------------------------------------------------------
}

- Lo que no sé es como realizar la copia de la imagen de la Form1 al Bitmap, este código al parecer lo puede hacer, pero está en Delphi. Si alguien sabe un equivalente a este código para Builder C++ le estaría muy agradecido.
1 Saludo.:o

seoane 29-05-2007 14:45:35

En principio veo un error de copia:
Código:

DC.GetWindowDC(Control->Handle);
Cuando debería ser:
Código:

DC=GetWindowDC(Control->Handle);

Pernorak 29-05-2007 20:28:59

Ya lo he conseguido. Aqui dejo el código que permite obtener una imagen de una form y pegarla en otra form dentro de un control TImage:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Obtenemos la imagen de la Form1
Graphics::TBitmap *BitmpPrueba = Form1->GetFormImage();

//Pegamos el Bitmap en una nueva form a través del Clipboard
Clipboard()->Assign(BitmpPrueba);
Form2->ImgForm1->Picture->Assign(Clipboard());
//La mostramos
Form2->Show();

delete BitmpPrueba;
}

Todo esto lo hace al pulsar un botón que hay en la Form1, en la Form2 he colocado un TImage que ocupa todo el área de la Form, cuando pulsas el botón en la Form1, aparece la Form2 igual, en apariencia que la Form1, pero sus controles no se pueden usar, ya que son una foto.

:( De todas maneras sigue sin servirme para imprimir mi Expediente, porque misteriosamente, el texto d los RichEdit no aparece, si el del resto de controles... a pesar de que se supone que es una captura de la imagen de la form.

;) Gracias a todos los que han colaborado.
Si a alguien se le ocurre como hacer que aparezca el texto de un RichEdit al hacer una imagen de la Form soy todo ojos.

1 Saludo.

Pernorak 30-05-2007 12:45:16

He aqui la traducción a Builder del código:

void TForm1::SaveControlImage(TWinControl *Control, AnsiString FileName){
//Creamos el componente Bitmap HDC DC; //Para manejar el Handle
Graphics::TBitmap *BitmpPrueba = new Graphics::TBitmap(); //Bitmap := TBitmap.Create;

try{
BitmpPrueba->Width = Control->Width;
BitmpPrueba->Height = Control->Height;


DC = GetWindowDC(Control->Handle); //ASi muestra toda la ventana
BitBlt(BitmpPrueba->Canvas->Handle, 0, 0, Control->Width, Control->Height, DC, 0, 0, SRCCOPY);
ReleaseDC(Control->Handle, DC); //para que devuelva el control al programa
BitmpPrueba->SaveToFile(FileName);
}
__finally{
delete BitmpPrueba;
}

}


Como pueden ver es practicamente igual a como se haría en Delphi.Con este código pueden obtener la imagen de cualquier ventana, ó control que se le pase como parámetro. Muy útil a la hora de imprimir el texto de un RichEdit, creanme. (Gracias roman ;) )


La franja horaria es GMT +2. Ahora son las 17:05:02.

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