. 문서정보

이 기능은 편집하고 있는 문서의 여러 가지 정보를 계산하여 보여준다. 이 절의 주제인 포맷변환과는 별 상관이 없지만 따로 절을 구성할 만큼 큰 기능이 아니므로 이 절의 마지막 실습으로 다루어 보도록 하자. GetDocInfo 함수는 편집중인 문서의 총 문단 수를 구하는데 이 함수의 기능을 확장하여 더 많은 정보를 구하도록 해보자. ApiEdit.h에 이 함수가 구하는 정보의 종류를 열거형으로 선언한다.

 

enum {AE_DOC_TOTALPARA, AE_DOC_WORD, AE_DOC_EXSPACESIZE, AE_DOC_CHAR,

     AE_DOC_HAN, AE_DOC_EMPTYLINE};

 

차례대로 총 문단수, 단어수, 공백 제외 크기, 문자수, 한글 문자수, 빈 줄 수이다. 더 상세한 정보를 구하도록 하고 싶다면 열거 상수를 늘려 주고 GetDocInfo에 코드를 추가하면 된다. 이 함수는 다음과 같이 확장된다.

 

int CApiEdit::GetDocInfo(int type)

{

     int i;

     int count=0;

     int han=0;

     TCHAR *p=buf;

 

     switch (type) {

     case AE_DOC_TOTALPARA:

          return pLine[TotalLine-1].nPara;

     case AE_DOC_WORD:

          for (;*p;) {

              if (AeIsWhiteSpace(*p) || *p==‘\r’) {

                   while ((AeIsWhiteSpace(*p) || *p==‘\r’ || *p==‘\n’) && *p!=0)

                        p++;

              } else {

                   count++;

                   while (!AeIsWhiteSpace(*p) && *p!=‘\r’ && *p!=‘\n’ && *p!=0)

                        p++;

              }

          }

          break;

     case AE_DOC_EXSPACESIZE:

          for (;*p;p++) {

              if (!(AeIsWhiteSpace(*p) || *p==‘\r’ || *p==‘\n’)) {

                   count++;

              }

          }

          break;

     case AE_DOC_CHAR:

     case AE_DOC_HAN:

          for (;*p;p++) {

              if (!(AeIsWhiteSpace(*p) || *p==‘\r’ || *p==‘\n’)) {

                   if (IsDBCS(p-buf)) {

                        han++;

                        p++;

                   }

                   count++;

              }

          }

          if (type == AE_DOC_HAN)

              return han;

          break;

     case AE_DOC_EMPTYLINE:

          for (i=0;i<=pLine[TotalLine-1].nPara;i++) {

              if (IsParaEmpty(buf+GetOffFromPara(i,0))) {

                   count++;

              }

          }

          break;

     }

     return count;

}

 

buf의 처음부터 끝까지 한 문자씩 읽으면서 정보들을 구하는데 너무너무 쉬운 코드들이다. 어찌나 쉬운지 한눈 감고 읽어도 이해가 될 정도다. 호스트에는 문서의 정보를 구하는 PrintInfo 함수를 작성한다. 이 함수는 더 쉽다.

 

void PrintInfo(CApiEdit &Ae)

{

     TCHAR Mes[512];

     TCHAR str[256];

     int byte,byte2;

 

     byte=Ae.GetTextLength();

     wsprintf(Mes,"크기 : %d 바이트(%d K바이트)\r\n",byte, byte/1024);

     wsprintf(str,"줄 수 : %d \r\n",Ae.GetDocInfo(AE_DOC_TOTALPARA)+1);

     lstrcat(Mes,str);

     wsprintf(str,"비어있는 줄 수 : %d \r\n",Ae.GetDocInfo(AE_DOC_EMPTYLINE));

     lstrcat(Mes,str);

     wsprintf(str,"단어 수 : %d 단어\r\n",Ae.GetDocInfo(AE_DOC_WORD));

     lstrcat(Mes,str);

     byte2=Ae.GetDocInfo(AE_DOC_EXSPACESIZE);

     wsprintf(str,"공백을 제외한 크기 : %d 바이트(공백률 %d%%)\r\n",

          byte2, byte==0 ? 0:100-byte2*100/byte);

     lstrcat(Mes,str);

     byte=Ae.GetDocInfo(AE_DOC_CHAR);

     byte2=Ae.GetDocInfo(AE_DOC_HAN);

     wsprintf(str,"총 글자 수 : %d 글자 (한글 %d, 영문 %d)",

          byte, byte2, byte-byte2);

     lstrcat(Mes,str);

 

     MessageBox(g_hFrameWnd,Mes,"문서정보",MB_OK);

}

 

문서에 대한 대부분의 정보를 GetDocInfo 함수에서 구하며 구한 정보를 보기 쉽게 문자열 형태로 가공하여 메시지박스로 출력했다. 파일/문서정보 메뉴에서 이 함수를 호출한다.

 

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

{

     ....

     case IDM_FILE_INFO:

          PrintInfo(pSi->Ae);

          break;

 

출력되는 문서정보는 다음과 같다.

간단하게 메시지박스로 결과만 보여주었는데 별도의 대화상자를 디자인한다면 표 형식으로 정보를 가공한다거나 문서의 구성을 그래픽으로 보여주는 등의 처리를 할 수도 있겠다. 이런 기능은 시간만 많다면 얼마든지 더 개선해 볼 여지가 있다. 사실 코딩이란 시간과의 싸움이라 더 하고 싶어도 여유가 없다.