.변경 관리

ApiDraw10에서는 편집한 문서를 파일로 저장한다. 파일 입출력 기능을 추가하려면 먼저 현재 편집하고 있는 파일의 이름을 관리해야 한다. 그래야 새로 만든 문서인지 아니면 저장된 파일을 불러온 것인지, 그렇다면 파일의 경로는 어디인지를 있다. 또한 편집중인 문서가 언제 변경되는지를 관리해야 한다. 그래야 문서를 닫을 저장 여부를 판단하여 저장할 것인지 버릴 것인지를 물어 있다. 다음 개의 전역 변수를 추가한다.

 

TCHAR NowFile[MAX_PATH];

BOOL bModified;

 

파일명이므로 MAX_PATH 길이를 가지는 문자형 배열로 선언했으며 변경 여부는 BOOL형이어야 한다. 현재 편집중인 파일은 아주 중요한 정보이므로 보통 타이틀 바에 출력한다. 다음 함수는 파일명을 전달하면 파일명을 NowFile 복사하고 타이틀 바에 프로그램 이름과 편집중인 파일의 경로를 보여준다.

 

void ChangeCaption(TCHAR *Path)

{

   TCHAR Cap[MAX_PATH+64];

 

   lstrcpy(NowFile,Path);

   wsprintf(Cap,"ApiDraw - %s",Path);

   SetWindowText(hWndMain,Cap);

}

 

OnCreate에서 전역 변수를 다음과 같이 초기화한다.

 

LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   ChangeCaption("이름없음");

   bModified=FALSE;

   return 0;

}

 

최초 문서를 만들 때는 수정되지 않은 상태이므로 OnCreate에서 FALSE 초기화하고 NowFile "이름없음"으로 초기화했다. 실행되자 마자 타이틀 바에는 "ApiDraw - 이름없음"이라고 표시될 것이다. 문서를 편집하는 모든 곳에서 bModified TRUE 변경해야 하는데 문서가 조금이라도 변경되는 곳을 모두 찾아 bModified=TRUE 넣어 준다.

 

BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)

{

   ....

   bModified=TRUE;

   return TRUE;

}

 

void DelObject(int idx)

{

   ....

   bModified=TRUE;

}

 

void MoveObjectInArray(int src,int dest)

{

   ....

   bModified=TRUE;

}

 

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

{

   case IDM_POPUP_PROPERTY:

      if (NowSel != -1) {

          if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PROPERTY),

             hWnd,PropertyDlgProc,(LPARAM)arObj[NowSel])==IDOK) {

             InvalidateRect(hWnd,NULL,TRUE);

             bModified=TRUE;

          }

      }

   ....

 

LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   if (DragMode==DM_MOVE || DragMode==DM_SIZE) {

      ....

      if (!IsRectEmpty(&irt)) {

         bModified=TRUE;

 

LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   if (bAction) {

      ....

      if (!IsRectEmpty(&irt)) {

         bModified=TRUE;

 

도형을 새로 삽입할 때와 삭제할 때는 물론이고 정렬 상태를 바꾸거나 이동, 크기 변경할 때도 모두 문서가 변경되는 것이다. 도형의 속성을 변경할 때도 마찬가지이다. 코드를 구조적으로 작성하면 bModified 변경문을 곳으로 집중시킬 수도 있다. 이제 bModified 변수값만 살펴 보면 언제든지 문서가 편집되었는지 아닌지를 있다.