. 머리말, 꼬리말 인쇄

머리말, 꼬리말은 일단 문자열이되 문자열 내부에 미리 의미가 정해진 서식을 가질 수 있다. 예를 들어 [파일] 예약어는 인쇄되고 있는 파일의 이름을 대신 출력하며 [] 예약어는 현재 인쇄되고 있는 페이지 번호를 출력한다. 또한 [가운데], [오른쪽] 서식은 문자열의 정렬방식을 지정한다. 머리/꼬리말의 서식은 PrintFormatText 함수에 의해 해석되고 출력된다.

 

void TextReplace(TCHAR *Text,TCHAR *what,TCHAR *to)

{

     TCHAR *p;

     TCHAR Text2[1024];

 

     p=strstr(Text,what);

     while (p) {

          lstrcpyn(Text2,Text,p-Text+1);

          lstrcat(Text2,to);

          lstrcat(Text2,p+lstrlen(what));

          lstrcpy(Text,Text2);

          p=strstr(Text,what);

     }

}

 

void PrintFormatText(TCHAR *szFormat,Ae_PrintInfo *pi,TCHAR *Path,int nPage,int y)

{

     TCHAR Text[1024];

     TCHAR szFile[MAX_PATH];

     TCHAR szDate[32], szTime[32],szPage[12];

     SYSTEMTIME st;

     TCHAR *p1, *p2;

     int len;

     UINT OldAlign;

 

     if (lstrlen(szFormat)==0) {

          return;

     }

 

     OldAlign=GetTextAlign(pi->pdc);

     GetLocalTime(&st);

     wsprintf(szDate,"%d %d %d",st.wYear, st.wMonth, st.wDay);

     wsprintf(szTime,"%d %d",st.wHour, st.wMinute);

     _splitpath(Path,NULL,NULL,szFile,szPage);

     lstrcat(szFile,szPage);

 

     lstrcpy(Text,szFormat);

     TextReplace(Text,"[파일]",szFile);

     TextReplace(Text,"[경로]",Path);

     TextReplace(Text,"[날짜]",szDate);

     TextReplace(Text,"[시간]",szTime);

     wsprintf(szPage,"%d",nPage);

     TextReplace(Text,"[]",szPage);

     wsprintf(szPage,"%d",pi->TotalPage);

     TextReplace(Text,"[전체쪽]",szPage);

 

     p1=strstr(Text,"[가운데]");

     p2=strstr(Text,"[오른쪽]");

 

     if (p1) {

          len=p1-Text;

     } else if (p2) {

          len=p2-Text;

     } else {

          len=lstrlen(Text);

     }

     TextOut(pi->pdc,pi->prt.left,y,Text,len);

 

     if (p1) {

          p1=p1+lstrlen("[가운데]");

          if (p2) {

              len=p2-p1;

          } else {

              len=lstrlen(p1);

          }

          SetTextAlign(pi->pdc,TA_CENTER);

          TextOut(pi->pdc,pi->prt.left+(pi->prt.right-pi->prt.left)/2,y,p1,len);

     }

 

     if (p2) {

          p2=p2+lstrlen("[오른쪽]");

          SetTextAlign(pi->pdc,TA_RIGHT);

          TextOut(pi->pdc,pi->prt.right,y,p2,lstrlen(p2));

     }

     SetTextAlign(pi->pdc,OldAlign);

}

 

PrintFormatText 함수는 미리 정해진 예약어를 실제값으로 변경하여 대체한다. 예를 들어 [날짜] 예약어를 만나면 GetLocalTime 함수로 현재 날짜를 조사하여 문자열로 바꾼 후 [날짜] 자리에 이 문자열을 대신 채워 넣는다. TextReplace 함수는 이 함수의 문자열 대체를 도와주는 보조 함수이다. 기본 예약어를 모두 대체한 후 정렬 서식에 따라 머리/꼬리말을 세 부분으로 나누어 출력한다.

[가운데] 예약어를 만나기 전까지의 부분을 찾아 왼쪽 정렬로 출력하고 [가운데]~[오른쪽]까지는 중앙 정렬로 출력하며 그 뒷부분은 오른쪽으로 정렬한다. 이 예약어에 의해 하나의 머리, 꼬리말에 정렬 상태가 다른 세 가지 문자열을 동시에 출력할 수 있다. 설정 대화상자는 정렬 예약어가 두 번 삽입되지 않도록 약간의 에러 처리를 하고 있다. 디폴트 옵션은 꼬리말만 출력하는데 기본 꼬리말이 어떤 식으로 해석되어 출력되는지 보자.

 

예약어는 인쇄 시점에 조사되는 정보로 대체되며 예약어가 아닌 일반 문자열은 그대로 출력된다. 더 필요한 예약어가 있다면 늘릴 수 있다.