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
[41210] [질문]인쇄용지 설정
임영우 [xsapiens] 2026 읽음    2005-07-26 16:44
안녕하세요.
영수증프린터를 이용해서 영수증을 찍으려 합니다.
근데, 연속용지때문에 아주 고민입니다.
프린터 용지가 연속용지임에도 불구하고... (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 [질문]인쇄용지 설정 임영우 2026 2005/07/26
41213     Re:[질문]인쇄용지 설정 civilian,안영제 2522 2005/07/26
41212     Re:음...제 경우 무심코 1018 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.