C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[65632] Re:Re:Re:폼 프린트시 콤보박스 선택 내용 미출력 문제 __ 해결!!
장성호 [nasilso] 1216 읽음    2011-12-02 23:31
프린터관련 프로그램을 별로 안해봐서...

여튼 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("인쇄 완료");

+ -

관련 글 리스트
65611 폼 프린트시 콤보박스 선택 내용 미출력 문제 로더 1334 2011/11/29
65616     Re:폼 프린트시 콤보박스 선택 내용 미출력 문제 장성호 1501 2011/11/30
65631         Re:Re:폼 프린트시 콤보박스 선택 내용 미출력 문제 __ 해결!! 로더 1367 2011/12/02
65632             Re:Re:Re:폼 프린트시 콤보박스 선택 내용 미출력 문제 __ 해결!! 장성호 1216 2011/12/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.