2009년 11월 7일 토요일

13. 프린터

13. 프린터 사용하기

 

▶ 프린터와 관련하여 고려해야 할 몇가지 쟁점

      1. 프린터는 비디오 디스플레이보다 느리다.

      2. 프로그램은 이전의 출력에 새로운 출력을 덮어쓰는 식으로 비디오 디스플레이 표면을 재사용하지만, 프린터에

         대해서는 그렇게 할 수 없다.

      3. 프린터에서는 서로 다른 애플리케이션의 출력을 별개의 문서 혹은 인쇄 작업으로 분리해야 한다.

 

13_1. 인쇄 기초

 

인쇄와 스풀링

스풀링 (spooling)
    1 컴퓨터 시스템에서 중앙 처리 장치와 각각의 입출력 장치가 서로 독립적으로 작동하는 것.
    2 처리할 데이터를 디스크나 테이프에 저장하고 이것을 다른 장치가 이용하도록 하는 기법.
 
애플리케이션이 프린터를 사용하기 시작하려면,
   먼저 CreateDC () 혹은 PrintDlg ()를 이용하여 프린터 디바이스 컨텍스트에 대한 핸들을 얻기.
   그리고 나서 프로그램은 새로운 문서의 시작을 알리는 StartDoc () 을 호출.
   StartDoc ( ) 은 GDI 모듈이 처리하는데, GDI 모듈은 프린터 디바이스 드라이버의 함수인 Control ( ) 을 호출함으로써
  디바이스 드라이버가 인쇄를 위한 준비를 하게 한다.
   StartDoc ( ) 호출은 문서 인쇄 절차를 시작!
▶  밴딩(banding)
     페이지를 직사각형의 밴드(band)로 분할하는 것.
각각의 밴드에 대해, 디바이스 드라이버는 그리기 함수들을 프린터에 실현하는데 필요한 출력으로 변환한다. 이 출력의 포맷은 프린터에 따라 다르다.
프린터 드라이버가 각 밴드에 대한 프린터 출력을 GDI 모듈에 전달, GDI 모듈은 이 프린터 출력을 또다른 임시 파일에 저장한다. ( 이 파일의 이름 : ~SPL로 시작, 확장자 : .TMP )
인쇄해야 할 모든 페이지에 대한 작업이 끝나면, EndDoc ( ) 을 호출하여 인쇄 작업이 끝남을 알린다.
 
스풀러 = 애플리케이션이 감당해야 할 인쇄와 관련된 일부 작업을 덜어준다.
 
 프로그램이 문서를 인쇄하면, GDI 모듈은 프린터 출력을 담고 있는 파일들 생성.
 이러한 피일들을 프린터로 보내는 것이 인쇄 스풀러의 역할이다!
 만약 윈도우즈 스풀러가 활성화되어 있지 않으면, GDI 모듈은 디바이스 드라이버가 생성한 프린터 출력을 파일에 저장하지 않는다. 그러나 GDI가 행하는 인쇄는 완료되기 전까지 애플리케이션의 동작을 중단시킨 가능성 존재!
 
결론, 애플리 케이션이 인쇄를 하기 위한 첫번째 단계
             ☞ 프린터 디바이스 컨텍스트를 얻는 것!
프린터 디바이스 컨텍스트

프린터 디바이스 컨텍스트 핸들을 가지고 있으면, 다양한 GDI 그리기 함수들의 첫 번째 매개변수로 사용할 수 있다.

 

▶ 프린터 디바이스 컨텍스트 핸들을 얻을때 아래와 같은 함수를 이용.

hdc = CreateDC (NULL,

                          szDeviceName,            // 문자열. 윈도우즈에 프린터 장치의 이름을 알려준다.

                         NULL,

                         pInitializationData         // 일반적으로 NULL로 설정

          );

▶ 디폴트 프린터 디바이스 컨텍스트를 얻기 위한 방법

현재 표준적인 방법 : EnumPrinters ( ) 를 이용.

         (이 함수는 장착된 프린터 각각에 대한 정보로 구조체 배열을 채운다.

              이들 구조체의 이름은 PRINTER_INFO_x다. (여기서 x는 숫자다.) )

▶ ExtDeviceMode ( ) : 등록 정보 대화상자를 불러낸 후 사용자가 입력한 정보를 저장하는 역할.

▶ PrinterProperties ( ) : 대화상자를 간접적으로 불러낸다. 프린터 객체에 대한 핸들을 필요로 함.

                                  이 핸들은 OpenPrinter( ) 를 호출함으로써 얻는다. 사용자가 등록 정보 대화상자를 취소하면,

                                  PrinterProperties( )는 리턴한다. 그러면 ClosePrinter( )를 호출하여 프린터 핸들을 닫을 수 있다.

 

 

 13_2. 중단 프로시저 

 

               애플리케이션 내에서 인쇄 작업을 취소. 외부에서 호출 할 수 있는 , 프로그램 내의 조그만 함수다.

 

중단 프로시저(abort procedure)로 인쇄 취소하기

애플리케이션은 SetAbortProc() 의 인자에 이 함수의 주소를 넣어 윈도우즈에 건내주게 되고, GDI는 인쇄를 하는 동안 반복해서 중단 프로시저를 호출하게 된다. 이것은 본질적으로 "인쇄를 계속 할까요?"라고 묻는 것과 동일하다.

 

흔히 중단 프로시저를 AbortProc( ) 이라 하고, 다음과 같은 형태를 가진다.

BOOL CALLBACK AbortProc (HDC hdcPrn, int iCode)

{

                   [ 그밖의 프로그램 행]

}

중단 프로시저를 사용하려면, 인쇄를 하기 전에 SetAbortProc( )을 호출하여 등록하여야 한다.

SetAbortProc (hdcPrn, AbortProc) ;           // hdcPrn : 프린터 디바이스 컨텍스트 핸들

만약 인쇄 작업을 계속하려면 AbortProc( )은 TRUE를 리턴해야 하고, 인쇄 작업을 중단하려면 FALSE(0)를 리턴!

중단 프로시저는 다음과 같다.

BOOL CALLBACK AbortProc (HDC hdcPrn, int iCode)

{

             MSG       msg;

             while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) )

             {

                          TranslateMessage (&msg);

                          DispatchMessage (&msg);

             }

             return TRUE ;

}

AbortProc( )의 메시지 루프는 PeekMessage( )가 TRUE를 리턴하지 않을 때까지 PeekMessage( )를 반복해서 호출한다. TRUE 값은 PeekMessage( )가 메시지를 꺼냈고, 이 메시지를 TranslateMessag( )와 DispatchMessage( )를 이용하여 프로그램의 윈도우 프로시저 중 하나에 보낼 수 있다는 것을 의미한다.

프로그램의 메시지 큐에 더 이상 메시지가 없으면, PeekMessage( )의 리턴 값은 FALSE가 되고 AbortProc( )은 윈도우즈에 제어를 반환한다.  

 

 

댓글 없음:

댓글 쓰기