. 인쇄 대화상자

컨트롤의 인쇄 지원, 인쇄 옵션 관리 코드가 완성되었다. 이제 호스트는 사용자의 명령이 있을 때 주어진 옵션대로 인쇄하면 된다. 인쇄는 Win32 프로그래밍의 다소 기본적인 내용이므로 여기서는 인쇄 방법에 대해 별도로 다루지 않는다. 인쇄 코드에 익숙하지 않은 사람은 API 정복 29장의 인쇄 관련 기본 이론과 예제들을 참고 하기 바란다. 인쇄를 시작하는 함수는 옵션에 따라 두 가지가 있다. 다음 함수를 작성한다.

 

void Print(HWND hChild)

{

     PRINTDLG pd;

     int nPages, nCopies;

     int nFirst, nFinal;

 

     memset(&pd,0,sizeof(PRINTDLG));

     pd.lStructSize=sizeof(PRINTDLG);

     pd.Flags=PD_RETURNDC | PD_NOSELECTION;

     pd.hwndOwner=g_hFrameWnd;

     pd.nFromPage=1;

     pd.nToPage=1;

     pd.nMinPage=1;

     pd.nMaxPage=65535;

     pd.nCopies=1;

     if (PrintDlg(&pd)==FALSE || pd.hDC==NULL) {

          return;

     }

     if (pd.Flags & PD_COLLATE) {

          nPages=1;

          nCopies=pd.nCopies;

     } else {

          nPages=pd.nCopies;

          nCopies=1;

     }

 

     if (pd.Flags & PD_PAGENUMS) {

          nFirst=pd.nFromPage;

          nFinal=pd.nToPage;

     } else {

          nFirst=pd.nMinPage;

          nFinal=pd.nMaxPage;

     }

 

     PrintDoc(hChild,pd.hDC,nPages,nCopies,nFirst,nFinal);

 

     if (pd.hDevMode) GlobalFree(pd.hDevMode);

     if (pd.hDevNames) GlobalFree(pd.hDevNames);

     DeleteDC(pd.hDC);

}

 

void PrintDirect(HWND hChild)

{

     HDC pdc;

 

     TCHAR szPrinter[80];

     TCHAR *szDevice, *szDriver, *szOutput;

     GetProfileString("windows","device",",,,",szPrinter,80);

     szDevice = strtok(szPrinter,",");

     szDriver = strtok(NULL, ", ");

     szOutput = strtok(NULL, ", ");

     pdc=CreateDC(szDriver,szDevice,szOutput,NULL);

     if (pdc) {

          PrintDoc(hChild,pdc,1,1,1,65535);

     }

     DeleteDC(pdc);

}

 

두 함수 중 어떤 함수가 인쇄를 시작할 것인가는 Option.prtbDirect 옵션에 따라 달라진다. OnCommand에서 이 옵션값에 따라 적절한 인쇄 시작 함수를 호출한다.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_FILE_PRINT:

          if (Option.prtbDirect) {

              PrintDirect(hActive);

          } else {

              Print(hActive);

          }

          break;

 

Print 함수는 인쇄 대화상자를 보여주고 프린터를 변경하거나 인쇄 범위, 매수를 선택할 수 있도록 한다. 반면 PrintDirect 함수는 인쇄 대화상자를 보여주지 않고 시스템에 등록된 기본 프린터로 바로 인쇄한다. 인쇄 매수는 1매로 고정되며 인쇄 범위는 문서 전체이다. 기본 프린터에 기본 옵션으로 인쇄하려면 직접 인쇄 옵션을 선택하는 것이 좋고 인쇄할 때마다 프린터를 바꾸거나 인쇄 범위를 지정하려면 직접 인쇄를 하지 말아야 한다.

두 함수는 인쇄에 사용할 DC와 인쇄 범위, 매수를 구한다는 점에서 동일하되 인쇄 대화상자로 사용자에게 선택권을 주는가 아니면 디폴트를 취하는가만 다르다. 두 함수 모두 인쇄에 필요한 정보만 구하고 PrintDoc 함수를 호출한다.