@문제원인
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("인쇄 완료");