2010-07-06 5 views
8

양식 (Delphi 2007)을 이미지로 클립 보드에 복사하여 사용자가 볼 수있는 내용을 단어 문서에 붙여 넣어야합니다. 클립 보드 부분은 실제로 문제가되지 않습니다. 질문은 양식에 대한 비트 맵을 얻는 방법입니다.양식을 이미지로 클립 보드에 복사하는 방법

검색 옵션이 여러 개 나타났습니다.

이러한 옵션에는 모두 다른 문제가있는 것 같습니다. 내가 찾던 대부분의 정보는 시대에 뒤진 것 같습니다. 나는 선택의 폭을 넓히기 위해 다른 옵션을 충분히 비교할만한 좋은 소스가 될 수 없다. 함께 가기위한 조언.

나는 이것들을 내 양식에서 시험해 보았습니다. 그리고 그것들은 모두 정상적으로 작동하는 것처럼 보입니다. 나는 문제가되는 것을 피하려고합니다. 해결 방법에 대한 조언이 있습니까?

업데이트 : GetFormImage의 잠재적 문제점은 무엇입니까?
Andreas는 GetFormImage에서 문제가 무엇인지 질문했습니다. 바라기는 더 이상 아무것도 아니에요, 그 대답은 내가 얻으려고하는 것의 일부입니다. 내 검색 결과의 많은 부분이 GetFormImage를 사용하여 창의적인 대안을 제시하고있는 것 같다. 나는 해답이 조금 더 명확 해 지길 바랬다.

GetFormImage는 몇 가지 문제가 있었지만 지금은 사용하지 않을 이유가 없습니다라고 많은 투표를 한 답변에 정말 만족할 것입니다. :-)

GetFormImage의 실제 문제에 관해서. 일부 사용자에게는 양식에 표시되는 부분 만 이미지에 표시됩니다 (예 : 숨겨진 창이나 겹쳐진 창을 캡처 할 수 없음). 내 양식이 모두 보이기 때문에 그것은 저에게 정말로 문제가되지 않습니다.

1) 더 큰 문제는 양식의 컨트롤에서 필요한 특정 지원을 처리합니다. Delphi 4 Fixes and Known issues page 목록에이 항목이 있습니다 ("다음으로 지연됨"으로 표시됨).

지역 : :이 해결 보여준 QC 항목을 찾을 수 없습니다 VCL \ 핵심 VCL 클래스

참조 번호 : 1088 (발행 : 12/16/98)
상태 :
다음에 이연 보고 REL 날짜 : 8/6/98 심각도 : 일반적으로 발생했습니다 유형 : 기본
기능 장애 문제 :

문제 등 콤보, 같은 GetFormImage 가장 둥지 윈도우 컨트롤이다가 빈 그려집니다.

2) 또한 DevExpress 컨트롤을 사용하고 있습니다.한 번에 그들의 컨트롤 (2006 년 말에 고정) did not support the PaintTo GetFormImage가 사용중인 메시지. 이것은 내가 사용하고있는 DevExpress 릴리스에서 수정되었지만 다른 문제가 제기되었는데, 다른 컨트롤을 사용하면 제대로 작동하지 않을 수 있습니다.

3) 최근 (2010) post on the Embarcadero Groups입니다. 사용자가 GetFormImage를 사용하는 데 어려움을 겪고있었습니다. 여기서 GetFormImage는 화면에 표시된 그래프의 일부가 최종 이미지에 나타나지 않았습니다. 그들은 또한 (내가하지 않는) 양식 캡션이 필요했고 Canvas.CopyRect 접근 방식을 취했습니다 outlined in this post.

4) 다음은 TExcellentImagePrinter 페이지의 견적입니다. 필요한 경우 제품을 구매하는 데 아무런 문제가 없습니다. 2002 년에 마지막으로 업데이트 된 구성 요소가 있습니다 (델파이 2007 평가판이 있습니다). 나는 정말로 그 방향으로 갈 필요가 있는지 알 수 없다.

GetFormImage 또는 Form.Print를 사용해 볼 수 있습니다. 콤보 상자 을 양식에 내려 놓은 다음 GetFormImage 또는 Form.Print를 호출하십시오. 의 출력물이 인 경우 ComboBox에 텍스트가 표시됩니까? 아니? 다른 사람도 마찬가지입니까 else! VCL을 인쇄 할 때 발생하는 문제는 의 작은 예일뿐입니다.

" 양식을 인쇄하는 더 좋은 방법"인 볼랜드의 TI-3155를 사용해 볼 수도 있습니다. 나는 틈새 측정으로 볼랜드에서 볼랜드에서 근무할 때 TI에 썼습니다. 콤보 상자 텍스트를 인쇄하는 동안 많은 프린터에서 이 실패하고 사용자가의 크기를 조정하면 전체 양식을 인쇄 할 수없고보기에서 숨겨져 있거나 양식이 보이지 않는 양식을 인쇄 할 수 없습니다. 은 부분적으로 화면에서 벗어난 곳에 있습니다. 코드는 기본적으로 스크린 샷 을 생성하고 이미지를 안정적으로 인쇄하기 위해 은 TExcellentImagePrinter 제품을 살펴볼 수 있습니다. 왜? 간단히 말하면, Windows에서 을 인쇄하려면 비트 맵을 얻으려면 그래픽 코드의 수천 줄의 낮은 수준이 필요합니다.

+4

정확히 GetFormImage의 문제점은 무엇입니까? –

+0

GetFormImage로 내 관심사에 대한 자세한 내용을 포함하도록 질문을 업데이트했습니다. –

+0

저는 현재 GetFormImage, Canvas.CopyRect (및 BitBlt/StretchBlt 변형) 및 PrintWindow와 관련된 문제를 해결하기 위해 노력하고 있습니다. 둘 중 어떤 것도 실제 양식을 그려 내지 못하고 있습니다. 내 양식은 일부 영역에서 맞춤형으로 그려지며 시간이 많이 지나면 다른 창으로 이동하므로 캡처에 포함됩니다. 솔루션을 찾을 수 있다면 답변을 게시 할 것입니다. 그러나 특정 시나리오에서 대상 양식이 숨겨져 있거나 다른 창에서 화면이 보이지 않거나 모호한 경우 위에 언급 한 해결책 중 어느 것도 올바르게 작동하지 않습니다. – ciuly

답변

8

나는 문제가 GetFormImage으로 무엇인지 모르겠지만, 당신은 (적어도 명시 적으로) 시도하지 않은 옵션이 나는 이것이를 생산하는 기대 거의 모든 경우에

procedure TForm1.FormClick(Sender: TObject); 
var 
    bm: TBitmap; 
begin 

    bm := TBitmap.Create; 
    try 
    bm.SetSize(ClientWidth, ClientHeight); 
    BitBlt(bm.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, Canvas.Handle, 0, 0, SRCCOPY); 
    Clipboard.Assign(bm); 
    finally 
    bm.Free; 
    end; 

end; 

입니다

Clipboard.Assign(GetFormImage); 

과 같은 결과가 표시됩니다. (또한, Canvas.CopyRect 절차는 내가 어떤 스트레칭이 적용되지 않는 경우 BitBlt와 같은 결과를 기대 StretchBlt 직원들이 만든.)

당신은 항상 화면 인쇄 사용할 수있는 2

방법 :

procedure TForm1.FormClick(Sender: TObject); 
begin 
    keybd_event(VK_SNAPSHOT, 1, 0, 0); 
end; 

을 테두리와 제목 표시 줄도 캡처합니다.클라이언트 영역 만 가져 오려면 다음과 같이 이미지를자를 수 있습니다.

procedure TForm1.FormClick(Sender: TObject); 
var 
    bm, bm2: TBitmap; 
    DX, DY: integer; 
begin 
    Clipboard.Clear; 
    keybd_event(VK_SNAPSHOT, 1, 0, 0); 
    repeat 
    Application.ProcessMessages; 
    until Clipboard.HasFormat(CF_BITMAP); 
    bm := TBitmap.Create; 
    try 
    bm.Assign(Clipboard); 
    bm2 := TBitmap.Create; 
    try 
     bm2.SetSize(ClientWidth, ClientHeight); 
     DX := (Width - ClientWidth) div 2; 
     DY := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME); 
     BitBlt(bm2.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, bm.Canvas.Handle, DX, DY, SRCCOPY); 
     Clipboard.Assign(bm2); 
    finally 
     bm2.Free; 
    end; 
    finally 
    bm.Free; 
    end; 
end; 
+0

Andreas, 거기에는 몇 가지 훌륭한 옵션이 있지만 여전히 어떤 특정 옵션을 사용해야하는지 묻습니다. 이것들이 모두 하나의 대답이기 때문에 어떤 옵션이 가장 많은 표를 얻고 있는지 말할 수 없습니다. –

+2

* * 당신을 위해 * 작동하는 가장 간단한 방법을 선택해야합니다. * 당신 * 프로젝트에서'GetFormImage'에 문제가 발생하지 않았다면, 꼭 사용하십시오! –

+0

아직 GetFormImage가 Delphi 10.1 Berlin에서 제대로 작동하지 않습니다. 예 : 내 양식의 TRichEdit 구성 요소가 캡처되지 않습니다. – DaveBoltman

관련 문제