Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Convertir un form junto con sus controles en una imagen (https://www.clubdelphi.com/foros/showthread.php?t=44097)

Pernorak 28-05-2007 20:37:02

Convertir un form junto con sus controles en una imagen
 
Hola me preguntaba si es posible convertir una form junto con los controles que en ella se encuentran: TLabel, TEdit, ... etc.. en una imagen, de manera que en esa imagen tengamos la "foto" de la Form.

¿Se puede generalizar para cualquier control? Es decir, se puede tener la imagen (Bitmap ó similar) de un control cualquiera.

1 Saludo.

roman 28-05-2007 21:17:22

Que tal algo así:

Código Delphi [-]
procedure SaveControlImage(Control: TWinControl; FileName: TFileName);
var
  DC: HDC;
  Bitmap: TBitmap;

begin
  Bitmap := TBitmap.Create;

  try
    Bitmap.Width := Control.Width;
    Bitmap.Height := Control.Height;

    DC := GetWindowDC(Control.Handle);
    BitBlt(Bitmap.Canvas.Handle, 0, 0, Control.Width, Control.Height, DC, 0, 0, SRCCOPY);
    ReleaseDC(Control.Handle, DC);

    Bitmap.SaveToFile(FileName);
  finally
    Bitmap.Free;
  end;
end;

// Saludos

Pernorak 29-05-2007 14:25:06

Hola roman, ante todo gracias por la idea que me has proporcionado, me ha abierto un camino nuevo sobre el que trabajar, por desgracia al estar en Delphi y yo usar Builder C++, hay cosas que no sirven. Voy a abrir otro hilo, mostrando una adaptación que he hecho de tu código para la creación de una aplicación que lo que hace es copiar la imagen de una form en un bitmap y pegarla como imagen en un nueva form.

Si tb le das al Builder C++ y me puedes ayudar sería genial.
1 Saludo. ;)

Pernorak 29-05-2007 20:30:26

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.

roman 29-05-2007 20:35:05

Cita:

Empezado por Pernorak
:( 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.

Pues yo lo he probado en Delphi y funciona bien, ya sea capturando todo el formulario o sólo el RichEdit :confused:

// Saludos

Pernorak 29-05-2007 20:57:13

Hola roman, debe de ser porque yo estoy usando el Clipboard, y tu usas el Handle de Windows... ¡Tiene que ser eso! :eek: .. uff, el problema es que yo no sé usar el Handle.. y no encuentro la método equivalente a BitBlt(...) para Builder. Asi como el método equivalente a GetWindowDC

¿Algún buen samaritano que sepa que método en Builder realiza la misma operación que la función BitBlt() y que GetWindowDC en Delphi?

BiBlt() al parecer copia en el Canvas.Handle del Bitmap el contenido del control cuyo DC se le pasa com parámetro, ¿Que obtiene exactamente GetWindowDC?, es decir que significa DC. No entiendo muy bien la filosofia del Handle con las imágenes..


:rolleyes: mmm..se que estoy cerca, a ver si me pueden ayudar a despegar

roman 29-05-2007 21:25:51

BitBly y GetWindowDC no son funciones de Delphi, sino de la AI de Windows, de manera que deben servir igual en BC. GetWindowDC obtiene un Dispositivo de Contexto, que es donde las funciones de Windows pueden dibujar. A diferencia de GetDC, GetWindowDC obtiene un dispositivo de contexto para toda la ventana incluyendo las barras de título y de desplazamiento. GetDC sólo sirve para el área cliente.

// Saludos

Pernorak 30-05-2007 12:37:52

:) Hola roman, ¡Por fin lo he conseguido! Efectivamente, el código no distaba mucho de lo que tu me comentabas, las funciones
BitBlt(...), GetWindowDC(...) y ReleaseDC(...) funcionan igual para el Builder. Así que por fin he podido obtener la imagen del Expediente completa incluyendo el dichoso texto de los controles RichEdit. La he imprimido y sale todo, todito, todo :D :D

Me falta hacer una serie de ajustes y poco más..uff por fin puedo seguir trabajando con el proyecto.
¡¡Muchiiiisiiiimas Gracias roman!! Si aqui se pudiera votar las respuestas te pondría un 10 ;)


La franja horaria es GMT +2. Ahora son las 16:15:49.

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