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
[1830] Re:[질문] 프린터 출력할때 크기에 관해서
박지훈.임프 [cbuilder] 4261 읽음    1999-08-23 00:00
: 안녕하세요..
: 프린터 출력에 관해서 물어보려고 합니다.
:
: 제가 한가지 프로그램을 만들었습니다.
: 그런데..
: 그 프로그램에서 프린터 출력을 할때
: 프린터 마다 출력하는 크기가 다른게 나옵니다.
:
: 밑에 이에 관한 다변이 있던데 font크기문제는 아닌것
: 같습니다.
: 제가 만든 프로그램이 newsky.ithink.co.kr/~puzzle.htm에
: 가보시면 있습니다.
: 용량이 조금 크게 되었습니다.
: 부탁드리지만 확인해주시기 바랍니다.
:
: 제가 쓴 프린터 관련소스는
:  TPrinter *printer1 = Printer();
:
:         int px=182,py=182;
:
:         printer1->BeginDoc();
:         printer1->Title ="퍼즐게임";
:         printer1->Canvas->Font->Size = 19;
:         printer1->Canvas->TextOut(10,10," 9 * 9   퍼 즐 게 임  제작자:이제훈");
:         printer1->Canvas->Font->Size = 16;
: //        printer1->Canvas->Font->Style=
:         for(y=0;y<10;y++)
:         {
:                 for(x=0;x<10;x++)
:                 {
:                         printer1->Canvas->MoveTo(170*x+px,y+py);
:                         printer1->Canvas->LineTo(170*x+px,170*y+py);
:                         printer1->Canvas->MoveTo(x+px,170*y+py);
:                         printer1->Canvas->LineTo(170*x+px,170*y+py);
:                 }
:         }
:         for(x=0;x<3;x++)
:         {
:                 printer1->Canvas->MoveTo(170*x+170+px,y+py);
:                 printer1->Canvas->LineTo(170*x+170+px,170*y+py);
:                 printer1->Canvas->MoveTo(x+170+px,17
:         for(x=0;x<RANDNUM;x++)
:         {
:                 printer1->Canvas->TextOut(randx[x]*170+px+32,randy[x]*170+py+30,data[randy[x]][randx[x]]);
:         }
:
:         px+=2000;
:         for(y=0;y<10;y++) /*해답출력*/
:         {
:                 for(x=0;x<10;x++)
:                 {
:                         printer1->Canvas->MoveTo(170*x+px,y+py);
:                         printer1->Canvas->LineTo(170*x+px,170*y+py);
:                         printer1->Canvas->MoveTo(x+px,170*y+py);
:                         printer1->Canvas->LineTo(170*x+px,170*y+py);
:                 }
:         }
:         for(y=0;y<9;y++)
:         {
:         for(x=0;x<9;x++)
:                 {
:                         printer1->Canvas->TextOut(x*170+px+32,y*170+py+30,data[y][x]);
:                 }
:         }
:
:         printer1->EndDoc();
: 에구..정렬이 안되네요.
: 죄송..
: 제가 프린터 관련은 첨 손대보는거라.
: 제대로 안돼는것 같습니다.
: 그럼..부탁드립니다.



임펠리테리입니다.

아래에 이와 비슷한 질문이 있었던가요? 만약 제가 그게 폰트크기 때문이라고 답변했다면
잘못 답변한건데.. 갸우뚱.. 확인해보고 잘못되었으면 수정하도록 하죠. ^^;; (그럴리가...)

프린트한 크기가 프린터마다 다르게 나오는 이유는 간단합니다. 각 프린터마다 해상도가
다르기 때문입니다. 이것은 프린터마다 달라서뿐만 아니라, 모니터와 프린터의 해상도도
달라서, 사실 프린트해보면 모니터에서 보던 크기보다 보통은 작게 나옵니다.
모니터의 해상도는, 프린터식으로 계산하면 일반적으로 96dpi라고 생각하면 됩니다.
(사실 모니터의 인치수와 화면 모드마다 다르지만, 윈도우즈에서는 모니터의 표준 해상도를 96dpi로
가정할 것을 권고하고 있습니다. 실제로 이 값은 14인치나 15인치 모니터의 800*600이나
1024*768모드에서 거의 비슷합니다.)

그런데, 프린터는 이만큼 무식한 프린터는 거의 없지요? 잉크젯 프린터라면 구형이라고 해도
적어도 300dpi 이상은 되고, 최근의 잉크젯이나 레이저 프린터는 대부분 600dpi 이상은 넘어갑니다.
그러니까 실제로 프린트를 해보면 프린터의 해상도가 훨씬 높으므로, 모니터에서 보던 것보다
쬐그만 그림만 나옵니다.

하지만.. 이것이 또 요상하게 되어 있어서, 텍스트, 즉 폰트의 경우는 다릅니다.
폰트는 프린터의 해상도에 좌우되지 않습니다. 폰트의 크기를 10으로 잡아주었을 경우
프린트해보면 해상도만큼 계산이 되어서, 프린터마다 다르지 않고 항상 일정한 크기로
나옵니다. 그리고 이 크기는 모니터에서 보던 크기와도 거의 비슷합니다.

그래서.. 결론적으로 말하자면, 폰트를 제외한 모든 것들을 프린트할 때는 (프린터 해상도) / (모니터 해상도)
만큼을 좌표계에 곱해주어서 프린트해야만 합니다.
또 한가지 알아두어야 할 것은, 요즈음의 모니터는 모두 가로/세로 해상도(aspect ratio)가 동일하지만,
프린터의 경우는 가로/세로 비율이 다른 경우가 많다는 것입니다. 그러므로 가로와 세로의 비율을 별도로
계산해주어야 합니다.

자아.. 그럼, 앞에서 말한 것처럼, 모니터의 해상도는 96으로 가정하면 됩니다만,
프린터마다 모두 다른 해상도를 어떻게 알아내는지를 알아야 되겠지요?
프린터의 해상도는 API 함수인 GetDeviceCaps()를 이용해서 알아낼 수 있습니다.
이 함수는 특정 출력장치의 여러 정보를 알아내는 함수인데, 내부적으로는 디바이스 드라이버가
가지고 있는 정보를 돌려주게 되어 있습니다. 이 함수에 첫 인자로 해당 출력장치의 dc를 넘겨주고
두번째 인자로는 알아내고자 하는 정보의 종류를 옵션으로 넘겨주면 그 결과값을 리턴해줍니다.
프린터의 가로 해상도를 알아내기 위해서는,
GetDeviceCaps(Printer()->Handle, LOGPIXELSX)
이렇게 하면 리턴값으로 가로 해상도가 돌아옵니다. 물론, 세로 해상도를 위해서는
GetDeviceCaps(Printer()->Handle, LOGPIXELSY)
라고 하면 되죠.

결론적으로.. 앞에서 말했다시피, 모니터와 프린터에 나타나는 이미지의 크기를 일치시키기 위해
특정 배율을 곱하게 되는데, 이 배율을 구해주는 함수는 다음과 같습니다.

double __fastcall GetXFactor(void)
{
    return GetDeviceCaps(Printer()->Handle, LOGPIXELSX) / 96.;
}

double __fastcall GetYFactor(void)
{
    return GetDeviceCaps(Printer()->Handle, LOGPIXELSY) / 96.;
}

가로 좌표의 경우는 GetXFactor()를 곱하고, 세로 좌표의 경우에는 GetYFactor()를 곱해주면 됩니다.
예를 들어서, 10, 20 위치에 글자를 찍으려면,
Printer()->Canvas->TextOut(10*GetXFactor(), 20*GetYFactor(), "글자입니다");
라고 하면 됩니다.

그럼 참고하시길...

+ -

관련 글 리스트
1828 [질문] 프린터 출력할때 크기에 관해서 이제훈 3580 1999/08/23
1830     Re:[질문] 프린터 출력할때 크기에 관해서 박지훈.임프 4261 1999/08/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.