1.ÇѲ¨¹ø¿¡ ¹¯±â

°¡.¹ÌÀúÀå È®ÀÎ

ÀÌ Àå¿¡¼­´Â ÀÛÁö¸¸ À¯¿ëÇÑ ÆíÀÇ ±â´ÉµéÀ» ¸¹ÀÌ Ãß°¡ÇÒ °ÍÀÌ´Ù. ÀÌ ±â´ÉµéÀº È£½ºÆ®°¡ Á¦°øÇϹǷΠ´ëºÎºÐÀÇ ÇÔ¼öµéÀÌ È£½ºÆ®¿¡ ÀÛ¼ºµÇ´Âµ¥ ½Ç½ÀÀÇ ÆíÀǸ¦ À§ÇØ Dangeun.h¿¡ ¾ÕÀ¸·Î ÀÛ¼ºÇÒ ÇÔ¼öµé¿¡ ´ëÇÑ ¿øÇüÀ» ¸ÕÀú ¼±¾ðÇØ ³õÀÚ.

 

BOOL TestNoSaved();

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

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

BOOL ResolveShortCut(TCHAR *ShortCut, TCHAR *Path);

void InsertFile(CApiEditText *pView);

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

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

 

´ç±Ù »Ó¸¸ ¾Æ´Ï¶ó ¹®¼­¸¦ ¸¸µé¾î ³»´Â ÇÁ·Î±×·¥Àº Á¾·á Àü¿¡ ¹ÌÀúÀå ¹®¼­¸¦ È®ÀÎÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. ºÒÀÇÀÇ »ç°í·Î ¹®¼­¸¦ ÀÒÀ» °¡´É¼ºÀÌ ÀÖÀ¸¹Ç·Î ²À ÇÊ¿äÇÑ ±â´ÉÀ̱â´Â ÇÏÁö¸¸ ´ç±Ùó·³ ¿©·¯ °³ÀÇ ¹®¼­¸¦ ¿©´Â ÇÁ·Î±×·¥¿¡¼­´Â ÀÌ ±â´ÉÀÌ ¶§·Î´Â ºÒÆíÇÑ °æ¿ì°¡ ÀÖ´Ù. ¸Å ¹®¼­¸¶´Ù °³º°ÀûÀ¸·Î Áú¹®À» ÇϹǷΠ¹«Ã´ ±ÍÂú´Ù. ´Ü¼øÈ÷ Âü°í¿ëÀ¸·Î ¹®¼­¸¦ ¿­¾î¼­ ÁýÀû°Å¸®´Â °æ¿ìµµ Àִµ¥ ÀÌ·² ¶§¸¶´Ù Áú¹®À» ÇϹǷΠ¥ÁõÀÌ ³­´Ù.

10°³ Á¤µµÀÇ ¹®¼­¸¦ ¿­¾î¼­ ÀÌ°Í Àú°Í ÆíÁýÇØ ºÃ´Ù¸é 10¹ø ¾Æ´Ï¿À ¶Ç´Â ¿¹ ¹öưÀ» ´­·¯¾ß ÇÑ´Ù. ½ÉÇÒ °æ¿ì´Â ¾Æ¿¹ ÀÛ¾÷ °ü¸®ÀÚ¸¦ ¿­¾î ÇÁ·Î±×·¥À» Á׿© ¹ö¸®°í ½ÍÀº Ãæµ¿ÀÌ µé±â±îÁö ÇÑ´Ù. ±×·¡¼­ °³º° ¹®¼­¸¶´Ù ÀÏÀÏÀÌ ÀúÀå ¿©ºÎ¸¦ ¹¯Áö ¸»°í ´ëÈ­»óÀÚ¸¦ ÅëÇØ ÇѲ¨¹ø¿¡ Áú¹®ÇÏ¿© ÀüºÎ ÀúÀåÇϵçÁö ÀüºÎ ¹ö¸®µçÁö¸¦ Çѹø¸¸ ÀÀ´äÇÏ°Ô ÇÑ´Ù.

 

BOOL TestNoSaved()

{

     HWND hCloseChild;

     SInfo *pSi;

 

     hCloseChild=GetWindow(g_hMDIClient,GW_CHILD);

     while (hCloseChild) {

          pSi=(SInfo *)GetWindowLong(hCloseChild,0);

          if (pSi->Ae.GetModified()) {

              return TRUE;

          }

          hCloseChild=GetWindow(hCloseChild,GW_HWNDNEXT);

     }

     return FALSE;

}

 

ÀÌ ÇÔ¼ö´Â ¹ÌÀúÀå ¹®¼­°¡ ÀÖ´ÂÁö¸¸ È®ÀÎÇÑ´Ù. OnClose¿Í OnQueryEndSessionÀº ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

BOOL OnClose(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

#ifndef _DEBUG

     if (TestNoSaved()) {

          return DialogBox(g_hInst,MAKEINTRESOURCE(IDD_CONFIRMSAVE),

              g_hFrameWnd,ConfirmSaveProc);

     }

#endif

     return FALSE;

}

 

BOOL OnQueryEndSession(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     BOOL Result;

 

     if (TestNoSaved()) {

          Result=DialogBox(g_hInst,MAKEINTRESOURCE(IDD_CONFIRMSAVE),

              g_hFrameWnd,ConfirmSaveProc);

          if (Result) {

               return TRUE;

          }

     }

     OnDestroy(hWnd,0,0);

     return FALSE;

}

 

¹Ì ÀúÀå ¹®¼­°¡ ÀÖÀ¸¸é ¹Ù·Î Áú¹®ÇÏÁö ¾Ê°í º°µµÀÇ ´ëÈ­»óÀÚ¸¦ ¶ç¿î´Ù. ´Ü OnClose´Â µð¹ö±× ¹öÀü¿¡¼­ ¹ÌÀúÀå ¹®¼­¸¦ È®ÀÎÇÏÁö ¾ÊÀ¸¹Ç·Î °³¹ßÁß¿¡´Â Àá½Ã #ifdef _DEBUG¸¦ ÁÖ¼® ó¸®Çϰí Å×½ºÆ®ÇØ¾ß ÇÑ´Ù.

 

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

{

     HWND hList;

     LVCOLUMN COL;

     SInfo *pSi;

     HWND hChild;

     LVITEM LI;

     int count,i,idx;

     TCHAR TextBuf[512],Content[1024];

     TCHAR Path[MAX_PATH];

     TCITEM tie;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          hList=GetDlgItem(hDlg,IDC_LISTNOSAVED);

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=250;

          COL.pszText="ÆÄÀϸí";

          COL.iSubItem=0;

          ListView_InsertColumn(hList,0,&COL);

 

          COL.cx=250;

          COL.pszText="³»¿ë";

          COL.iSubItem=1;

          ListView_InsertColumn(hList,1,&COL);

          ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);

 

          // ÆÄÀÏ ÅÇÀÇ ¼ø¼­´ë·Î º¸¿©ÁØ´Ù.

          count=TabCtrl_GetItemCount(hFileTab);

          for (i=0,idx=0;i<count;i++) {

              tie.mask=TCIF_PARAM;

              TabCtrl_GetItem(hFileTab,i,&tie);

              hChild=FindChildWithFile((TCHAR *)tie.lParam);

              pSi=(SInfo *)GetWindowLong(hChild,0);

              if (pSi->Ae.GetModified()) {

                   LI.mask=LVIF_TEXT | LVIF_PARAM;

                   LI.iItem=idx;

                   LI.iSubItem=0;

                   LI.pszText=pSi->NowFile;

                   LI.lParam=(LPARAM)hChild;

                   ListView_InsertItem(hList,&LI);

 

                   memset(TextBuf,0,512);

                   pSi->Ae.GetText(TextBuf,500);

                   ReplaceCtrlString(TextBuf,512,Content,1024);

                   ListView_SetItemText(hList,idx,1,Content);

                   idx++;

              }

          }

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_BTNSAVEALL:

          case IDC_BTNSAVECHECKED:

              hList=GetDlgItem(hDlg,IDC_LISTNOSAVED);

              for (idx=0;idx<ListView_GetItemCount(hList);idx++) {

                   if (LOWORD(wParam)==IDC_BTNSAVECHECKED) {

                        if (ListView_GetCheckState(hList,idx)==FALSE) {

                            continue;

                        }

                   }

                   LI.mask=LVIF_PARAM | LVIF_TEXT;

                   LI.iItem=idx;

                   LI.iSubItem=0;

                   LI.pszText=Path;

                   LI.cchTextMax=MAX_PATH;

                   ListView_GetItem(hList,&LI);

                   // ´ë»ó ÆÄÀÏÀ» ¼±ÅÃÇØ ÁØ´Ù.

                   ListView_SetItemState(hList,-1,0,LVIS_SELECTED | LVIS_FOCUSED);

                   ListView_SetItemState(hList,idx,

                        LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);

                   SendMessage(g_hMDIClient,WM_MDIACTIVATE,(WPARAM)LI.lParam,0);

                   TabCtrl_SetCurSel(hFileTab,FindFileTab(Path));

                   // ½ÇÆÐ ¶Ç´Â Ãë¼Ò½Ã Á¾·á ÀÚü¸¦ Ãë¼ÒÇÑ´Ù.

                   if (Save((HWND)LI.lParam)==FALSE) {

                        EndDialog(hDlg,TRUE);

                        return TRUE;

                   }

              }

              EndDialog(hDlg,FALSE);

              return TRUE;

          case IDC_BTNDISCARDALL:

              EndDialog(hDlg,FALSE);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,TRUE);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

¸®½ºÆ® ºä ÄÁÆ®·Ñ¿¡ ¹ÌÀúÀå ¹®¼­ÀÇ ¸ñ·ÏÀ» º¸¿© ÁØ´Ù. À̶§ ¹Ýµå½Ã ÆÄÀÏ ÅÇÀÇ ¼ø¼­´ë·Î º¸¿© ÁÖ´Â °ÍÀÌ ÁÁ´Ù. À̸§À» ¾ÆÁ÷ ÁÖÁö ¾ÊÀº ÆÄÀÏÀº ÆÄÀϸíÀ¸·Î ³»¿ëÀ» ÆÄ¾ÇÇÒ ¼ö ¾ø±â ´ë¹®¿¡ ³»¿ëµµ ÀϺΠǥ½ÃÇß´Ù. °³Çà ÄÚµå, ÅÇ µîÀº º¸±â ÁÁ°Ô º¯È¯ÇÑ ÈÄ Ãâ·ÂÇÑ´Ù. ¸®½ºÆ® ºäÀÇ lParam¿¡´Â ÆíÁýâÀÇ ÇÚµéÀ» ³Ö¾î µÐ´Ù.

ÀÌ ´ëÈ­»óÀÚ¿¡¼­ »ç¿ëÀÚ´Â ÇѲ¨¹ø¿¡ ÀúÀå, ¸ðµÎ ¹ö¸²À» ¼±ÅÃÇϰųª ¾Æ´Ï¸é ¸®½ºÆ® ºäÀÇ Ã¼Å© ¹Ú½º¸¦ »ç¿ëÇÏ¿© ÀϺΠÆÄÀϸ¸ ÀúÀåÇÒ ¼ö ÀÖ´Ù. Ãë¼ÒÇÒ °æ¿ì EndDialog(hDlg,TRUE)·Î Á¾·á ÀÚü¸¦ Ãë¼ÒÇØ¾ß ÇÑ´Ù. ÀÌ ´ëÈ­»óÀÚ°¡ TRUE¸¦ ¸®ÅÏÇϸé OnClose´Â ÇÁ·Î±×·¥ Á¾·á ÀÚü¸¦ Ãë¼ÒÇÑ´Ù.

ÆÄÀÏÀ» ÀúÀåÇÒ ¶§´Â ÀúÀå ´ë»ó ÆÄÀÏÀÌ ¾î¶² ÆÄÀÏÀÎÁö¸¦ ºÐ¸íÈ÷ º¸¿© ÁÖ¾î¾ß ÇÑ´Ù. ¸®½ºÆ® ºä¿¡ ÇØ´ç ÆÄÀÏÀ» ¼±ÅÃÇÏ°í ÆíÁýâÀ» Ȱ¼ºÈ­Çϴµ¥ À̸§ÀÌ ÁÖ¾îÁöÁö ¾ÊÀº »õ ÆÄÀÏÀ» ÀúÀåÇÒ ¶§´Â »ç¿ëÀÚ°¡ ÆÄÀÏÀÇ ³»¿ëÀ» ºÁ¾ß¸¸ Àû´çÇÑ À̸§À» ÁÙ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

ÇÁ·Î±×·¥ Á¾·á, ¶Ç´Â ½Ã½ºÅÛ Á¾·á½Ã¿¡ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÃÖ¼ÒÈ­µÇ¾î ÀÖÀ¸¸é ´ëÈ­»óÀÚ°¡ º¸ÀÌÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ±×·¯³ª ´ç±ÙÀÇ ´ëÈ­»óÀÚ°¡ È£ÃâÇÏ´Â MoveToParentCenter ÇÔ¼ö´Â ºÎ¸ð°¡ ÃÖ¼ÒÈ­µÇ¾î ÀÖÀ» ¶§ ºÎ¸ð¸¦ º¹±¸½ÃŰ¹Ç·Î ÀÌ·± °ÆÁ¤ÀÌ ¾ø´Ù. Áú¹®À̳ª È®ÀÎ ´ëÈ­»óÀÚ¸¦ ¶ç¿ï ¶§ ºÎ¸ð À©µµ¿ì°¡ º¸ÀÌ´Â »óÅ¿©¾ß ´©°¡ Ãâ·ÂÇÑ ¸Þ½ÃÁöÀÎÁö ¾Ë ¼ö ÀÖ´Ù.

³ª.º¯°æ È®ÀÎ

¿©·¯¹ø Áú¹®ÇÏ´Â ¶Ç ´Ù¸¥ °æ¿ì´Â ¿ÜºÎ ÇÁ·Î±×·¥¿¡ ÀÇÇØ ÆíÁýÁßÀÌ ÆÄÀÏÀÌ º¯°æµÇ¾úÀ» ¶§Àε¥ À̶§ ¼öÁ¤µÈ ÆÄÀÏÀ» ´Ù½Ã ÀÐÀ» °ÍÀÎÁö¸¦ Áú¹®ÇÑ´Ù. ÀÌ °æ¿ìµµ ¸Å ¹®¼­¸¶´Ù Áú¹®ÇÏÁö ¸»°í ÇѲ¨¹ø¿¡ Áú¹®ÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. ÀÌ ±â´ÉÀ» ÀÛ¼ºÇϸ鼭 ´õºÒ¾î 1.0ÀÇ ¹ö±×¿Í ¹®Á¦Á¡±îÁö °°ÀÌ ÇØ°áÇÒ °ÍÀÌ´Ù. OnActivateApp ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

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

{

    TCHAR Mes[512];

    BOOL bSetTimer=FALSE;

     ....

     if (wParam) {

          if (Option.bWatchChange && pEditings) {

              for (idx=0;pEditings[idx].hWnd!=NULL;) {

                   pSi=(SInfo *)GetWindowLong(pEditings[idx].hWnd,0);

                   hFile=CreateFile(pSi->NowFile,0,0,NULL,

                        OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

                   if (hFile!=INVALID_HANDLE_VALUE) {

                        size=GetFileSize(hFile,NULL);

                        GetFileTime(hFile,NULL,NULL,&st);

                        if (pEditings[idx].size!=size ||

                            CompareFileTime(&pEditings[idx].st,&st)!=0) {

                       if (Option.bReloadNoAsk) {

                          RevertFile(pEditings[idx].hWnd);

                       } else {

                          SetTimer(hWnd,2,1,NULL);

                          bSetTimer=TRUE;

                          CloseHandle(hFile);

                          break;

                       }

                        }

                        CloseHandle(hFile);

                   }

                   idx++;

              }

           if (bSetTimer==FALSE) {

               free(pEditings);

               pEditings=NULL;

           }

          }

     } else {

          SaveEditings();

     }

}

 

º¯°æµÈ ÆÄÀÏÀÌ ÀÖ´ÂÁö È®Àθ¸ Çϰí ÀÖÀ¸¸é ŸÀÌ¸Ó ¼³Ä¡Çϰí ÀÏ´Ü ¸®ÅÏÇÑ´Ù. Ȱ¼ºÈ­µÇ´Â Áï½Ã ´ëÈ­»óÀÚ¸¦ ¶ç¿ï ¼ö´Â ¾ø¾î ÀÏȸ¿ë ŸÀ̸Ӹ¦ »ç¿ëÇß´Ù. À̶§ ¾î¶² ÆÄÀÏÀÌ ¼öÁ¤µÇ¾ú´ÂÁö¸¦ ±â¾ïÇÏ´Â pEditings ¹è¿­Àº ´ëÈ­»óÀÚ¿¡¼­ »ç¿ëÇØ¾ß ÇϹǷΠ´çºÐ°£ »èÁ¦ÇÏÁö ¾Ê°í ±×´ë·Î µÐ´Ù. º¯°æ ÆÄÀÏ È®ÀÎ ÀÛ¾÷Àº OnTimer¿¡¼­ ÇÑ´Ù.

 

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

{

     ....

     case 2:

          KillTimer(hWnd,2);

          DialogBox(g_hInst,MAKEINTRESOURCE(IDD_CONFIRMRELOAD),

              g_hFrameWnd,ConfirmReloadProc);

          break;

 

ÀÏȸ¿ë ŸÀ̸ÓÀ̹ǷΠÁï½Ã Á¦°ÅÇÏ°í º¯°æÈ®ÀÎ ´ëÈ­»óÀÚ¸¦ ¶ç¿î´Ù.

 

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

{

     HWND hList;

     LVCOLUMN COL;

     SInfo *pSi;

     LVITEM LI;

     int i,idx;

     TCHAR TextBuf[512],Content[1024];

     TCHAR Path[MAX_PATH];

     HANDLE hFile;

     DWORD size;

     FILETIME st;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          hList=GetDlgItem(hDlg,IDC_LISTNOSAVED);

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=250;

          COL.pszText="ÆÄÀϸí";

          COL.iSubItem=0;

          ListView_InsertColumn(hList,0,&COL);

 

          COL.cx=250;

          COL.pszText="³»¿ë";

          COL.iSubItem=1;

          ListView_InsertColumn(hList,1,&COL);

          ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);

 

          // º¯°æµÈ ÆÄÀÏ ¸ñ·ÏÀ» º¸¿© ÁØ´Ù.

          for (i=0,idx=0;pEditings[i].hWnd!=NULL;i++) {

              pSi=(SInfo *)GetWindowLong(pEditings[i].hWnd,0);

              hFile=CreateFile(pSi->NowFile,0,0,NULL,

                   OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

              if (hFile!=INVALID_HANDLE_VALUE) {

                   size=GetFileSize(hFile,NULL);

                   GetFileTime(hFile,NULL,NULL,&st);

                   if (pEditings[i].size!=size ||

                        CompareFileTime(&pEditings[i].st,&st)!=0) {

                        LI.mask=LVIF_TEXT | LVIF_PARAM;

                        LI.iItem=idx;

                        LI.iSubItem=0;

                        LI.pszText=pSi->NowFile;

                        LI.lParam=(LPARAM)pEditings[i].hWnd;

                        ListView_InsertItem(hList,&LI);

 

                        memset(TextBuf,0,512);

                        pSi->Ae.GetText(TextBuf,500);

                        ReplaceCtrlString(TextBuf,512,Content,1024);

                        ListView_SetItemText(hList,idx,1,Content);

                        idx++;

                   }

              }

              CloseHandle(hFile);

          }

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_BTNSAVEALL:

          case IDC_BTNSAVECHECKED:

              hList=GetDlgItem(hDlg,IDC_LISTNOSAVED);

              for (idx=0;idx<ListView_GetItemCount(hList);idx++) {

                   if (LOWORD(wParam)==IDC_BTNSAVECHECKED) {

                        if (ListView_GetCheckState(hList,idx)==FALSE) {

                            continue;

                        }

                   }

                   LI.mask=LVIF_PARAM | LVIF_TEXT;

                   LI.iItem=idx;

                   LI.iSubItem=0;

                   LI.pszText=Path;

                   LI.cchTextMax=MAX_PATH;

                   ListView_GetItem(hList,&LI);

                   RevertFile((HWND)LI.lParam);

              }

              // no break;

          case IDCANCEL:

              free(pEditings);

              pEditings=NULL;

              EndDialog(hDlg,TRUE);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

¹ÌÀúÀå ¹®¼­ È®ÀÎ ´ëÈ­»óÀÚ¿Í °ÅÀÇ À¯»çÇÏ´Ù. pEditings ¹è¿­¿¡¼­ º¯°æµÈ ÆÄÀÏ ¸ñ·ÏÀ» ±¸ÇØ ¸®½ºÆ® ºä¿¡ º¸¿© ÁØ´Ù. ´Ù½Ã ÀÐÀ» ¶§´Â RevertFile ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. Ãë¼Ò´Â ó¸®ÇÏÁö ¾ÊÀ¸¹Ç·Î ¾î¶² ¹öưÀ» ´©¸£µçÁö ´ëÈ­»óÀÚ¸¦ Á¾·áÇϱ⸸ ÇÏ¸é µÈ´Ù.

´ÙÀ½Àº Ȱ¼ºÈ­¿Í °ü·ÃµÈ 1.0 ¹öÀüÀÇ ¹ö±×µéÀ» ¼öÁ¤ÇÏÀÚ. ºäÀÇ OnLButtonDown¿¡´Â ´ÙÀ½ Äڵ尡 ºÒÇÊ¿äÇÏ´Ù. Çí»ç ºäµµ ¸¶Âù°¡ÁöÀÌ´Ù.

 

void CApiEditText::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     int toff;

     BOOL bShift, bControl;

     int r,c;

     int nr;

     int SelFirst, SelSecond;

    POINT pt;

     RECT crt;

 

     GetClientRect(hWnd,&crt);

    GetCursorPos(&pt);

    ScreenToClient(hWnd,&pt);

    if (pt.x != x || pt.y != y) {

        return;

    }

 

Áö³­ ¹öÀüÀÇ ²Ç¼ö¿´´Âµ¥ ÀÌÁ¦´Â ºÒÇÊ¿äÇϹǷΠ»èÁ¦ÇÑ´Ù. ÀÌ Äڵ带 ÀÛ¼ºÇß´ø ÀÌÀ¯´Â Ȱ¼ºÈ­ ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ´ëÈ­»óÀÚ¸¦ ¶ç¿ì´Â °ÍÀÌ ¹®Á¦°¡ ÀÖ¾ú±â ¶§¹®ÀÌ´Ù. ¸¶¿ì½º·Î Ŭ¸¯ÇÏ¿© Ȱ¼ºÈ­ÇßÀ» ¶§ ´ëÈ­»óÀÚ¸¦ ¶ç¿ì¸é ´ëÈ­»óÀÚ°¡ ´ÝÈù ÈÄ¿¡ WM_LBUTTONDOWNÀÌ Àü´ÞµÇ´Â ¹®Á¦°¡ ÀÖ´Ù. À̶§ WM_LBUTTONDOWN¿¡¼­ ¸¶¿ì½º¸¦ ĸóÇÏ¸ç ¹öưÀÌ ´­·¯Á® ÀÖÁö ¾ÊÁö¸¸ ¼±Åà ºí·ÏÀÌ È®ÀåµÇ´Â ¹®Á¦°¡ ÀÖ¾ú´Ù.

±×·¡¼­ WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÇöÀç Ä¿¼­ À§Ä¡°¡ lParam°ú ´Ù¸£´Ù¸é Áß°£¿¡ ´ëÈ­»óÀÚ°¡ ³¢¾îµç °ÍÀ¸·Î ÆÇ´ÜÇϰí ÀÌ ¸Þ½ÃÁö¸¦ ¹«½ÃÇß´ø °ÍÀÌ´Ù. ±×·¯³ª ´ÙÀ½ Äڵ带 »ç¿ëÇϸé Á» ´õ ±ò²ûÇÏ°Ô Á¤¼®´ë·Î ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.

 

LRESULT CApiEditText::OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     case WM_CANCELMODE:

          bCapture=FALSE;

          break;

 

LRESULT CApiEditHexa::OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     case WM_CANCELMODE:

          bCapture=FALSE;

          break;

 

´ëÈ­»óÀÚ°¡ ¿­¸®¸é ĸó´Â ÀÚµ¿À¸·Î Ç®¸®Áö¸¸ bCapture º¯¼ö´Â ¿©ÀüÈ÷ TRUE·Î ³²¾ÆÀֱ⠶§¹®¿¡ ¹®Á¦°¡ µÇ´Â °ÍÀÌ´Ù. ĸó°¡ Ç®¸± ¶§ WM_CANCELMODE ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸ç ¿©±â¼­ bCapture¸¦ FALSE·Î º¯°æÇÏ¸é µÈ´Ù. »ç½Ç bCapture º¯¼ö´Â ²À ÇÊ¿äÄ¡µµ ¾Ê´Ù. Â÷¶ó¸® GetCapture() ÇÔ¼ö·Î ĸó ¿©ºÎ¸¦ ½Ç½Ã°£ Á¶»çÇß´Ù¸é ÀÌ·± ¹®Á¦´Â ¾ø¾úÀ» °ÍÀÌ´Ù. ÀÌ ¸Þ½ÃÁö´Â ¿­·¯ ÀÖ´Â ¸Þ´º¸¦ ´Ý°Å³ª ½ºÅ©·Ñ ¹Ù ÀԷ ó¸®¸¦ Ãë¼ÒÇÏ´Â ÀÛ¾÷µµ ÇϹǷΠDefWindowProcÀ¸·Î ´Ù½Ã º¸³»´Â °ÍÀÌ ÁÁ´Ù.

º¯°æ È®ÀΠâ¿¡¼­ ´Ù½Ã Àб⸦ ¼±ÅÃÇϸé RevertFile ÇÔ¼ö·Î µð½ºÅ©ÀÇ ¼öÁ¤µÈ ¹®¼­¸¦ ´Ù½Ã ÀоîµéÀδÙ. À̶§ »óŶõÀÇ ÅØ½ºÆ®°¡ ¹Ù²î°í ÆÄÀÏ ÅÇÀÇ À̹ÌÁöµµ Àß ¹Ù²îÁö¸¸ ºñȰ¼ºÈ­µÈ â¿¡ ´ëÇØ¼­´Â ÀÌ·± 󸮰¡ µÇÁö ¾Ê´Â ¹®Á¦°¡ ÀÖ´Ù. ReverFile ÇÔ¼ö¿¡¼­ »õ·Î ÀÐÀº ÆÄÀÏÀÇ ÅÇ »ö»óÀ» Á÷Á¢ º¯°æÇØ¾ß ÇÑ´Ù.

 

void RevertFile(HWND hChild)

{

     SInfo *pSi;

    TCITEM tie;

    int idx;

 

     pSi=(SInfo *)GetWindowLong(hChild,0);

     OpenFileToChild(hChild,pSi->NowFile);

     if (GetFileAttributes(pSi->NowFile) & FILE_ATTRIBUTE_READONLY) {

          pSi->Ae.SetReadOnly(TRUE);

     }

    tie.mask=TCIF_IMAGE;

    tie.iImage=0;

    idx=FindFileTab(pSi->NowFile);

    TabCtrl_SetItem(hFileTab,idx,&tie);

}

 

Á÷Á¢ ÆÄÀÏÅÇÀÇ À̹ÌÁö¸¦ º¯°æÇß´Ù. ÀÌ Ã³¸®¸¦ »ý·«ÇØ ¹ö¸®¸é ¹ÌÀúÀå ¹®¼­ÀÓ¿¡µµ ÆÄÀÏÅÇÀÇ ¾ÆÀÌÄÜÀÌ »¡°£»öÀ¸·Î Ç¥½ÃµÇ¾î »ç¿ëÀÚ¿¡°Ô È¥¶õÀ» ÁØ´Ù.