|
영수증 프린터는 안써봐서 잘 모르겠지만...
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();
: }
: ////////////////////////////////////////////////////////////////////////////////////////////////
|