TPanel > TBitmap

91 views
Skip to first unread message

Rodrigo de Carvalho

unread,
Mar 14, 2014, 2:30:36 PM3/14/14
to dug...@googlegroups.com

Boa tarde pessoal

 

Estou com a seguinte situação:

- Possuo um TPanel, com vários outros TPanel com várias informações, e preciso salvar tudo isto em uma única imagem (TBitmap);

 

Estou dando uma garimpada no oraculo (google) porem os exemplos não estão dando muito certo, pois ele salva apenas o Panel inicial, que está vazio, pois as informações estão espalhadas em outros TPanel (criados dentro do principal).

 

Alguem já fez algo parecido que possa me dar uma dica, exemplo, luz, fumaça, alguma coisa?

 

Obrigado.

 

 

Samuel N. Junior

unread,
Mar 14, 2014, 2:39:03 PM3/14/14
to dug...@googlegroups.com
Rodrigo,

Eu tenho uma rotina que transforma a janela ativa ou toda a tela em um BMP e acho que pode ser facilmente modificada se na parte onde define as coordenadas de início/final você somar/subtrair as coordenadas/tamanho do TPanel em questão:

procedure ScreenShot(var OurImage:TBitmap; Apenas_Janela: Boolean = True);
var
  DCPuffer, DC: HDC;
  Puffer: HBitmap;
  x, y, ini_x, ini_y, fim_x, fim_y: integer;
begin
  DC:=CreateDC('DISPLAY', nil, nil, nil);
  x:=screen.Width;
  y:=screen.Height;
  if Apenas_Janela then Begin
     ini_x:=Screen.ActiveForm.Left;
     ini_y:=Screen.ActiveForm.Top;
     fim_x:=Screen.ActiveForm.Width;
     fim_y:=Screen.ActiveForm.Height;
  End Else Begin
     ini_x:=0;
     ini_y:=0;
     fim_x:=x;
     fim_y:=y;
  End;
  DCPuffer:=CreateCompatibleDC(DC);
  Puffer:=CreateCompatibleBitmap(DC, x, y);
  SelectObject(DCPuffer,Puffer);
  BitBlt(DCPuffer, 0, 0, x, y, dc, 0, 0, srccopy);
  OurImage.Width:=x;
  OurImage.Height:=y;
  BitBlt(OurImage.canvas.Handle, 0, 0, fim_x, fim_y, DCPuffer, ini_x, ini_y, srcCopy);
  OurImage.Width:=fim_x;
  OurImage.Height:=fim_y;
  DeleteDC(DCPuffer);
  DeleteDC(DC);
end;


[ ]s

Samuel
--
--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
 
Twitter: @dugrs
http://www.facebook.com/groups/dugrs/
http://www.Vimeo.com/dugrs

---
You received this message because you are subscribed to the Google Groups "DUG-RS - Delphi Users Group Rio Grande do Sul" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dug-rs+un...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Rodrigo de Carvalho

unread,
Mar 14, 2014, 3:08:45 PM3/14/14
to dug...@googlegroups.com

Samuel,

 

Obrigado pelo exemplo mas não me ajudou, pois ele captura a tela toda do Windows, pra fazer os cálculos é bem complexo, pois o TPanel está dentro de vários componentes da janela ativa, e para ajudar, eu utilizo 2 monitores, então a posição é muito relativa.

 

Abraço

Samuel N. Junior

unread,
Mar 14, 2014, 3:15:53 PM3/14/14
to dug...@googlegroups.com
Rodrigo,

Mas é muito fácil adaptar a rotina.

Dentro do formulário você tem as coordenadas de início/final do TPanel, então é só somar isso no código que captura a janela.

Seria algo como:

:
ini_x:=Screen.ActiveForm.Left + Panel1.Left ;
ini_y:=Screen.ActiveForm.Top + Panel1.Top;
fim_x:=Panel1.Width ;
fim_y:=Panel1.Height;
:

Talvez onde você soma o tamanho do Panel1 (variáveis ini_x e ini_y) tenha que adicionar alguns 'pixels' para desconsiderar a largura da moldura da janela.

[ ]s

Samuel

Rodrigo de Carvalho

unread,
Mar 14, 2014, 3:36:16 PM3/14/14
to dug...@googlegroups.com

Samuel

 

Fiz da seguinte forma

 

    ini_x := Screen.ActiveForm.Left + Application.MainForm.ActiveMDIChild.Left + PageControl.Left + Panel.Left;

    ini_y := Screen.ActiveForm.Top  + Application.MainForm.ActiveMDIChild.Top  + PageControl.Top  + Panel.Top;

    fim_x := Panel.Width;

    fim_y := Panel.Height;

 

Se a aplicação está no monitor principal, salva a imagem antes do Panel ainda.

Se a aplicação está no monitor secundário, salva a imagem da mesma posição referente ao 1 monitor, não considerando a aplicação.

Rodrigo de Carvalho

unread,
Mar 14, 2014, 3:41:04 PM3/14/14
to dug...@googlegroups.com

(Tema de vitória do Senna)

 

Samuel

 

Fiz outro ajuste e teste, e obtive sucesso.

 

Utilizo o mesmo código que você me passou, alterei apenas isto:

De:

                DC:= CreateDC('DISPLAY', nil, nil, nil);

Para:

                DC:= GetDC(Panel.Handle);

 

E as posições são:

    ini_x := 0;

    ini_y := 0;

    fim_x := Panel.Width;

    fim_y := Panel.Height;

 

Samuel N. Junior

unread,
Mar 14, 2014, 3:56:51 PM3/14/14
to dug...@googlegroups.com
Rodrigo,

Que bom que funcionou, mas aqui está uma solução bem mais simples para o que você precisa:

Procedure PainelToBitmap(Painel : TWinControl; var bmp : TBitmap);
begin
  bmp.Width := Painel.ClientWidth;
  bmp.Height := Painel.ClientHeight;
  bmp.Canvas.Lock;
  try
    Painel.PaintTo(bmp.Canvas.Handle, 0, 0);
  finally
    bmp.Canvas.Unlock;
  end;
end;


Veja o exemplo de uso no anexo (no Delphi XE).

[ ]s

Samuel


Em 14/03/2014 16:41, Rodrigo de Carvalho escreveu:
Painel.zip

Rodrigo de Carvalho

unread,
Mar 14, 2014, 4:10:50 PM3/14/14
to dug...@googlegroups.com

Infelizmente este código pra minha situação não funciona.

 

Já havia testado essa opção, porém sem setar o tamanho da imagem e fazendo o lock.

Com essas propriedades funciona em partes, mas não me exibe os detalhes dos demais paneis.

 

Eu possuo vários gráficos na tela (Chart), com essa função, aparece apenas algumas linhas dos gráficos, mas eles não aparecem por completo.

Mas com o seu outro exemplo funcionou.

 

Muito obrigado pela ajuda e disponibilidade.

 

Abraço

 

De: dug...@googlegroups.com [mailto:dug...@googlegroups.com] Em nome de Samuel N. Junior
Enviada em: sexta-feira, 14 de março de 2014 16:57
Para: dug...@googlegroups.com
Assunto: Re: [dug-rs] TPanel > TBitmap

 

Rodrigo,

--

Samuel N. Junior

unread,
Mar 14, 2014, 4:19:23 PM3/14/14
to dug...@googlegroups.com
Estranho,

Eu testei aqui e os gráficos do Teechart forem reproduzidos corretamente (veja o anexo).

Mas, se a outra rotina resolveu, então está tudo certo.

[ ]s


Samuel
Painel.zip
TESTE_bmp.zip
Reply all
Reply to author
Forward
0 new messages