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
[41213] Re:[질문]인쇄용지 설정
civilian,안영제 [civilian] 2522 읽음    2005-07-26 23:24
영수증 프린터는 안써봐서 잘 모르겠지만...
ResetDC를 이용해서 변경된 내용을 적용시켜야 할 것 같습니다.
ResetDC는 Windows API 도움말을 보시면 됩니다.

임영우 님이 쓰신 글 :
: 안녕하세요.
: 영수증프린터를 이용해서 영수증을 찍으려 합니다.
: 근데, 연속용지때문에 아주 고민입니다.
: 프린터 용지가 연속용지임에도 불구하고... (58mm roll Paper)
: Printer()->PageHeight 를 출력하면 927 이라고 나옵니다.
: 그리고, 프로그램에서 Printer()->NewPage(); 를 사용하지 않고 계속 찍어데면...
: 윈도즈에서 제공하는 "프린터스풀보기"프로그램에 상태칸에... "인쇄삭제중..." 이렇게 뜨면서 인쇄가 중단됩니다.
: 즉, 한페이지분량(927)만큼만 나오고 인쇄가 중단됩니다.
: Printer()->NewPage(); 를 정당히 사용해주면, 인쇄가 끝까지 되기는 합니다만,
: Printer()->NewPage(); 를 사용한 자리에는 당연히 공백이 무진장 길게 생깁니다.(폼피드가 일어난 것이겠죠)ㅠ,.ㅠ;
: 그래서 좀 긴 영수증을 출력하면 아주 꼴사납게 됩니다.
: 폼피드 들어간 영수증 보신 적 있으신가요? ^,.^;
: 있습니다. 제 방에 산더미처럼 쌓여있습니다. 벌써 58mm 롤지를 세개째 쓰고있습니다.
: 정말 해결 방법이 없을까요?
: 없는 실력에 .... 나름데로는.... 별의 별 짓을 다 해봤습니다.
: 제가 해 본 것들은.....
: - MSDN을 뒤져서 RawDataToPrinter()라는 함수를 찾아서 뽁아다 써 봤습니다.
:   이건 잘 됬습니다. 하지만... 예쁜 영수증을 출력하기란 아주 장난이 아니데요.
:   상점로고도 영수증에 찍어야하는 상황에서는 ... 사용하기가 넘 힘들었습니다. 폰트제어도 그렇고...
: - Printer()->PageHeight = 99999; <- 이건 아주 말도 안되는 것이더군요.
: - CreateFile() 함수로 "LPT1:"을 열어서 거기에 내용을 써넣는 방법.
:    이 방법 역시 첫번째 방법과 비슷한 이유로 사용하지 않는 것이 좋다고 판단했습니다.
: - 웹서핑하다가 델파이로 짜진 인쇄용지 설정 프로그램을 찾았습니다.
: 그래서 이 프로그램을 C++Builder에서 사용할 수 있도록 변환해서 실행 해 봤습니다.
: 그리고 ShowMessage( Printer()->PageHeight );를 출력해 봤습니다.
: 그래도 Printer()->PageHeight 는 변경되지가 않더군요.
: 아래 코드를 한 번만 봐 주세요. ㅠ,.ㅠ;
: 이 코드가 제가 원하는 기능을 해 주는 코드가 맞기는 맞는 건가요?
: 요리조리 뽁아봐도 결과는 똑같던데요.
: 무엇이 문제인가요? 원래 이 코드는 그런 용도가 아닌 것인가요?
: ㅠ,.ㅠ; 제발........ 좀...... 도와주세요.... ㅠ,.ㅠ;
:
: 이 코드가 웹에서 얻어온 코드입니다.
: ////////////////////////////////////////////////////////////////////////////////////////////////
: // Printer의 DevMode 를 사용하여 변경할 수 있습니다
: // 아래 코드는 프린터용지의 방향, 크기 등을 변경하는 코드입니다
: // Windows.pas에서 DMPAPER_ 로 시작하는 상수값을 찾아보시면 용지 종류를
: // 알 수 있습니다
:
: procedure TForm1.Button1Click(Sender: TObject);
: var
:  Device : array[0..255] of char;
:  Driver : array[0..255] of char;
:  Port : array[0..255] of char;
:  hDMode : THandle;
:  PDMode : PDEVMODE;
: begin
:  Printer.PrinterIndex := Printer.PrinterIndex;
:  Printer.GetPrinter(Device, Driver, Port, hDMode);
:  if hDMode <> 0 then
:  begin
:    pDMode := GlobalLock(hDMode);
:    if pDMode <> nil then
:    begin
:      {legal 용지로 바꾸는 예}
:      pDMode^.dmFields    := pDMode^.dmFields or dm_PaperSize;
:      pDMode^.dmPaperSize := DMPAPER_LEGAL; // Windows.pas에서 DMPAPER_ 로 시작하는 상수값을 찾아보세요
:
: (*
:      {사용자 정의 용지로 바꾸는 예}
:      pDMode^.dmOrientation := DMORIENT_PORTRAIT;
:      pDMode^.dmFields := pDMode^.dmFields or
:                          DM_ORIENTATION or
:                          DM_PAPERSIZE or
:                          DM_PAPERWIDTH or
:                          DM_PAPERLENGTH;
:      pDMode^.dmPaperSize   := DMPAPER_USER;
:      pDMode^.dmPaperWidth  := 500 {단위는 mm}
:      pDMode^.dmPaperLength := 300 {단위는 mm}
:
:      {용지 공급을 바꾸는 예}
:      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
:      pDMode^.dmDefaultSource := DMBIN_MANUAL;
: *)
:
:      GlobalUnlock(hDMode);
:    end;
:  end;
:  Printer.PrinterIndex := Printer.PrinterIndex;
:
:  Printer.BeginDoc;
:  Printer.Canvas.TextOut(100,100, 'Test 1');
:  Printer.EndDoc;
: end
: ////////////////////////////////////////////////////////////////////////////////////////////////
:
:
:
: 아래는 제가 뽁아서 테스트 해 본 코드입니다.
: ////////////////////////////////////////////////////////////////////////////////////////////////
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:     char Device[256];
:     char Driver[256];
:     char Port[256];
:     THandle hDMode;
:     PDEVMODE pDMode;
:
:     Printer()->PrinterIndex = Printer()->PrinterIndex;
:     Printer()->GetPrinter( Device, Driver, Port, hDMode );
:     if( hDMode != 0 )
:     {
:         pDMode = GlobalLock( (void*)hDMode );
:         if( pDMode != NULL )
:         {
: /*
:             pDMode->dmFields    = pDMode->dmFields || dm_PaperSize;
:             pDMode->dmPaperSize = DMPAPER_LEGAL;
: */
:             pDMode->dmOrientation = DMORIENT_PORTRAIT;
:             pDMode->dmFields = pDMode->dmFields ||
:                                             DM_ORIENTATION ||
:                                             DM_PAPERSIZE ||
:                                             DM_PAPERWIDTH ||
:                                             DM_PAPERLENGTH;
:             pDMode->dmPaperSize   = DMPAPER_USER;
:             pDMode->.dmPaperWidth  = 58;
:             pDMode->dmPaperLength = 999;
:
:             pDMode->dmFields = pDMode->dmFields || DMBIN_MANUAL;
:             pDMode->dmDefaultSource = DMBIN_MANUAL;
:
:             GlobalUnlock( (void*)hDMode );
:         }
:     }
:     Printer()->PrinterIndex = Printer()->PrinterIndex;
:
:     Printer()->BeginDoc();
:     for( int i=0, j=0; i<40 && j<2; i++ )
:     {
:         if( i * Printer()->Canvas->TextHeight("Test 1") > Printer()->PageHeight )
:         {
:             i = 0;
:             j++;
:             Printer()->Canvas->TextOut(1, i * Printer()->Canvas->TextHeight("Test 1"), "Test 1" );
:         }
:     }
:     Printer()->EndDoc();
: }
: ////////////////////////////////////////////////////////////////////////////////////////////////

+ -

관련 글 리스트
41210 [질문]인쇄용지 설정 임영우 2027 2005/07/26
41213     Re:[질문]인쇄용지 설정 civilian,안영제 2522 2005/07/26
41212     Re:음...제 경우 무심코 1019 2005/07/26
41214         그렇군요... 근데 여긴 중국이고, 중국 싸구려 프린터라서요.. ㅠ,.ㅠ; 임영우 997 2005/07/26
41215             이 코드가 말이 되는 코드인지 한 번 만 봐 주세요. 제발..... 임영우 1088 2005/07/27
41216                 Re:이 코드가 말이 되는 코드인지 한 번 만 봐 주세요. 제발..... civilian,안영제 1005 2005/07/27
41242                     Re:Re:이 코드가 말이 되는 코드인지 한 번 만 봐 주세요. 제발..... 임영우 1133 2005/07/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.