. 날짜, 시간 삽입

편집 메뉴의 삽입 팝업메뉴에는 현재 날짜와 시간을 문서의 중간에 삽입할 수 있는 기능이 제공된다. 문서 작성 날짜나 시간을 문서에 기록하고자 할 때 이 기능을 사용하면 시스템 시계를 기준으로 한 정확한 시간을 삽입하므로 시계를 볼 필요가 없어 편리하다. 이외에 편집하고 있는 파일 경로나 이름을 삽입하는 유사한 기능들도 생각해 볼 수 있다. 이런 값들은 나름대로의 타입이 있지만 문서에 삽입될 때는 항상 문자열 형태로 변환한 후 삽입되어야 한다. 텍스트 파일에 저장되는 정보는 어차피 문자열 포맷이기 때문이다.

이 정보들의 실제값은 컨트롤보다는 호스트가 구하는 것이 더 쉬우므로 문자열은 호스트가 작성하고 컨트롤은 호스트가 전달한 문자열을 현재 위치에 삽입하는 기능만 제공하기로 한다. ApiEdit에 다음 멤버함수를 작성한다.

 

void CApiEdit::InsertText(TCHAR *Text)

{

     if (bReadOnly) {

          return;

     }

 

     BOOL bPrevSel;

     if (SelStart != SelEnd) {

          StartUndoGroup();

     }

     bPrevSel=DeleteSelection();

 

     Insert(off,Text);

     Invalidate(FindParaStart(off));

     off=off+lstrlen(Text);

     SetCaret();

 

     if (bPrevSel) {

          EndUndoGroup();

     }

}

 

단순한 문자열 삽입 함수지만 꽤 하는 일이 많다. 일단 읽기전용일 때는 문자열 삽입을 거부한다. Insert에서 읽기전용 점검을 하고 있으므로 여기서 bReadOnly를 점검하지 않아도 문자열 삽입은 되지 않지만 삽입 문자열의 길이만큼 캐럿이 불필요하게 움직이므로 이를 막고자 읽기전용 점검을 하였다. 선택영역이 있다면 새로 삽입되는 문자열로 대체하였으며 이때 선택영역 삭제와 새 문자열 삽입 동작은 같은 편집 그룹을 이룬다.

이제 호스트는 어떤 정보든지 문자열 형태로 가공해서 이 함수만 부르면 된다. 날짜와 시간 삽입 메뉴에 대해 다음 코드를 작성한다.

 

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

{

     SYSTEMTIME st;

     ....

     case IDM_EDIT_DATE:

          GetLocalTime(&st);

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

          pSi->Ae.InsertText(szTemp);

          break;

     case IDM_EDIT_TIME:

          GetLocalTime(&st);

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

          pSi->Ae.InsertText(szTemp);

          break;

 

시간과 날짜는 GetLocalTime 함수로 쉽게 구할 수 있고 이 정보를 문자열로 바꿀 때는 wsprintf 함수를 사용하면 된다. 구해진 문자열을 InsertText 함수로 전달하기만 하면 문서의 현재 위치에 날짜와 시간이 문자열 형태로 삽입될 것이다. 날짜와 시간의 표현 형태는 하드 코딩되어 있는데 이 포맷을 사용자가 선택하도록 하고 싶다면 설정 옵션에 포함시키면 된다. 그러나 자주 사용되는 명령이 아니라 그렇게 하지는 않았다.

이 외에 InsertText 함수를 사용하면 편집하고 있는 파일의 경로나, 파일의 이름, 파일의 시간 등을 삽입할 수 있으며 미리 등록해놓은 상용구를 삽입할 수도 있다. 어떤 정보든지 문자열 형태로 변환이 가능한 정보는 모두 삽입할 수 있게 되었다. 다른 파일의 내용을 문서 중간으로 불러 오는 것도 별로 어렵지 않은데 직접 구현해보기 바란다.