프린터관련 프로그램을 별로 안해봐서...
여튼 Screen은 메인모니터 정보를 가지고 있습니다.
현재Form(this)의 좌표를 이용해서 BitBlt 하시면 제대로 캡쳐됩니다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *All_Image = new Graphics::TBitmap;
All_Image->Width = this->Width;//Screen->Width;
All_Image->Height = this->Height;//Screen->Height;
HDC dc=GetDC(0);
BitBlt( All_Image->Canvas->Handle, this->Left, this->Top, this->Width, this->Height, GetDC(0), 0, 0, SRCCOPY );
ReleaseDC(0,dc);
//생략 ..
if(PrintDialog1->Execute())
{
Printer()->BeginDoc();
int iWMg=50;
int iHMg=50;
Printer()->Canvas->StretchDraw(Rect(iWMg,iHMg,Printer()->PageWidth-iWMg,Printer()->PageHeight-iHMg),All_Image);
Printer()->EndDoc();
}
ShowMessage("출력완료!!");
}
그리고 Print 정보에 PageWidth, PageHeight 등의 프로퍼티가 있으며
DPI과련정보도 구할수 있는것으로 알고있습니다.
그럼..
로더 님이 쓰신 글 :
: 문제점에 대한 답변을 올려 주셔서 이것저것 테스트 해보느라 이제야 해결 내용을 올립니다.
: 몇가지 문제점은 있지만, 대략 기능은 수행하는 것 같아 보입니다.
: 폼에 프린터다이얼로그 하나 올리셔야 합니다.
:
: 문제점 1. 듀얼스크린 지원문제 : 보조모니터에 프로그램을 올리고 실행하면 출력이 안 됩니다. (빈페이지 출력)
: 문제점 2. 프린터 해상도(DPI ??) 에 따른 출력 싸이즈 자동 조절 : 전 그냥 테스트 하면서 값을 고정 시켰습니다.
:
: 혹시 소스를 보시고 해결 가능한 방법을 알려 주시면 열심히 공부하겠습니다.
: 깊이 있는 덧글 달아주신 장성호님 감사합니다!!
:
:
: 장성호 님이 쓰신 글 :
: : @문제원인
: : VCL 자체의 GetFormImage 에 문제가 있는듯 합니다.
: : Form의 Print함수도 내부적으로 GetFormImage를 이용하고 있어서 문제가 있는것이구요
: :
: : @상세분석1
: : TComboBox는 화면에 보이는 부분이 두개의 window 입니다.
: : 바깥으 Frame은 VCL의 TComboBox이지만 안에 글자부분은 win32-control인 "EDIT" 입니다.
: : 이는 VCL의 TControl을 상속받은 control이 아니기 때문에 ComboBox의 안쪽 글자 부분이
: : 제대로 Print가 되지 않는것 같습니다.
: :
: :
: : @ 해결방안
: :
: : 방법1
: : ComboBox의 원인을 찾아 GetFormImage의 문제점을 해결하는 방법이 있겠구요
: :
: : 방법2
: : 그냥 Form의 Client영역만 화면캡쳐하는 방법을 이용하여 캡쳐하는 방법 있을것입니다.
: : 다음 링크에 두어가지 방법이 나와 있습니다.
: :
http://stackoverflow.com/questions/3190777/how-do-i-copy-a-form-as-an-image-to-the-clipboard
: :
: : 2-1 : GetDC(0) -> BitBlt
: :
: : 2-2 : PrintWindow
: :
: :
: : @ 비고
: :
: : 두방법이 모두 똑같지는 않습니다.
: : 주의1. GetFormImage는 Form이 화면(모니터,스크린)밖을 벗어나도 캡쳐가 됩니다만
: : 2-1번 방법은 Form이 스크린 밖으로 나가면 밖으로 나간 부분이 캡쳐가 되지는 않습니다.
: :
: : 주의2. 또한 작업관리자 같은 다른 TopMost-Window가 Form 보다 앞에 떠 있는경우
: : TopMost-Window와 같이 캡쳐됩니다.
: :
: : PrintWindow라는 API를 이용하는것이 좀더 좋은데요
: : 이놈도 전혀 문제가 없는것으 아니구요
: :
: :
: : 그럼..
: :
: :
: :
: : 로더 님이 쓰신 글 :
: : : 안녕하세요. 로더입니다.
: : :
: : : 제목 그대로 폼을 프린트 하려는데
: : :
: : : 콤보박스에 선택된 내용이 출력 안되는 문제가 발생 되었습니다.
: : : (기타 다른 컨트롤들(메모, 에디트박스 등)의 내용은 잘 출력이 됩니다.)
: : :
: : : 방법은 2가지를 시도해 보았습니다.
: : :
: : : 1. 폼의 Priint() 사용 (프린터 선택 문제 발생.)
: : :
: : : form->PrintScale = poPrintToFit;
: : : form->Print();
: : : ShowMessage("인쇄 완료");
: : :
: : : 2. GetFormImage() 사용 (Q&A 게시판 참고)
: : :
: : : Graphics::TBitmap *FormImage = form->GetFormImage();
: : : if(PrintDialog->Execute())
: : : {
: : : Printer()->BeginDoc();
: : : Printer()->Canvas->Draw((FormImage->Width),
: : : (FormImage->Height),
: : : FormImage);
: : : Printer()->EndDoc();
: : : }
: : : delete FormImage;
: : : ShowMessage("인쇄 완료");