3.ÆíÁý Á¤º¸

°¡.ÆíÁý Á¤º¸ ÀÛ¼º

ÆíÁý Á¤º¸¶õ ij·µÀÇ À§Ä¡³ª ¼±Åà ¿µ¿ª, ºÏ¸¶Å© »óÅ µîÀÇ Á¤º¸¸¦ ÀǹÌÇϴµ¥ ÀÌ Á¤º¸¸¦ ÀúÀåÇß´Ù°¡ ÆÄÀÏÀ» ¿­ ¶§ ´Ù½Ã ÀÐ¾î ¿À¸é ÆíÁýÇÏ´ø ¸ðµç »óŸ¦ ±×´ë·Î º¹¿øÇÒ ¼ö ÀÖ´Ù. ½ÉÁö¾î Ãë¼Ò ·¹ÄÚµå±îÁö º¹±¸ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¾îÁ¦ ÀÛ¾÷ÇÏ´ø ¹®¼­¸¦ ¿À´Ã ¿­¾î¼­ Ãë¼ÒÇÏ´Â °Íµµ °¡´ÉÇØÁø´Ù. ¸ÚÁø ±â´ÉÀ̱â´Â Çѵ¥ ±¸ÇöÇϱâ´Â ´Ù¼Ò º¹ÀâÇÏ´Ù.

ÅؽºÆ® ÆÄÀÏÀº ´ç±ÙÀÇ °íÀ¯ Æ÷¸ËÀÌ ¾Æ´Ï¶ó ÀÓÀÇÀÇ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â °ø¿ë Æ÷¸ËÀ̱⠶§¹®¿¡ ÆÄÀÏÀÇ µÚÂÊ¿¡ ÆíÁý Á¤º¸¸¦ µ¡ºÙ¿©¼­ ÀÛ¼ºÇÒ ¼ö´Â ¾ø´Ù. ÅؽºÆ® ÆÄÀÏÀº ¼ø¼öÇÑ ÅؽºÆ®¸¸ °¡Á®¾ß ÇÑ´Ù. ±×·¡¼­ °¢ ÆÄÀϺ°·Î º°µµÀÇ ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¸¸µé¾î¼­ ÀúÀåÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. ÆíÁý Á¤º¸¿Í °ü·ÃµÈ ¿É¼Ç º¯¼ö´Â SOption ±¸Á¶Ã¼¿¡ ÀÌ¹Ì ¼±¾ðµÇ¾î ÀÖ´Ù.

 

º¯¼ö

¼³¸í

bMakeEditInfo

ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¸¸µé °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù.

EditInfoFolder

ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¸¸µé À§Ä¡. ""ÀÌ¸é ¹®¼­ ÆÄÀÏ°ú °°Àº Æú´õ¿¡ ÀúÀåµÈ´Ù.

EditInfoMask

Æ÷Ç﵃ Á¤º¸ÀÇ Á¾·ù¸¦ ÁöÁ¤ÇÑ´Ù.

bUseEditInfo

ÆíÁý Á¤º¸ ÆÄÀÏÀ» »ç¿ëÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. ¸¸µé±â¸¸ ÇÏ°í »ç¿ëÇÏÁö´Â ¾ÊÀ» ¼öµµ ÀÖ´Ù.

 

ÆíÁý Á¤º¸ÀÇ Á¾·ù´Â ´ÙÀ½°ú °°Àºµ¥ ¿©·¯ °¡Áö Á¤º¸¸¦ µ¿½Ã¿¡ ÁöÁ¤Çϱâ À§ÇØ 2ÀÇ °Åµì½ÂÀ¸·Î ºñÆ®º° Àǹ̸¦ ÇÒ´çÇß´Ù. Option.h¿¡ ÀÌ ¸ÅÅ©·Î »ó¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

#define EI_OFFSET 1

#define EI_SELECTION 2

#define EI_BOOKMARK 4

#define EI_UNDORECORD 8

#define EI_SETTING 0x10

 

Å×½ºÆ®¸¦ À§ÇØ EditInfoMaskÀÇ °ª¿¡ ¸ðµç Ç÷¡±×¸¦ ¼³Á¤ÇØ µÎ¾ú´Âµ¥ SOption::Init¿¡¼­ 0x1f·Î ÃʱâÈ­ÇØ µÎ¾ú´Ù. ÃÖÁ¾ ¿É¼Ç Á¶Á¤½Ã¿¡ ÀûÀýÇÑ Ç÷¡±× Á¶ÇÕÀ¸·Î º¯°æÇÒ °ÍÀÌ´Ù. ÆíÁý Á¤º¸¸¦ ÆÄÀÏ·Î ÀúÀåÇÏ·Á¸é È£½ºÆ®°¡ ÄÁÆ®·ÑÀÇ ÆíÁý Á¤º¸¸¦ ¾×¼¼½ºÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ Ãë¼Ò ·¹ÄÚµå, ºÐÇÒ »óÅ µî¿¡ ´ëÇÑ ¸â¹öµéÀ» public ¿µ¿ª¿¡ ¼±¾ðÇØ µÎ¾ú´Ù. Ãë¼Ò ·¹ÄÚµå´Â ±¸Á¶°¡ º¹ÀâÇϱ⠶§¹®¿¡ È£½ºÆ®°¡ ¸â¹ö¸¦ Á÷Á¢ ¾×¼¼½ºÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. Áß¿äÇÑ ¸â¹ö¸¦ °ø°³ÇØ ¹ö¸®¸é ÇÁ·Î±×·¡¸Ó°¡ ½Ç¼öÇÒ À§ÇèÀÌ ´Ù¼Ò ÀÖ¾î Á¤º¸ ÀºÆó ¿øÄ¢¿¡´Â ¾î±ß³ª´Â ¼ÀÀÌÁö¸¸ Äڵ带 °£ÆíÇÏ°Ô ÀÛ¼ºÇϱâ À§ÇØ ÀÏ´Ü ÀÌ·¸°Ô ÀÛ¼ºÇß´Ù. ºä¿¡´Â ºÏ¸¶Å©¸¦ Á¶»ç ¹× º¯°æÇÒ ¼ö ÀÖ´Â ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

class CApiEditText : public CWindow

{

     ....

     virtual int *GetBookmark() { return arMark; }

     virtual void SetBookmark(int *aMark);

};

 

void CApiEditText::SetBookmark(int *aMark)

{

     memcpy(arMark,aMark,sizeof(int)*MAXBOOKMARK);

     Invalidate(-1);

}

 

GetBookmark ÇÔ¼ö´Â arMark ¹è¿­ÀÇ Æ÷ÀÎÅ͸¸ ¸®ÅÏÇÏ¸é µÈ´Ù. SetBookmark ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ ºÏ¸¶Å© ¹è¿­À» ³»ºÎ ¸â¹ö¿¡ º¹»çÇÏ°í È­¸é¸¸ ´Ù½Ã ±×¸°´Ù. ¼±Åà ¿µ¿ªÀ» Á¶»çÇÏ´Â GetSelect ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. ÇÁ·¹ÀÓ°ú ºä ¸ðµÎ ¼öÁ¤ÇØ¾ß ÇÏ¸ç ¿øÇü»óÀÇ º¯È­°¡ ÀÖÀ¸¹Ç·Î Çì´õ ÆÄÀϵµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void CApiEdit::GetSelect(int &s, int &e, BOOL bRegular/*=TRUE*/)

{

     GetActiveView()->GetSelect(s,e,bRegular);

}

 

void CApiEditText::GetSelect(int &s, int &e,BOOL bRegular/*=TRUE*/)

{

     if (bRegular) {

          s=min(SelStart,SelEnd);

          e=max(SelStart,SelEnd);

     } else {

          s=SelStart;

          e=SelEnd;

     }

}

 

¼±Åà ¹æÇâ±îÁö °°ÀÌ ÀúÀåÇϱâ À§ÇØ Á¤±ÔÈ­ ¿©ºÎ¸¦ ¸¶Áö¸· Àμö·Î Àü´Þ¹Þ´Â´Ù. ±âÁ¸ Äڵ尡 ¿µÇâÀ» ¹ÞÁö ¾Ê¾Æ¾ß ÇϹǷΠÃß°¡µÈ Àμö´Â µðÆúÆ®·Î TRUE°ªÀ» °¡Áø´Ù. ÆíÁý Á¤º¸ ÆÄÀÏÀº ÀÏ´ÜÀº ±¸Á¶Ã¼ÀÌ´Ù. Dangeun.h ¿¡ ´ÙÀ½ ±¸Á¶Ã¼¿Í ÀÌ ±¸Á¶Ã¼¸¦ °ü¸®ÇÏ´Â ÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù.

 

struct EditInfo

{

     TCHAR Text[64];

     int Ver;

     TCHAR FilePath[MAX_PATH];

     DWORD FileSize;

     FILETIME FileTime;

     int EditInfoMask;

 

     int HorzRatio,VertRatio;

     int arViewType[4];

     int ActiveView;

     int BookMark[4][MAXBOOKMARK];

     int off[4];

     int SelStart[4];

     int SelEnd[4];

     BOOL bWrap[4];

     int LineRatio[4];

     LOGFONT logfont[4];

};

....

BOOL GetEiPath(TCHAR *Path, TCHAR *EiPath);

BOOL MakeEditInfo(CApiEdit &Ae, TCHAR *Path, EditInfo &ei);

void UpdateEditInfo(CApiEdit &Ae, TCHAR *Path);

void SaveEditInfo(CApiEdit &Ae, TCHAR *Path);

void LoadEditInfo(CApiEdit &Ae, TCHAR *Path);

 

EditInfo ±¸Á¶Ã¼¿¡´Â °£´ÜÇÑ ¼³¸í ¹®ÀÚ¿­°ú ¹öÀü Á¤º¸, ´ë»ó ÆÄÀÏÀÇ À̸§°ú Å©±â, ½Ã°£ µîÀÌ ÀúÀåµÇ¸ç ¼³Á¤ »óÅÂ¿Í ºÏ¸¶Å©, ¼±Åà ¿µ¿ªÀÇ Á¤º¸µµ °°ÀÌ ÀúÀåµÈ´Ù. ´Ü, Ãë¼Ò ·¹ÄÚµå´Â ±æÀÌ°¡ °¡º¯ÀûÀ̱⠶§¹®¿¡ ÀÌ ±¸Á¶Ã¼ µÚ¿¡ º°µµ·Î ÀÛ¼ºÇϱâ·Î ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÇÔ¼ö´Â ÆíÁý Á¤º¸ ÆÄÀÏÀÇ °æ·Î¸¦ ÀÛ¼ºÇÑ´Ù.

 

// ÆíÁý Á¤º¸ ÆÄÀÏÀÇ À§Ä¡¸¦ ±¸ÇÑ´Ù.

BOOL GetEiPath(TCHAR *Path, TCHAR *EiPath)

{

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

     TCHAR Name[MAX_PATH];

     TCHAR Ext[_MAX_EXT];

 

     _splitpath(Path,Drive,Dir,Name,Ext);

     if (lstrcmpi(Ext,".dgx")==0)

          return FALSE;

     if (lstrlen(Option.EditInfoFolder)==0 || _access(Option.EditInfoFolder,0)!=0) {

          wsprintf(EiPath,"%s%s%s.dgx",Drive,Dir,Name);

     } else {

          wsprintf(EiPath,"%s\\%s.dgx",Option.EditInfoFolder,Name);

     }

     return TRUE;

}

 

EditInfoFolder¿É¼Ç°ú ÇöÀç ¹®¼­ÀÇ °æ·Î¸¦ ¹ÙÅÁÀ¸·Î ÆíÁý Á¤º¸ ÆÄÀÏÀ» ÀÛ¼ºÇÒ À§Ä¡¸¦ ±¸Çϴµ¥ ÆíÁý Á¤º¸ ÆÄÀÏÀ» ÀÛ¼ºÇÒ Æú´õ°¡ ÁöÁ¤µÇ¾î ÀÖ°í À¯È¿Çϸé ÀÌ Æú´õ¿¡ ÀÛ¼ºÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ¹®¼­¿Í °°Àº Æú´õ¸¦ »ç¿ëÇÑ´Ù. ¹®¼­ ÆÄÀÏ°ú °°Àº À̸§À» »ç¿ëÇÏµÇ È®ÀåÀÚ dgx¸¦ »ç¿ëÇÑ´Ù. °°Àº À̸§À» »ç¿ëÇϸç È®ÀåÀÚ¸¸ ´Ù¸£±â ¶§¹®¿¡ ¹®¼­ À̸§¸¸ ¾Ë¸é ÆíÁý Á¤º¸ ÆÄÀϵµ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù.

´Ü, dgx ÆÄÀÏÀ» ÆíÁýÇßÀ» ¶§´Â ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¸¸µéÁö ¾Ê´Â´Ù. ÀÌ ÆÄÀÏÀº ´ç±ÙÀÇ °íÀ¯ ÆÄÀÏÀε¥´Ù ÀÚ±â ÀڽŰú ÆíÁý Á¤º¸ ÆÄÀÏÀÇ À̸§ÀÌ °°±â ¶§¹®¿¡ ÆíÁý Á¤º¸ ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö°¡ ¾ø´Ù. º°µµÀÇ À̸§ ±ÔÄ¢À» ¸¶·ÃÇÏ¸é °¡´ÉÀÌ¾ß ÇÏ°ÚÁö¸¸ ±×·² ÇÊ¿ä±îÁö´Â ¾øÀ» °Í °°´Ù. ÆíÁý Á¤º¸ ÆÄÀÏÀº ´ç±ÙÀÌ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â ÆÄÀÏÀ̹ǷΠÁ÷Á¢ ÆíÁýÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. ´ÙÀ½Àº ÆíÁý Á¤º¸ ÆÄÀÏÀ» ÀÛ¼ºÇÏ´Â ÇÔ¼öµéÀÌ´Ù.

 

// Ãë¼Ò ·¹Äڵ带 Á¦¿ÜÇÑ ÆíÁý Á¤º¸¸¦ ±¸Á¶Ã¼¿¡ ÀÛ¼ºÇÑ´Ù.

BOOL MakeEditInfo(CApiEdit &Ae, TCHAR *Path, EditInfo &ei)

{

     HANDLE hFile;

     int i;

 

     if (Option.EditInfoMask == 0) {

          return FALSE;

     }

 

     // Çì´õ¸¦ ÀÛ¼ºÇÑ´Ù. °æ·Î, Å©±â, ½Ã°£ µîÀ» ±â·ÏÇÑ´Ù.

     memset(&ei,0,sizeof(EditInfo));

     lstrcpy(ei.Text,"´ç±Ù ÆíÁý Á¤º¸ ÆÄÀÏÀÔ´Ï´Ù");

     ei.Ver=120;

     lstrcpy(ei.FilePath,Path);

     hFile=CreateFile(Path,0,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          return FALSE;

     }

     ei.FileSize=GetFileSize(hFile,NULL);

     GetFileTime(hFile,NULL,NULL,&ei.FileTime);

     CloseHandle(hFile);

     ei.EditInfoMask=Option.EditInfoMask;

 

     // ºÐÇÒ »óŸ¦ ÀúÀåÇÏ°í °¢ ºäÀÇ À§Ä¡, ¼±Åà ¿µ¿ª, ºÏ¸¶Å©, ¼³Á¤À» ±â·ÏÇÑ´Ù.

     ei.VertRatio=Ae.VertRatio;

     ei.HorzRatio=Ae.HorzRatio;

     ei.ActiveView=Ae.ActiveView;

     for (i=0;i<4 && Ae.arView[i];i++) {

          ei.arViewType[i]=Ae.arView[i]->ViewType;

 

          if (ei.EditInfoMask & EI_OFFSET) {

              ei.off[i]=Ae.arView[i]->GetOffset();

          }

 

          if (ei.EditInfoMask & EI_SELECTION) {

              Ae.arView[i]->GetSelect(ei.SelStart[i], ei.SelEnd[i], FALSE);

          }

 

          if (ei.EditInfoMask & EI_BOOKMARK) {

              memcpy(ei.BookMark[i],Ae.arView[i]->GetBookmark(),sizeof(int)*MAXBOOKMARK);

          }

 

          if (ei.EditInfoMask & EI_SETTING) {

              ei.bWrap[i]=Ae.GetWrap()==0 ? FALSE:TRUE;

              ei.LineRatio[i]=Ae.GetLineRatio();

              Ae.GetFont(&ei.logfont[i]);

          }

     }

     return TRUE;

}

 

// ÆíÁý Á¤º¸¿¡¼­ Ãë¼Ò ·¹Äڵ带 Á¦¿ÜÇÑ ºÎºÐ¸¸ ÀÛ¼ºÇÑ´Ù.

void UpdateEditInfo(CApiEdit &Ae, TCHAR *Path)

{

     EditInfo ei;

     HANDLE hFile;

     TCHAR EiPath[MAX_PATH];

     DWORD dwWritten;

     DWORD dwCreate;

 

     if (MakeEditInfo(Ae,Path,ei) == FALSE) {

          return;

     }

 

     if (GetEiPath(Path,EiPath)==FALSE) {

          return;

     }

     if (_access(EiPath,0)==0) {

          dwCreate=OPEN_EXISTING;

     } else {

          dwCreate=CREATE_ALWAYS;

     }

     hFile=CreateFile(EiPath,GENERIC_WRITE,0,NULL,

          dwCreate,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          return;

     }

 

     // ÆíÁý Á¤º¸¸¸ ´Ù½Ã ±â·ÏÇÑ´Ù.

     WriteFile(hFile,&ei,sizeof(EditInfo),&dwWritten,NULL);

     CloseHandle(hFile);

}

 

// ÆíÁý Á¤º¸¿Í Ãë¼Ò ·¹ÄÚµå±îÁö ÀÛ¼ºÇÏ¿© ÆÄÀÏ·Î Ãâ·ÂÇÑ´Ù.

void SaveEditInfo(CApiEdit &Ae, TCHAR *Path)

{

     EditInfo ei;

     HANDLE hFile;

     TCHAR EiPath[MAX_PATH];

     DWORD dwWritten;

     UndoRecord *p;

     int datasize;

 

     if (MakeEditInfo(Ae,Path,ei) == FALSE) {

          return;

     }

 

     if (GetEiPath(Path,EiPath)==FALSE) {

          return;

     }

     hFile=CreateFile(EiPath,GENERIC_WRITE,0,NULL,

          CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          return;

     }

 

     // ÆíÁý Á¤º¸ Ãâ·Â

     WriteFile(hFile,&ei,sizeof(EditInfo),&dwWritten,NULL);

 

     // Ãë¼Ò ·¹ÄÚµå ÀúÀå ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é Ãë¼Ò ·¹Äڵ嵵 Ãâ·Â

     if (ei.EditInfoMask & EI_UNDORECORD) {

          WriteFile(hFile,&Ae.nowur,sizeof(int),&dwWritten,NULL);

          p=Ae.pUR;

          // Ãë¼Ò ·¹Äڵ带 ¼øȸÇÑ´Ù. Á¦ÀÏ µÚÀÇ UR_NONEµµ Æ÷ÇԵȴÙ.

          for (;;p++) {

              // ·¹ÄÚµå ¸ÕÀú Ãâ·Â

              WriteFile(hFile,p,sizeof(UndoRecord),&dwWritten,NULL);

              if (p->action == UR_NONE) {

                   datasize=0;

              } else {

                   datasize=_msize(p->data);

              }

              // ·¹ÄÚµåÀÇ µ¥ÀÌÅÍ Ãâ·Â

              WriteFile(hFile,&datasize,sizeof(int),&dwWritten,NULL);

              WriteFile(hFile,p->data,datasize,&dwWritten,NULL);

              if (p->action == UR_NONE) {

                   break;

              }

          }

     }

 

     CloseHandle(hFile);

}

 

MakeEditInfo ÇÔ¼ö´Â ÁöÁ¤ÇÑ ÆÄÀÏÀÇ ÆíÁý Á¤º¸¸¦ Àμö·Î Àü´ÞµÈ ±¸Á¶Ã¼¿¡ ÀÛ¼ºÇÑ´Ù. ±¸Á¶Ã¼ ¾ÕÂÊÀÇ Çì´õ¿¡ ¼³¸í ¹®ÀÚ¿­, ¹öÀü Á¤º¸ µîÀ» ÀÛ¼ºÇÏ°í ÆíÁý Á¤º¸ ÆÄÀÏÀÇ À¯È¿¼º Á¡°ËÀ» À§ÇØ ´ë»ó ÆÄÀÏÀÇ Å©±â¿Í ³¯Â¥ µîµµ ±â·ÏÇß´Ù. ¸¸¾à ¿ÜºÎ¿¡¼­ ÅؽºÆ® ÆÄÀÏÀ» ¼öÁ¤ÇÑ´Ù¸é ÆíÁý Á¤º¸ ÆÄÀÏÀº ¹«È¿À̹ǷΠÀû¿ëÇؼ­´Â ¾ÈµÈ´Ù. ÆÄÀÏÀÇ ³¯Â¥º¸´Ù´Â CRC¸¦ ¾²´Â °ÍÀÌ ´õ Á¤È®ÇÏ°ÚÁö¸¸ ÃßÃ⠽ð£ÀÌ ¿À·¡ °É·Á Àû¿ëÇÏÁö ¾Ê¾Ò´Ù. Çì´õ¸¦ ÀÛ¼ºÇÑ ÈÄ ºäÀÇ ºÐÇÒ »óÅÂ¿Í °¢ ºäÀÇ ¼³Á¤ »óŸ¦ ÀúÀåÇ쵂 ¸¶½ºÅ©°¡ ÁöÁ¤ÇÏ´Â Á¤º¸¸¸ ÀúÀåÇÏ¸é µÈ´Ù.

ÀÌ ÇÔ¼ö´Â ·ÎÄà ³×Æ®¿öÅ©¿¡ ÀÖ´Â ÆÄÀÏ¿¡ ´ëÇؼ­µµ ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÑ´Ù. ±×·¯³ª FTP¿¡ ÀÖ´Â ÆÄÀÏ¿¡ ´ëÇؼ­´Â ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé FTP ¼­¹ö¿¡ ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¾÷·Îµå ÇÑ´Ù´Â °Íµµ ¾î·Æ°í ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÀÓÀÇÀÇ ÆÄÀÏÀ» ¿ø°ÝÁö¿¡ ¿Ã¸®´Â °Íµµ ¹Ù¶÷Á÷ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¶ÇÇÑ ¿ø°ÝÁö¿¡ ÀÖ´Â ÆÄÀÏÀÇ Å©±â¿Í ³¯Â¥¸¦ Á¤È®ÇÏ°Ô ±¸Çϱ⵵ ¾î·Á¿ö ÆíÁý Á¤º¸ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏ´Â °Íµµ ½±Áö ¾Ê´Ù. FTP ÆÄÀÏ¿¡ ´ëÇÑ Ã³¸®´Â º°µµ·Î ÇÏÁö ¾Ê¾Æµµ CreateFileÀÌ ½ÇÆÐÇϹǷΠÀÚ¿¬È÷ ¸®ÅϵȴÙ.

SaveEditInfo ÇÔ¼ö´Â ÆíÁý Á¤º¸»Ó¸¸ ¾Æ´Ï¶ó Ãë¼Ò ·¹ÄÚµå±îÁöµµ °°ÀÌ ÀÛ¼ºÇÏ¿© ÆÄÀÏ·Î Ãâ·ÂÇÑ´Ù. ÆíÁý Á¤º¸´Â MakeEditInfo ÇÔ¼ö°¡ ÀÛ¼ºÇÑ ·¹Äڵ带 ÆÄÀÏ·Î Ãâ·ÂÇϱ⸸ ÇÏ¸é µÇÁö¸¸ Ãë¼Ò ·¹ÄÚµå´Â Á÷Á¢ Á¶»çÇÏ¿© Ãâ·ÂÇÑ´Ù. ¼±µÎ¿¡ ÇöÀç Ãë¼Ò ·¹ÄÚµåÀÇ À妽º¸¦ ¸ÕÀú Ãâ·ÂÇÏ°í pUR ¹è¿­À» ¼øȸÇϸ鼭 UR_NONEÀÌ ³ª¿Ã ¶§±îÁö Ãë¼Ò ·¹ÄÚµå¿Í ±× µ¥ÀÌÅ͸¦ ÆÄÀÏ·Î ¹Ýº¹ Ãâ·ÂÇÑ´Ù. pUR ¹è¿­°ú °ü·Ã º¯¼öµéÀ» ¸ðµÎ ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù°í º¸¸é µÈ´Ù. ´Ü, URSize´Â ·±Å¸ÀÓÀÇ ¹öÆÛ Å©±âÀ̹ǷΠµû·Î Ãâ·ÂÇÏÁö ¾Ê¾Æµµ Ãâ·ÂµÈ ·¹ÄÚµåÀÇ ±æÀ̸¦ ¼¼ º¸¸é ¾Ë ¼ö ÀÖ´Ù.

UpdateEditInfo ÇÔ¼ö´Â ÆíÁý Á¤º¸ ÆÄÀÏ¿¡¼­ Ãë¼Ò ·¹Äڵ带 Á¦¿ÜÇÑ ºÎºÐ¸¸ ´Ù½Ã ÀÛ¼ºÇÑ´Ù. ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÏ´Â ÇÔ¼ö°¡ ÀÌ·¸°Ô ³ª´©¾îÁ® ÀÖ´Â ÀÌÀ¯´Â ÆÄÀÏÀÇ ÆíÁý ¿©ºÎ¿¡ µû¶ó ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÒ Á¤º¸µéÀÌ Á¶±Ý¾¿ ´Ù¸£±â ¶§¹®Àε¥ Àá½Ã ÈÄ ÇÔ¼öµéÀÌ È£ÃâµÇ´Â ºÎºÐÀ» º¸¸é ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù. ´ÙÀ½Àº ÆíÁý ÆíÁý Á¤º¸ ÆÄÀÏÀ» Àоî¿Í Àû¿ëÇÏ´Â ÇÔ¼öÀÌ´Ù.

 

// ÆíÁý Á¤º¸¸¦ Àоî Àû¿ëÇÑ´Ù.

void LoadEditInfo(CApiEdit &Ae, TCHAR *Path)

{

     EditInfo ei;

     HANDLE hFile=INVALID_HANDLE_VALUE;

     HANDLE hDoc=INVALID_HANDLE_VALUE;

     TCHAR EiPath[MAX_PATH];

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

     TCHAR Name[MAX_PATH];

     DWORD dwRead;

     FILETIME FileTime;

     int i;

     int urnum;

     int datasize;

     UndoRecord UR;

 

     // ¹®¼­ Æú´õ¿¡¼­ ¸ÕÀú ã°í ÁöÁ¤µÈ Æú´õµµ ã¾Æ º»´Ù.

     _splitpath(Path,Drive,Dir,Name,NULL);

     wsprintf(EiPath,"%s%s%s.dgx",Drive,Dir,Name);

     if (_access(EiPath,0)!=0) {

          if (lstrlen(Option.EditInfoFolder)!=0) {

              wsprintf(EiPath,"%s\\%s.dgx",Option.EditInfoFolder,Name);

          }

     }

 

     // ÆíÁý Á¤º¸ ÆÄÀÏÀÌ ¾øÀ¸¸é Àû¿ëÇÒ ¼ö ¾ø´Ù.

     hFile=CreateFile(EiPath,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          goto end;

     }

 

     // ¹öÀüÀÌ Æ²¸®°Å³ª ´ë»ó ÆÄÀÏÀÌ Æ²·Áµµ Àû¿ëÇÒ ¼ö ¾ø´Ù.

     ReadFile(hFile,&ei,sizeof(EditInfo),&dwRead,NULL);

     if (ei.Ver != 120 || lstrcmp(ei.FilePath,Path) != 0 || ei.EditInfoMask == 0) {

          goto end;

     }

 

     // ¹®¼­ ÆÄÀÏÀÇ ³¯Â¥¿Í Å©±âµµ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù.

     hDoc=CreateFile(Path,0,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hDoc==INVALID_HANDLE_VALUE) {

          goto end;

     }

     GetFileTime(hDoc,NULL,NULL,&FileTime);

     if ((ei.FileSize != GetFileSize(hDoc,NULL) ||

          (CompareFileTime(&FileTime,&ei.FileTime) != 0))) {

          goto end;

     }

 

     // ºÐÇҵǾî ÀÖÀ¸¸é ºÐÇÒ »óŸ¦ º¹¿øÇÏ°í °¢ ºäÀÇ Å¸ÀÔµµ ±×´ë·Î º¹¿øÇÑ´Ù.

     if (ei.VertRatio) {

          Ae.SplitView(AESPLIT_VERT,ei.VertRatio);

     }

     if (ei.HorzRatio) {

          Ae.SplitView(AESPLIT_HORZ,ei.HorzRatio);

     }

     for (i=0;i<4 && Ae.arView[i];i++) {

          Ae.ChangeViewType(i,ei.arViewType[i]);

     }

 

     // °¢ ºäÀÇ ¼³Á¤ »óŸ¦ ÀÐ¾î º¹±¸ÇÑ´Ù.

     for (i=0;i<4 && Ae.arView[i];i++) {

          if (ei.EditInfoMask & EI_OFFSET) {

              Ae.arView[i]->SetOffset(ei.off[i]);

          }

 

          if (ei.EditInfoMask & EI_SELECTION) {

              if (ei.SelStart[i] != ei.SelEnd[i]) {

                   Ae.arView[i]->SetSelect(ei.SelStart[i], ei.SelEnd[i], FALSE);

              }

          }

 

          if (ei.EditInfoMask & EI_BOOKMARK) {

              Ae.arView[i]->SetBookmark(ei.BookMark[i]);

          }

 

          if (ei.EditInfoMask & EI_SETTING) {

              Ae.arView[i]->SetWrap(ei.bWrap[i] ? Option.nWrap:0);

              Ae.arView[i]->SetLineRatio(ei.LineRatio[i]);

              Ae.arView[i]->SetFont(&ei.logfont[i]);

          }

     }

     Ae.ActiveView=ei.ActiveView;

     SetFocus(Ae.hWnd);

 

     // Ãë¼Ò ·¹Äڵ尡 ±â·ÏµÇ¾î ÀÖÀ¸¸é º¹±¸ÇÑ´Ù.

     if (ei.EditInfoMask & EI_UNDORECORD) {

          ReadFile(hFile,&Ae.nowur,sizeof(int),&dwRead,NULL);

          // ´õ ÀÌ»ó ÀÐÀ» ³»¿ëÀÌ ¾ø°Å³ª UR_NONEÀ» ¸¸³¯ ¶§±îÁö °è¼Ó Àд´Ù.

          for (urnum=0;;urnum++) {

              ReadFile(hFile,&UR,sizeof(UndoRecord),&dwRead,NULL);

              if (dwRead==0) {

                   break;

              }

              // ÇÊ¿ä½Ã Ãë¼Ò ·¹Äڵ带 ÀçÇÒ´çÇÑ´Ù.

              if (urnum==Ae.URSize-1) {

                   Ae.URSize+=640;

                   Ae.pUR=(UndoRecord *)realloc(Ae.pUR,sizeof(UndoRecord)*Ae.URSize);

                   memset(Ae.pUR+Ae.URSize-640,0,sizeof(UndoRecord)*640);

               }

              // ·¹ÄÚµåÀÇ µ¥ÀÌÅ͸¦ Àд´Ù.

              ReadFile(hFile,&datasize,sizeof(int),&dwRead,NULL);

              if (datasize) {

                   UR.data=(TCHAR *)malloc(datasize);

                   ReadFile(hFile,UR.data,datasize,&dwRead,NULL);

              }

              Ae.pUR[urnum]=UR;

              if (UR.action == UR_NONE) {

                   break;

              }

          }

 

          Ae.SaveModified();

     }

 

end:

     if (hDoc!=INVALID_HANDLE_VALUE) CloseHandle(hDoc);

     if (hFile!=INVALID_HANDLE_VALUE) CloseHandle(hFile);

}

 

¹®¼­°¡ ÀÖ´Â Æú´õ¸¦ ¸ÕÀú ã¾Æ º¸°í ¾øÀ¸¸é ÁöÁ¤ Æú´õ¸¦ ã´Â´Ù. ÆíÁý Á¤º¸ ÆÄÀÏÀ» ¾îµð´Ù ÀÛ¼ºÇÒ °ÍÀΰ¡´Â ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÏÁö¸¸ ÆÄÀÏÀ» ãÀ» ¶§´Â Ç×»ó ¾çÂÊÀ» ´Ù µÚÁ® ºÁ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÑ ÈÄ ¿É¼ÇÀ» ¹Ù²Ü ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. À̶§ ¿ì¼± ¼øÀ§ÀÇ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö Àִµ¥ Ç×»ó ¹®¼­ Æú´õ¿¡ ÀÖ´Â ÆÄÀÏÀÌ ¿ì¼±ÀÌ´Ù. ¾çÂÊ ´Ù ¾øÀ¸¸é ÆíÁý Á¤º¸´Â ¹«½ÃµÈ´Ù. ÆíÁý Á¤º¸ ÆÄÀÏÀÌ ÀÖ´Ù¸é ´ÙÀ½À¸·Î À¯È¿¼ºÀ» Á¡°ËÇÑ´Ù. ¹öÀüÀÌ ´Ù¸£°Å³ª ´ë»ó ÆÄÀÏÀÌ ´Ù¸£¸é Á¦´ë·Î µÈ ÆíÁý Á¤º¸ ÆÄÀÏÀÌ ¾Æ´Ï´Ù. ¶ÇÇÑ ÆíÁý Á¤º¸ ÆÄÀÏ¿¡ ±â·ÏµÈ ¹®¼­ ÆÄÀÏÀÇ ½Ã°£°ú Å©±â°¡ ´Þ¶óµµ ¾ÈµÈ´Ù. ¿ÜºÎ¿¡¼­ ÀÌ ÆÄÀÏÀ» ÆíÁýÇß´Ù¸é ´ç±ÙÀÌ ÃÖÈÄ·Î ÀÛ¼ºÇÑ ÆíÁý Á¤º¸´Â ¸ðµÎ ¹«È¿ÀÌ´Ù.

À¯È¿ÇÑ Á¤º¸ ÆÄÀÏÀÌ¸é ±â·ÏµÈ ¸¶½ºÅ©°ª¿¡ µû¶ó Á¤º¸¸¦ Àоî¿Í ApiEdit¿¡ Àû¿ëÇÑ´Ù. ºÐÇҵǾî ÀÖ¾ú´Ù¸é ºÐÇÒµÈ »óŸ¦ ±×´ë·Î º¹¿øÇÏ°í °¢ ºäÀÇ ¿ÀÇÁ¼Â, ¼±Åà ¿µ¿ª, ºÏ¸¶Å© µîµµ ÃÖÈÄ ÀúÀåÇÒ ¶§ÀÇ »óÅÂ¿Í ¶È°°ÀÌ ¸¸µç´Ù. Ãë¼Ò ·¹ÄÚµå´Â È£½ºÆ®°¡ ¸Þ¸ð¸® ÇÒ´ç±îÁö ÇØ °¡¸é¼­ Á÷Á¢ ¸¸µé¾î¾ß ÇÑ´Ù. °ü·Ã ÇÔ¼ö¸¦ ´Ù ¸¸µé¾î µÎ¾úÀ¸¹Ç·Î ÀÌÁ¦ ÇÊ¿äÇÒ ¶§ ÇÔ¼ö¸¦ ºÎ¸£±â¸¸ ÇÏ¸é µÈ´Ù. ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÒ ½ÃÁ¡Àº ÆÄÀÏ ÀúÀå¿¡ ¼º°øÇßÀ» ¶§ÀÌ´Ù.

 

BOOL SaveToFile(HWND hChild,TCHAR *Path)

{

     ....

     if (Result) {

          lstrcpy(pSi->NowFile,Path);

          pSi->Ae.SetModified(FALSE);

        // ÆíÁý Á¤º¸ ÆÄÀÏÀ» ÀÛ¼ºÇÑ´Ù.

        if (Option.bMakeEditInfo) {

           SaveEditInfo(pSi->Ae,Path);

        }

          tie.mask=TCIF_IMAGE;

          tie.iImage=0;

          idx=FindFileTab(pSi->NowFile);

          TabCtrl_SetItem(hFileTab,idx,&tie);

     }

     free(TextBuf);

     return Result;

}

 

SaveEditInfo ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸¶½ºÅ©¿¡ ÁöÁ¤µÈ ¸ðµç ÆíÁý Á¤º¸¸¦ ÀÛ¼ºÇÏ¿© ÆÄÀÏ·Î ±â·ÏÇÑ´Ù. ¹®¼­Ã¢À» ´ÝÀ» ¶§´Â ÆíÁý ±â·ÏÀ» °»½ÅÇϱ⸸ ÇÏ¸é µÈ´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     case WM_DESTROY:

        // ÆíÁý Á¤º¸¸¦ °»½ÅÇÑ´Ù.

        if (Option.bMakeEditInfo && Option.bUpdateEditInfo &&

           strncmp(pSi->NowFile,"À̸§¾øÀ½",8) &&

           pSi->Ae.GetModified()==FALSE) {

           UpdateEditInfo(pSi->Ae,pSi->NowFile);

        }

          DeleteFileTab(pSi->NowFile);

          DestroyWindow(pSi->Ae.hWnd);

 

ºñ·Ï ¹®¼­¸¦ ÆíÁýÇÑ ÈÄ ÀúÀåÇÏÁö ¾Ê¾Ò´õ¶óµµ ÆíÁý Á¤º¸´Â °»½ÅÇÑ´Ù. ±×·¡¼­ ¹®¼­¸¦ ¿­¾ú´Ù°¡ ij·µ À§Ä¡¸¸ ¿Å±â°í ´Ù½Ã ´Ý¾Æµµ ÆíÁý Á¤º¸°¡ °»½ÅµÈ´Ù. À̶§´Â Ãë¼Ò ·¹ÄÚµå´Â ÀúÀåÇÒ ÇÊ¿ä°¡ ¾ø°í ÆíÁý Á¤º¸¸¸ ÀúÀåÇÏ¸é µÈ´Ù. Ãë¼Ò ·¹ÄÚµå´Â ±×´ë·Î À¯ÁöÇϱâ À§ÇØ Á¤º¸ ÆÄÀÏÀÌ ÀÌ¹Ì ÀÖÀ¸¸é OPEN_EXISTING Ç÷¡±×·Î ÆÄÀÏÀ» ¿­¾î ±â·ÏÇÑ´Ù. ¹°·Ð ¾øÀ¸¸é ´Ù½Ã ¸¸µç´Ù.

¹®¼­¸¦ Á¶±ÝÀÌ¶óµµ ÆíÁýÇßÀ¸¸é ÆíÁý Á¤º¸¸¦ °»½ÅÇÏÁö ¾Ê´Â´Ù. À̶§´Â ÆíÁý ÈÄ ÆíÁý °á°ú¸¦ ¹ö¸®´Â °ÍÀ̸ç À̶§ÀÇ ÆíÁý Á¤º¸´Â ÆÄÀÏÀ» ´Ù½Ã ¿­¾úÀ» ¶§ »ç¿ëÇÒ ¼ö ¾ø´Ù. MakeEditInfo´Â ApiEdit °´Ã¼ÀÇ ÆíÁý Á¤º¸¸¦ ÃëÇϴµ¥ ºñÇØ ÀÌ ¹®¼­°¡ ÀúÀåµÇÁö ¾Ê¾Ò´Ù¸é Á¶»çµÈ ÆíÁý Á¤º¸´Â ¹«È¿ÀÎ °ÍÀÌ´Ù. ¿©±â¼­ ÆíÁý Á¤º¸¸¦ °»½ÅÇÏ´Â °ÍÀº ¹®¼­´Â ÆíÁýµÇÁö ¾Ê¾Ò´Âµ¥ ij·µ À̵¿, ºÏ¸¶Å© Á¶Á¤, ºä ºÐÇÒ »óÅ º¯°æ µî¸¸ ´Ù½Ã ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù.

ÆíÁý Á¤º¸¸¦ ´Ù½Ã Àоî¿Ã ½ÃÁ¡Àº ÆÄÀÏÀ» Àоî¿Ã ¶§Àε¥ bUseEditInfo ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ» ¶§ ÆíÁý Á¤º¸¸¦ ºÒ·¯¿Í ÃÖÈÄ ÆíÁýÇÏ´ø »óÅ·Π¸¸µç´Ù. ¸¸¾à ÀÌ ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÁö ¾Ê´Ù¸é ÆíÁý Á¤º¸°¡ ÀÖ´õ¶óµµ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

 

BOOL OpenFileToChild(HWND hChild, TCHAR *Path)

{

     ....

     pSi->Ae.SetModified(FALSE);

     lstrcpy(pSi->NowFile,Path);

     EncodePath(Path,EncPath);

     SetWindowText(hChild,EncPath);

 

    // ÆíÁý Á¤º¸¸¦ Àоî Àû¿ëÇÑ´Ù.

    if (Option.bUseEditInfo) {

        LoadEditInfo(pSi->Ae,Path);

    }

     return TRUE;

}

 

ÆíÁý Á¤º¸ ÆÄÀÏ¿¡ ±â·ÏµÈ ´ë·Î ÆíÁý »óÅ°¡ ±×´ë·Î º¹±¸µÇ¸ç ÀúÀåÇϱâ ÀüÀÇ »óÅÂ¿Í ¿ÏÀüÈ÷ ¶È°°Àº »óÅ·Π´ÙÀ½ ÀÛ¾÷À» °è¼ÓÇÒ ¼ö ÀÖ´Ù.

³ª.ÆÄÀÏ ¼³Á¤

Áö±Ý±îÁö ¸¸µç ±â´Éµé¿¡ ´ëÇÑ ¿É¼Ç Á¶Á¤ ´ëÈ­»óÀÚ¸¦ ÀÛ¼ºÇÑ´Ù. ´ëÈ­»óÀÚ´Â ¸®¼Ò½º¿¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç ºñ·Ï ºñ¾î ÀÖÁö¸¸ ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀúµµ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ´Ù. ³»¿ë¸¸ ä¿ì¸é µÈ´Ù. ÆÄÀÏ ¿É¼Ç ´ëÈ­»óÀÚÀÇ ÇÁ·Î½ÃÀú´Â ´ÙÀ½°ú °°´Ù.

 

BOOL CALLBACK FileDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HWND hCon;

     int i;

     TCHAR szTemp[MAX_PATH];

     TCHAR Folder[MAX_PATH];

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

 

     switch(iMessage) {

     case WM_INITDIALOG:

          hCon=GetDlgItem(hDlg,IDC_BACKUPLEVEL);

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"0(¹é¾÷ÇÏÁö ¾ÊÀ½)");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"1(ÇÑ ´Ü°è¸¸ ¹é¾÷)");

          for (i=2;i<32;i++) {

              wsprintf(szTemp,"%d´Ü°è ¹é¾÷",i);

              SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)szTemp);

          }

 

          hCon=GetDlgItem(hDlg,IDC_BACKUPNAMING);

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹®¼­.txt -> ¹®¼­.bak");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹®¼­.txt -> ¹®¼­_bak.txt");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹®¼­.txt -> ¹®¼­_¹é¾÷.txt");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹®¼­.txt -> ¹®¼­.txt.bak");

 

          SendDlgItemMessage(hDlg,IDC_SPINAUTOSAVE,UDM_SETRANGE,0,MAKELPARAM(1440,0));

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))   {

          case IDC_BRBACKUPFOLDER:

              GetWindowText(GetDlgItem(hDlg,IDC_BACKUPFOLDER),szTemp,MAX_PATH);

              if (BrowseFolder(hDlg,"¹é¾÷ ÆÄÀÏÀ» ÀúÀåÇÒ Æú´õ¸¦ ¼±ÅÃÇϽʽÿÀ.",

                   szTemp,Folder)==TRUE) {

                   SetDlgItemText(hDlg,IDC_BACKUPFOLDER,Folder);

              }

              PropSheet_Changed(GetParent(hDlg),hDlg);

              break;

          case IDC_BRDGBACKUP:

              GetModuleFileName(g_hInst,Folder,MAX_PATH);

              _splitpath(Folder,Drive,Dir,NULL,NULL);

              wsprintf(Folder,"%s%sBackUp",Drive,Dir);

              if (_access(Folder,0) != 0) {

                   if (MessageBox(hDlg,"ÀÌ Æú´õ¸¦ Áö±Ý ¸¸µå½Ã°Ú½À´Ï±î?",

                        "Áú¹®",MB_YESNO)==IDNO)

                        break;

                   CreateDirectory(Folder,NULL);

              }

              SetDlgItemText(hDlg,IDC_BACKUPFOLDER,Folder);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              break;

          case IDC_BREDITINFOFOLDER:

              GetWindowText(GetDlgItem(hDlg,IDC_EDITINFOFOLDER),szTemp,MAX_PATH);

              if (BrowseFolder(hDlg,"ÆíÁý Á¤º¸ ÆÄÀÏÀ» ÀúÀåÇÒ Æú´õ¸¦ ¼±ÅÃÇϽʽÿÀ.",

                   szTemp,Folder)==TRUE) {

                   SetDlgItemText(hDlg,IDC_EDITINFOFOLDER,Folder);

              }

              PropSheet_Changed(GetParent(hDlg),hDlg);

              break;

          case IDC_BRDGEDITINFO:

              GetModuleFileName(g_hInst,Folder,MAX_PATH);

              _splitpath(Folder,Drive,Dir,NULL,NULL);

              wsprintf(Folder,"%s%sEditInfo",Drive,Dir);

              if (_access(Folder,0) != 0) {

                   if (MessageBox(hDlg,"ÀÌ Æú´õ¸¦ Áö±Ý ¸¸µå½Ã°Ú½À´Ï±î?",

                        "Áú¹®",MB_YESNO)==IDNO)

                        break;

                   CreateDirectory(Folder,NULL);

              }

              SetDlgItemText(hDlg,IDC_EDITINFOFOLDER,Folder);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              break;

          case IDC_MAKEEDITINFO:

              AdjustDlgUI(8,hDlg);

          case IDC_UPDATEEDITINFO:

          case IDC_EIOFFSET:

          case IDC_EISELECTION:

          case IDC_EIBOOKMARK:

          case IDC_EIUNDORECORD:

          case IDC_EISETTING:

          case IDC_USEEDITINFO:

              PropSheet_Changed(GetParent(hDlg),hDlg);

              break;

          }

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          hdr=(LPNMHDR)lParam;

          switch (hdr->code) {

          case PSN_SETACTIVE:

               g_StartPage=8;

               SendDlgItemMessage(hDlg,IDC_BACKUPLEVEL,CB_SETCURSEL,NewOption.BackupLevel,0);

               SendDlgItemMessage(hDlg,IDC_BACKUPNAMING,CB_SETCURSEL,NewOption.BackupNaming,0);

              SetDlgItemText(hDlg,IDC_BACKUPFOLDER,NewOption.BackupFolder);

              SetDlgItemInt(hDlg,IDC_AUTOSAVE,NewOption.AutoSaveInterval,FALSE);

              CheckDlgButton(hDlg,IDC_MAKEEDITINFO,NewOption.bMakeEditInfo);

              CheckDlgButton(hDlg,IDC_UPDATEEDITINFO,NewOption.bUpdateEditInfo);

              CheckDlgButton(hDlg,IDC_USEEDITINFO,NewOption.bUseEditInfo);

              CheckDlgButton(hDlg,IDC_EIOFFSET,NewOption.EditInfoMask & EI_OFFSET);

              CheckDlgButton(hDlg,IDC_EISELECTION,NewOption.EditInfoMask & EI_SELECTION);

              CheckDlgButton(hDlg,IDC_EIBOOKMARK,NewOption.EditInfoMask & EI_BOOKMARK);

              CheckDlgButton(hDlg,IDC_EIUNDORECORD,NewOption.EditInfoMask & EI_UNDORECORD);

              CheckDlgButton(hDlg,IDC_EISETTING,NewOption.EditInfoMask & EI_SETTING);

              SetDlgItemText(hDlg,IDC_EDITINFOFOLDER,NewOption.EditInfoFolder);

              AdjustDlgUI(8,hDlg);

              return TRUE;

          case PSN_APPLY:

              ApplyNow();

              return TRUE;

          case PSN_KILLACTIVE:

               NewOption.BackupLevel=SendDlgItemMessage(hDlg,IDC_BACKUPLEVEL,CB_GETCURSEL,0,0);

               NewOption.BackupNaming=SendDlgItemMessage(hDlg,IDC_BACKUPNAMING,CB_GETCURSEL,0,0);

              GetDlgItemText(hDlg,IDC_BACKUPFOLDER,NewOption.BackupFolder,MAX_PATH);

              NewOption.AutoSaveInterval=GetDlgItemInt(hDlg,IDC_AUTOSAVE,NULL,FALSE);

              NewOption.bMakeEditInfo=IsDlgButtonChecked(hDlg,IDC_MAKEEDITINFO);

              NewOption.bUpdateEditInfo=IsDlgButtonChecked(hDlg,IDC_UPDATEEDITINFO);

              NewOption.bUseEditInfo=IsDlgButtonChecked(hDlg,IDC_USEEDITINFO);

              NewOption.EditInfoMask=0;

              if (IsDlgButtonChecked(hDlg,IDC_EIOFFSET)) NewOption.EditInfoMask |= EI_OFFSET;

              if (IsDlgButtonChecked(hDlg,IDC_EISELECTION)) NewOption.EditInfoMask |= EI_SELECTION;

              if (IsDlgButtonChecked(hDlg,IDC_EIBOOKMARK)) NewOption.EditInfoMask |= EI_BOOKMARK;

              if (IsDlgButtonChecked(hDlg,IDC_EIUNDORECORD)) NewOption.EditInfoMask |= EI_UNDORECORD;

              if (IsDlgButtonChecked(hDlg,IDC_EISETTING)) NewOption.EditInfoMask |= EI_SETTING;

              GetDlgItemText(hDlg,IDC_EDITINFOFOLDER,NewOption.EditInfoFolder,MAX_PATH);

              return TRUE;

          }

          break;

     }

     return FALSE;

}

 

Áö±Ý±îÁö ¸¸µé¾î¿Ô´ø ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú¿Í °ÅÀÇ µ¿ÀÏÇÏ´Ù. AdjustDlgUI¿¡¼­ ÆíÁý ±â·Ï°ú °ü·ÃÇÑ ÄÁÆ®·ÑÀÇ »óŸ¦ °ü¸®ÇØ¾ß ÇÑ´Ù.

 

void AdjustDlgUI(int Page,HWND hDlg)

{

     switch (Page) {

          ....

     case 8:

          if (IsDlgButtonChecked(hDlg,IDC_MAKEEDITINFO) == BST_CHECKED) {

              EnableWindow(GetDlgItem(hDlg,IDC_UPDATEEDITINFO),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIOFFSET),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EISELECTION),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIBOOKMARK),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIUNDORECORD),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EISETTING),TRUE);

          } else {

              EnableWindow(GetDlgItem(hDlg,IDC_UPDATEEDITINFO),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIOFFSET),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EISELECTION),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIBOOKMARK),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EIUNDORECORD),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EISETTING),FALSE);

          }

          break;

     }

}

 

ApplyNow¿¡¼­ ÀÚµ¿ ÀúÀå °£°ÝÀÌ º¯°æµÇ¾úÀ» ¶§ÀÇ Ã³¸®¸¦ ÇÑ´Ù. ´Ù¸¥ ¿É¼ÇÀº °ü·Ã ÇÔ¼ö¿¡¼­ ÇÊ¿äÇÒ ¶§¸¶´Ù ÂüÁ¶ÇϹǷΠÁï½Ã Àû¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

void ApplyNow()

{

     ....

     if (Option.AutoSaveInterval != NewOption.AutoSaveInterval) {

          if (Option.AutoSaveInterval) {

              SetTimer(g_hFrameWnd,1,Option.AutoSaveInterval*1000*60,NULL);

          } else {

              KillTimer(g_hFrameWnd,1);

          }

     }

 

     hChild=GetWindow(g_hMDIClient,GW_CHILD);

     while (hChild) {

     ....

 

ÀÚµ¿ ÀúÀå ÁֱⰡ º¯°æµÇ¾ú°í 0ÀÌ ¾Æ´Ò ¶§ ŸÀ̸Ӹ¦ ´Ù½Ã ¼³Ä¡ÇÑ´Ù. 0À¸·Î º¯°æµÇ¾úÀ¸¸é ŸÀ̸Ӹ¦ ÇØÁ¦ÇÑ´Ù. ¿¬°á »óÅ´ ´Ù¼Ò º¹ÀâÇϹǷΠº°µµÀÇ ÆäÀÌÁö¸¦ µû·Î ¸¸µç´Ù.

 

BOOL CALLBACK AssociateDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     int i;

     FILETIME FileTime;

     TCHAR szTemp[MAX_PATH];

     TCHAR lpSubKey[MAX_PATH];

     LONG Result;

     HKEY key;

     DWORD Size;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          RegOpenKeyEx(SHCR,NULL,0,KEY_READ,&key);

          Result=ERROR_SUCCESS;

          for (i=0;Result==ERROR_SUCCESS;i++) {

              Size=MAX_PATH;

              Result=RegEnumKeyEx(key,i,lpSubKey,&Size,NULL,NULL,NULL,&FileTime);

              if (Result==ERROR_SUCCESS) {

                   if (lpSubKey[0]=='.') {

                        SendDlgItemMessage(hDlg,IDC_EXTENSIONS,CB_ADDSTRING,0,(LPARAM)lpSubKey);

                   }

              }

          }

          Result=ERROR_SUCCESS;

          for (i=0;Result==ERROR_SUCCESS;i++) {

              Size=MAX_PATH;

              Result=RegEnumKeyEx(key,i,lpSubKey,&Size,NULL,NULL,NULL,&FileTime);

              if (Result==ERROR_SUCCESS) {

                   if (strncmp(lpSubKey,"Dangeun.",8)==0) {

                        SendDlgItemMessage(hDlg,IDC_ASSOEXTENSION,LB_ADDSTRING,0,(LPARAM)lpSubKey+7);

                   }

              }

          }

          RegCloseKey(key);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))   {

          case IDC_EXTENSIONS:

              switch (HIWORD(wParam)) {

              case CBN_SELCHANGE:

                   i=SendDlgItemMessage(hDlg,IDC_EXTENSIONS,CB_GETCURSEL,0,0);

                   SendDlgItemMessage(hDlg,IDC_EXTENSIONS,CB_GETLBTEXT,i,(LPARAM)lpSubKey);

                   SHRegReadString(SHCR,lpSubKey,NULL,"",szTemp,MAX_PATH);

                   SetDlgItemText(hDlg,IDC_EXTDESC,szTemp);

                   break;

              }

              break;

          case IDC_MAKEASSOCIATE:

              GetDlgItemText(hDlg,IDC_EXTENSIONS,lpSubKey,MAX_PATH);

              GetDlgItemText(hDlg,IDC_EXTDESC,szTemp,MAX_PATH);

              if (lpSubKey[0]=='.') {

                   MakeAssociate(lpSubKey,szTemp);

                   SendDlgItemMessage(hDlg,IDC_ASSOEXTENSION,LB_ADDSTRING,0,(LPARAM)lpSubKey);

              }

              break;

          case IDC_UNASSOCIATE:

              i=SendDlgItemMessage(hDlg,IDC_ASSOEXTENSION,LB_GETCURSEL,0,0);

              if (i != -1) {

                   SendDlgItemMessage(hDlg,IDC_ASSOEXTENSION,LB_GETTEXT,i,(LPARAM)szTemp);

                   UnAssociate(szTemp);

                   SendDlgItemMessage(hDlg,IDC_ASSOEXTENSION,LB_DELETESTRING,i,0);

              }

              break;

          }

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          hdr=(LPNMHDR)lParam;

          switch (hdr->code) {

          case PSN_SETACTIVE:

              g_StartPage=9;

              return TRUE;

          case PSN_APPLY:

              ApplyNow();

              return TRUE;

          case PSN_KILLACTIVE:

              return TRUE;

          }

          break;

     }

     return FALSE;

}

 

ÀÌ ¿É¼ÇÀº ´Ù¸¥ ¿É¼Ç°ú´Â ´Þ¸® ¹öÆ°À» ´©¸£´Â Áï½Ã Àû¿ëµÈ´Ù. ¿¬°á °ü°è´Â ´ç±ÙÀÌ ±â¾ïÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ½Ã½ºÅÛ ·¹Áö½ºÆ®¸®¿¡ ±â·ÏµÇ´Â °ÍÀ̱⠶§¹®¿¡ Çѹø ¿¬°á »óŸ¦ ¹Ù²Ù¸é ´Ù½Ã ¿ø·¡´ë·Î µ¹·Á ÁÖÁö ¾Ê´Â ÇÑ Ãë¼ÒÇÒ ¼ö ¾ø´Ù. Å×½ºÆ®°¡ ³¡³µÀ¸¹Ç·Î ¿É¼ÇÀ» ´Ù½Ã Á¶Á¤ÇÑ´Ù.

 

void SOption::Init()

{

     ....

    BackupLevel=0;

     lstrcpy(BackupFolder,"");

     BackupNaming=1;

    AutoSaveInterval=0;

    bMakeEditInfo=FALSE;

     bUpdateEditInfo=TRUE;

     lstrcpy(EditInfoFolder,"");

     EditInfoMask=0x1f;

    bUseEditInfo=FALSE;

}

 

¹é¾÷, ÀÚµ¿ ÀúÀå, ÆíÁý Á¤º¸ ÀÛ¼º, »ç¿ë µîÀÇ ¿É¼ÇÀ» ¸ðµÎ ÇØÁ¦Çß´Ù. ¾Ö½á ¸¸µç ±â´ÉµéÀ̱â´Â ÇÏÁö¸¸ ÇÁ·Î±×·¥ÀÌ ÀÚµ¿À¸·Î ¹º°¡¸¦ ÇÏ´Â ¼­ºñ½º´Â ÀÏ´ÜÀº ÇÏÁö ¾Ê´Â °ÍÀ¸·Î ¼³Á¤ÇØ ³õ°í »ç¿ëÀÚ°¡ ÇÊ¿ä·Î ÇÒ ¶§¸¸ ¼±ÅÃÀûÀ¸·Î ¾µ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ´ç±ÙÀ» ¸Þ¸ðÀå ¼öÁØÀ¸·Î ¾²°í ½ÍÀº »ç¶÷µéÀº ¹é¾÷ÀÌ´Ï ÆíÁý Á¤º¸´Ï ÇÏ´Â ±â´ÉµéÀ» ±ÍÂú°Ô ¿©±æ °ÍÀÌ¸ç »ç½Ç ´ëºÎºÐÀÇ »ç¿ëÀÚµéÀÌ ±×·¸´Ù.