GetFormImage - Bordas

Delphi

02/07/2015

Bom dia.

Estou utilizando o seguinte código para pegar a imagem do form e depois mandá-la por email:
procedure PegaImgForm(MeuForm: TForm; CaminhoArquivo: String);
var
   Anexo: TJPEGImage;
begin
   Anexo := TJPEGImage.Create;
   Anexo.Assign(MeuForm.GetFormImage);
   Anexo.SaveToFile(CaminhoArquivo);
   FreeAndNil(anexo);
end;


Acontece que ele salva a imagem do Form, mas ignora as "bordas" da Janela do Windows.

Tem como eu corrigir isso?
Diego Martins

Diego Martins

Curtidas 0

Melhor post

Dorivan Sousa

Dorivan Sousa

02/07/2015

nao serveria capturar toda a area de trabalho? tem q ser somente o formulario?

coloca uma imagem de como ta capturando e como vc gostaria q ficasse.
GOSTEI 1

Mais Respostas

Diego Martins

Diego Martins

02/07/2015

Segue abaixo as imagens de cada função
[img:descricao=Função Form.GetFormImage]http://arquivo.devmedia.com.br/forum/imagem/415780-20150702-132403.png[/img]

[img:descricao=Atalho Alt+PrintScreen do Windows (Esse que eu quero)]http://arquivo.devmedia.com.br/forum/imagem/415780-20150702-132440.png[/img]

Obrigado pela ajuda.
GOSTEI 0
Diego Martins

Diego Martins

02/07/2015

Obs: Queria igual a segunda Imagem.
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

02/07/2015

eu ate tentei aqui mas nao achei como fazer pra pegar so a tela... o que eu ja faço na minha aplicacao é capturar toda a area de trabalho

function CapturaTela: TBitmap;
var
  dc : hdc;
  cv: TCanvas;
begin
  Result := TBitmap.Create;
  Result.Width := Screen.Width;
  Result.Height := Screen.Height;
  dc := GetDc(0);
  cv := TCanvas.Create;
  cv.Handle := DC;
  Result.Canvas.CopyRect( Rect( 0 , 0 , Screen.Width , Screen.Height),cv,rect(0 , 0 , Screen.Width , Screen.Height));
  cv.Free;
  ReleaseDc( 0 , DC);
end;


se tivesse como cortar da imagem so a parte onde ta o formulario
teria q testar nessa parte, pegando a posicao do formulario na tela.
  Result.Canvas.CopyRect( Rect( 0 , 0 , Screen.Width , Screen.Height),cv,rect(0 , 0 , Screen.Width , Screen.Height));
GOSTEI 1
Diego Martins

Diego Martins

02/07/2015

Consegui fazer :D

Troquei a linha 9 do seu código por:
dc := GetWindowDC(Formulario.Handle);


e a linha 12 por:
Result.Canvas.CopyRect( Rect( 0 , 0 , Formulario.Width , Formulario.Height),cv,rect(0 , 0 , Formulario.Width , Formulario.Height));


O único problema dessa função é quando tento executar por tarefa agendada, pois normalmente o micro fica em "Logoff" e ele não cria na tela os formulários.
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

02/07/2015

o getFormImage funciona mesmo com a tela de logoff?

se funcionar olha o codigo dela e tenta adptar
function TCustomForm.GetFormImage: TBitmap;
var
  Ofs: Integer;
begin
  Result := TBitmap.Create;
  try
    Result.Width := ClientWidth;
    Result.Height := ClientHeight;
    Result.Canvas.Brush := Brush;
    Result.Canvas.FillRect(ClientRect);
    Result.Canvas.Lock;
    try
      if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
        Ofs := -1  // Don't draw form border
      else
        Ofs := 0;  // There is no border
      PaintTo(Result.Canvas.Handle, Ofs, Ofs);
    finally
      Result.Canvas.Unlock;
    end;
  except
    Result.Free;
    raise;
  end;
end;
GOSTEI 1
POSTAR