2.»ó¿ë±¸ °ü¸®

°¡.»ó¿ë±¸ °ü¸® ´ëÈ­»óÀÚ

»ó¿ë±¸µµ ¸ÅÅ©·Î³ª ´ÜÃàÅ°¿Í ¸¶Âù°¡Áö·Î ´ëÈ­»óÀÚ·Î °ü¸®ÇÑ´Ù. ´ëÈ­»óÀÚ ÅÛÇø´Àº ¸®¼Ò½º¿¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ°í »ó¿ë±¸ Æ®¸®¿¡ »ç¿ëÇÒ À̹ÌÁöµµ ÀÛ¼ºÇØ µÎ¾ú´Ù. »ó¿ë±¸ Æ®¸®¿¡ »ç¿ëÇÒ À̹ÌÁö´Â »õ·Î ¸¸µéÁö ¾Ê°í ÆÄÀÏâÀÇ À̹ÌÁö¸¦ °°ÀÌ »ç¿ëÇÑ´Ù. IDB_FILES À̹ÌÁö¿¡ »ó¿ë±¸¿¡ »ç¿ëÇÒ À̹ÌÁö 6°³¸¦ Ãß°¡ Á¤ÀÇÇß´Ù.

¹­À½°ú Æú´õ, »ó¿ë±¸¿¡ ´ëÇÑ ¾ÆÀÌÄÜ¿¡ ´ëÇØ º¸Åë ¸ð¾ç, ¼±ÅÃµÈ ¸ð¾çÀ» °¢°¢ ¸¸µé¾ú´Ù. Ãß°¡µÈ ¾ÆÀÌÄÜ¿¡ ¿­°ÅÇü »ó¼ö¸¸ ÇÒ´çÇÏ¸é µÈ´Ù. FileWnd.hÀÇ ¿­°ÅÇü »ó¼ö¸¦ ´Ã¸°´Ù.

 

enum {DGI_DRIVE, DGI_DRIVESEL, DGI_FOLDER, DGI_FOLDERSEL, DGI_FILE, DGI_FILESEL,

     DGI_PROJECT, DGI_PROJECTSEL, DGI_SUB, DGI_SUBSEL,

    DGI_CLIPROOT, DGI_CLIPROOTSEL, DGI_CLIPFOLDER, DGI_CLIPFOLDERSEL,

    DGI_CLIP, DGI_CLIPSEL};

 

´ëÈ­»óÀÚÀÇ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù. ÀÌ ´ëÈ­»óÀÚ ÀÚü·Î »ó¿ë±¸¶ó´Â º¹ÀâÇÑ ÀڷḦ °ü¸®ÇÏ´Â ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î ºÁµµ µÉ Á¤µµ´Ù.

À­ÂÊ¿¡´Â ¹­À½ ÆÄÀÏ¿¡ ´ëÇÑ Á¤º¸°¡ Ãâ·ÂµÇ¸ç ¿À¸¥ÂÊÀÇ ¹öÆ°µé·Î ¹­À½À» °ü¸®ÇÑ´Ù. »õ·Î ¸¸µé±â ¿­±â, ÀúÀå µîÀÇ ÀϹÝÀûÀÎ ÆÄÀÏ ÀÔÃâ·Â ¸í·ÉµéÀÌ´Ù. Áß¾Ó¿¡´Â ¹­À½¿¡ Æ÷ÇÔµÈ »ó¿ë±¸ÀÇ ¸ñ·ÏÀÌ °èÃþÀûÀ¸·Î Ç¥½ÃµÇ¸ç ¿À¸¥ÂÊ¿¡´Â ¼±ÅÃµÈ »ó¿ë±¸ÀÇ ¹Ì¸®º¸±â°¡ Ãâ·ÂµÈ´Ù. »ó¿ë±¸ ¸ñ·ÏÀº Ž»ö±âÀÇ µð·ºÅ丮 ±¸Á¶¿Í ºñ½ÁÇѵ¥ ¹­À½Àº µå¶óÀ̺ê, Æú´õ´Â µð·ºÅ丮, »ó¿ë±¸´Â ÆÄÀÏ¿¡ ÇØ´çÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. Æú´õ ¾È¿¡´Â ±íÀÌ¿¡ »ó°ü¾øÀÌ Æú´õ¸¦ ¹«ÇÑ´ë·Î ¸¸µé ¼ö ÀÖ´Ù.

»ó¿ë±¸ ÀÚü´Â ÅؽºÆ® Æ÷¸ËÀ¸·Î µÇ¾î ÀÖÀ¸¹Ç·Î ¹Ì¸®º¸±â¿¡ ApiEdit ÄÁÆ®·ÑÀ» »ç¿ëÇß´Ù. »ó¿ë±¸ÀÇ Çü½Ä¿¡ µû¶ó ½ÅÅýº Ä÷¯¸µÀ» ÇÑ´Ù. Àбâ Àü¿ë ¼Ó¼ºÀ» °¡Áö¹Ç·Î ¹Ì¸®º¸±â¿¡¼­ »ó¿ë±¸¸¦ Á÷Á¢ ÆíÁýÇÒ ¼ö´Â ¾ø´Ù. ´ëÈ­»óÀÚ ¾Æ·¡ÂÊÀÇ ¹öÆ°µé·Î´Â »ó¿ë±¸¸¦ °ü¸®ÇÑ´Ù. Clip.h¿¡´Â »ó¿ë±¸ ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú¿Í °ü·Ã ÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù.

 

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

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

void DisplayClipPreview(CApiEdit *pAe,CClipRecord *cr);

int ConfirmSaveClip(HWND hDlg);

BOOL LoadClipFileToDlg(HWND hDlg,TCHAR *Path);

void AddClipFileToTree(HWND hTree,HTREEITEM hPrev,TCHAR *Path,CClipFile *cf);

void AddClipRecordToTree(HWND hTree,HTREEITEM pNode,CClipFile *cf,int idx);

BOOL SaveClipFileFromDlg(HWND hDlg);

void AddClipRecordToFile(HWND hTree,HTREEITEM hParent,int pid,CClipFile *cf);

HTREEITEM CopyTreeItem2(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest, BOOL bNext);

HTREEITEM CopyTreeItems2(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest,BOOL bNext);

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

BOOL LoadClipFile(TCHAR *Path,BOOL bUpdate);

CClipRecord *FindClipRecord(TCHAR *Name,BOOL bAutoName);

CClipRecord *FindClipRecordSub(HTREEITEM hRoot,TCHAR *Name,BOOL bAutoName);

 

±â´ÉÀÌ ¸¹±â ¶§¹®¿¡ ÇÔ¼öµéÀÇ ¼öµµ ÀûÁö ¾Ê´Ù. ±¸Çö ÄÚµå´Â ¸ðµÎ Clip.cpp¿¡ ÀÛ¼ºÇÑ´Ù. Àüü ÄÚµå ¸®½ºÆ®¸¦ º¸ÀÎ ÈÄ ºÐ¼®ÇØ º¸ÀÚ.

 

// lParamÀ¸·Î óÀ½ ¿­ »ó¿ë±¸ ÆÄÀÏÀÇ °æ·Î¸¦ Àü´Þ¹Þ´Â´Ù. NULLÀÌ¸é ºó »óÅ·Π½ÃÀÛÇÑ´Ù.

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

{

     static HWND hTree;

     static CApiEdit *pAe;

     static HIMAGELIST himl;

     static BOOL bDrag;

     static HTREEITEM hDrag,hTarget, hOldTarget;

     static BOOL Modified;

     RECT brt;

     HTREEITEM NowItem,Node;

     CClipRecord *cr;

     TVINSERTSTRUCT TI;

     TVITEM TV;

     OPENFILENAME OFN;

     TCHAR lpstrFile[MAX_PATH]="";

     TCHAR szTemp[256];

     TVHITTESTINFO hti;

     POINT pt;

     int hotx,hoty;

     RECT rt;

     BOOL bNext;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          SendDlgItemMessage(hDlg,IDC_CLIPNAME,EM_LIMITTEXT,63,0);

          SendDlgItemMessage(hDlg,IDC_CLIPDESC,EM_LIMITTEXT,127,0);

 

          // ¹öÆ° ÀÚ¸®¿¡ ApiEdit¸¦ ¹èÄ¡ÇÑ´Ù. ´ëºÎºÐÀÇ ¼³Á¤Àº ±âº»°ªÀÌ¸ç ¸î °¡Áö¸¸ ¼öÁ¤ÇÑ´Ù.

          GetWindowRect(GetDlgItem(hDlg,IDC_PLACEAPIEDIT),&brt);

          ScreenToClient(hDlg,(LPPOINT)&brt);

          ScreenToClient(hDlg,(LPPOINT)&brt.right);

          pAe=new CApiEdit;

          pAe->Create(brt.left,brt.top,brt.right-brt.left,brt.bottom-brt.top,

              WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP,0,hDlg);

          SetSetting(*pAe);

          pAe->SetWrap(2);

          pAe->SetWantTab(FALSE);

          pAe->SetReadOnly(TRUE);

          pAe->SetBackColor(RGB(220,220,220));

          pAe->EnableSplit(0);

 

          hTree=GetDlgItem(hDlg,IDC_CLIPTREE);

          SendMessage(hTree, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)hFileImg);

 

          // Àμö·Î ÆÄÀÏÀÇ °æ·Î°¡ Àü´ÞµÇ¾úÀ¸¸é ¿¬´Ù.

          if (lParam!=NULL) {

              if (LoadClipFileToDlg(hDlg,(TCHAR *)lParam)==FALSE) {

                   MessageBox(hDlg,"»ó¿ë±¸ ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   EndDialog(hDlg,IDCANCEL);

              }

          }

 

          Modified=FALSE;

          SetFocus(hTree);

          return FALSE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_BTNCLIPFILENEW:

              // ÆíÁýÇÏ´ø ¹­À½À» ¸ÕÀú ÀúÀåÇÑ´Ù.

              if (Modified) {

                   if (ConfirmSaveClip(hDlg)==IDCANCEL) {

                        return TRUE;

                   }

              }

 

              SetDlgItemText(hDlg,IDC_CLIPNAME,"»õ »ó¿ë±¸ ¹­À½");

              SetDlgItemText(hDlg,IDC_CLIPFILE,"ÀúÀåµÇÁö ¾ÊÀº ÆÄÀÏ");

              SetDlgItemText(hDlg,IDC_CLIPDESC,"");

 

              // ·çÆ® ³ëµå¸¸ µî·ÏÇÑ´Ù.

              TreeView_DeleteAllItems(hTree);

              TI.hParent=NULL;

              TI.hInsertAfter=TVI_LAST;

              TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

              TI.item.iImage=DGI_CLIPROOT;

              TI.item.iSelectedImage=DGI_CLIPROOTSEL;

              GetDlgItemText(hDlg,IDC_CLIPNAME,szTemp,64);

              TI.item.pszText=szTemp;

              TI.item.lParam=NULL;

              Node=TreeView_InsertItem(hTree,&TI);

              TreeView_SelectItem(hTree,Node);

 

              // ÇÁ·ÎÁ§Æ® À̸§À¸·Î Æ÷Ä¿½º¸¦ ¿Å±ä´Ù.

              Modified=FALSE;

              SetFocus(GetDlgItem(hDlg,IDC_CLIPNAME));

              SendDlgItemMessage(hDlg,IDC_CLIPNAME,EM_SETSEL,0,-1);

              return TRUE;

          case IDC_BTNCLIPFILEOPEN:

              // ÆíÁýÇÏ´ø ¹­À½À» ¸ÕÀú ÀúÀåÇÑ´Ù.

              if (Modified) {

                   if (ConfirmSaveClip(hDlg)==IDCANCEL) {

                        return TRUE;

                   }

              }

 

              memset(&OFN, 0, sizeof(OPENFILENAME));

              OFN.lStructSize = sizeof(OPENFILENAME);

              OFN.hwndOwner=hDlg;

              OFN.lpstrFilter="´ç±Ù »ó¿ë±¸ ÆÄÀÏ\0*.dgc\0";

              OFN.lpstrFile=lpstrFile;

              OFN.nMaxFile=MAX_PATH;

 

              if (GetOpenFileName(&OFN)) {

                   if (LoadClipFileToDlg(hDlg,lpstrFile)==FALSE) {

                        MessageBox(hDlg,"»ó¿ë±¸ ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   } else {

                        Modified=FALSE;

                   }

              }

              return TRUE;

          case IDC_BTNCLIPADDCLIP:

              // ·çÆ®³ª Æú´õ ¾Æ·¡¸¸ Ãß°¡ °¡´ÉÇÏ´Ù.

              NowItem=TreeView_GetSelection(hTree);

              if (NowItem == NULL) {

                   return TRUE;

              }

 

              // »õ »ó¿ë±¸ Çϳª¸¦ ÆíÁýÇÑ´Ù.

              cr=new CClipRecord;

              cr->Type=DGCT_CLIP;

              if (DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_EDITCLIP),hDlg,

                   EditClipProc,(LPARAM)cr)==IDCANCEL) {

                   delete cr;

                   return TRUE;

              }

 

              // Ãß°¡µÈ »ó¿ë±¸¸¦ Æ®¸®¿¡ Ãß°¡ÇÑ´Ù.

              TI.hParent=NowItem;

              TI.hInsertAfter=TVI_LAST;

              TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

              TI.item.iImage=DGI_CLIP;

              TI.item.iSelectedImage=DGI_CLIPSEL;

              TI.item.pszText=cr->Name;

              TI.item.lParam=(LPARAM)cr;

              TreeView_InsertItem(hTree,&TI);

              TreeView_Expand(hTree,NowItem,TVE_EXPAND);

              Modified=TRUE;

              return TRUE;

          case IDC_BTNCLIPADDFOLDER:

              NowItem=TreeView_GetSelection(hTree);

              if (NowItem == NULL) {

                   return TRUE;

              }

 

              cr=new CClipRecord;

              cr->Type=DGCT_FOLDER;

              lstrcpy(cr->Name,"»õ Æú´õ");

 

              TI.hParent=NowItem;

              TI.hInsertAfter=TVI_LAST;

              TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

              TI.item.iImage=DGI_CLIPFOLDER;

              TI.item.iSelectedImage=DGI_CLIPFOLDERSEL;

              TI.item.pszText=cr->Name;

              TI.item.lParam=(LPARAM)cr;

              Node=TreeView_InsertItem(hTree, &TI);

              TreeView_SelectItem(hTree,Node);

              TreeView_EditLabel(hTree,Node);

              Modified=TRUE;

              return TRUE;

          case IDC_BTNCLIPRENAME:

              NowItem=TreeView_GetSelection(hTree);

              if (NowItem == NULL) {

                   return TRUE;

              }

              TV.mask=TVIF_IMAGE;

              TV.hItem=NowItem;

              TreeView_GetItem(hTree,&TV);

              if (TV.iImage != DGI_CLIPROOT) {

                   TreeView_EditLabel(hTree,NowItem);

              }

              return TRUE;

          case IDC_BTNCLIPDELETE:

              NowItem=TreeView_GetSelection(hTree);

              if (NowItem == NULL) {

                   return TRUE;

              }

              TV.mask=TVIF_IMAGE;

              TV.hItem=NowItem;

              TreeView_GetItem(hTree,&TV);

              if (TV.iImage != DGI_CLIPROOT) {

                   // ³ëµå¸¸ Áö¿ì¸é ³ëµå¿¡ Æ÷ÇÔµÈ ¸Þ¸ð¸®µµ ¸ðµÎ ÇØÁ¦µÈ´Ù.

                   TreeView_DeleteItem(hTree,NowItem);

              }

              Modified=TRUE;

              return TRUE;

          case IDC_BTNCLIPEDIT:

              NowItem=TreeView_GetSelection(hTree);

              if (NowItem == NULL) {

                   return TRUE;

              }

 

              // ¼±ÅÃÇÑ »ó¿ë±¸¸¦ ÆíÁýÇÑ´Ù.

              TV.mask=TVIF_PARAM | TVIF_IMAGE;

              TV.hItem=NowItem;

              TreeView_GetItem(hTree,&TV);

 

              // Æú´õ´Â ´õºíŬ¸¯Çصµ ÆíÁýÇÒ ¼ö ¾ø´Ù.

              if (TV.iImage != DGI_CLIP) {

                   return TRUE;

              }

              cr=(CClipRecord *)TV.lParam;

              if (DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_EDITCLIP),hDlg,

                   EditClipProc,(LPARAM)cr)==IDCANCEL) {

                   return TRUE;

              }

 

              // ³ëµåÀÇ ÅؽºÆ®¿Í ¹Ì¸® º¸±â¸¦ ¼öÁ¤ÇÑ´Ù.

              TV.mask=TVIF_TEXT;

              TV.pszText=cr->Name;

              TV.hItem=NowItem;

              TreeView_SetItem(hTree,&TV);

              DisplayClipPreview(pAe,cr);

              Modified=TRUE;

              return TRUE;

          case IDOK:

              if (TreeView_GetEditControl(hTree)) {

                   if (HIWORD(wParam) == 0) {

                        TreeView_EndEditLabelNow(hTree,FALSE);

                   }

              } else {

                   // À̸§ÀÌ ÁÖ¾îÁ® ÀÖÀ¸¸é Áú¹®¾øÀÌ ÀúÀåÇÑ´Ù.

                   if (Modified) {

                        GetDlgItemText(hDlg,IDC_CLIPFILE,szTemp,256);

                        if (lstrcmp(szTemp,"ÀúÀåµÇÁö ¾ÊÀº ÆÄÀÏ")!=0) {

                            SaveClipFileFromDlg(hDlg);

                        } else {

                            if (ConfirmSaveClip(hDlg)==IDCANCEL) {

                                 return TRUE;

                            }

                        }

                   }

                   DestroyWindow(pAe->hWnd);

                   delete pAe;

                   EndDialog(hDlg,IDOK);

                   return TRUE;

              }

              return TRUE;

          case IDCANCEL:

              if (TreeView_GetEditControl(hTree)) {

                   TreeView_EndEditLabelNow(hTree,TRUE);

              } else {

                   DestroyWindow(pAe->hWnd);

                   delete pAe;

                   EndDialog(hDlg,IDCANCEL);

              }

              return TRUE;

          case IDC_CLIPNAME:

              switch (HIWORD(wParam)) {

              case EN_CHANGE:

                   Node=TreeView_GetRoot(hTree);

                   if (Node) {

                        GetDlgItemText(hDlg,IDC_CLIPNAME,szTemp,256);

                        TV.mask=TVIF_TEXT;

                        TV.pszText=szTemp;

                        TV.hItem=Node;

                        TreeView_SetItem(hTree,&TV);

                        Modified=TRUE;

                   }

                   break;

              }

              return TRUE;

          case IDC_CLIPDESC:

              switch (HIWORD(wParam)) {

              case EN_CHANGE:

                   Modified=TRUE;

                   break;

              }

              return TRUE;

          }

          return FALSE;

     case WM_MOUSEMOVE:

          if (bDrag) {

              pt.x=LOWORD(lParam);

              pt.y=HIWORD(lParam);

              ClientToScreen(hDlg,&pt);

              ImageList_DragMove(pt.x,pt.y);

 

              GetWindowRect(hTree,&rt);

              ScreenToClient(hDlg,(POINT *)&rt);

              hti.pt.x=LOWORD(lParam)-rt.left;

              hti.pt.y=HIWORD(lParam)-rt.top;

              hTarget=TreeView_HitTest(hTree,&hti);

              if (hTarget != NULL) {

                   ImageList_DragLeave(NULL);

                   TreeView_SelectDropTarget(hTree,hTarget);

                   UpdateWindow(hTree);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

 

                   if (hTarget != hOldTarget) {

                        hOldTarget=hTarget;

                        KillTimer(hDlg,1);

                        SetTimer(hDlg,1,1000,NULL);

                   }

              }

 

              GetWindowRect(hTree,&rt);

              if ((short)pt.y < rt.top) {

                   SetTimer(hDlg,2,200,NULL);

                   ImageList_DragLeave(NULL);

                   SendMessage(hTree,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),NULL);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

              } else {

                   KillTimer(hDlg,2);

              }

 

              if ((short)pt.y > rt.bottom) {

                   SetTimer(hDlg,3,200,NULL);

                   ImageList_DragLeave(NULL);

                   SendMessage(hTree,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),NULL);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

              } else {

                   KillTimer(hDlg,3);

              }

          }

          return TRUE;

     case WM_LBUTTONUP:

          if (bDrag) {

              ImageList_DragLeave(NULL);

              ImageList_EndDrag();

              TreeView_SelectDropTarget(hTree,NULL);

              ReleaseCapture();

              bDrag=FALSE;

              ImageList_Destroy(himl);

              KillTimer(hDlg,1);

              KillTimer(hDlg,2);

              KillTimer(hDlg,3);

 

              if (hDrag == hTarget || hTarget==NULL)

                   return TRUE;

 

              Node=hTarget;

              while (Node != NULL) {

                   Node=TreeView_GetParent(hTree,Node);

                   if (Node == hDrag)

                        return TRUE;

              }

 

              TV.mask=TVIF_IMAGE;

              TV.hItem=hTarget;

              TreeView_GetItem(hTree,&TV);

              if (TV.iImage==DGI_CLIPFOLDER) {

                   switch (MessageBox(hDlg,"»ó¿ë±¸¸¦ Æú´õ¿¡ ¶³¾î¶ß·È½À´Ï´Ù. "

                        "¾î¶»°Ô ÇϽðڽÀ´Ï±î?\r\n\r\n¿¹=»ó¿ë±¸¸¦ Æú´õ ¾È¿¡ Áý¾î ³Ö´Â´Ù.\r\n"

                        "¾Æ´Ï¿À=»ó¿ë±¸¸¦ Æú´õ ´ÙÀ½À¸·Î ¿Å±ä´Ù","Áú¹®",MB_YESNOCANCEL)) {

                   case IDCANCEL:

                        return TRUE;

                   case IDYES:

                        bNext=FALSE;

                        break;

                   case IDNO:

                        bNext=TRUE;

                        break;

                   }

              }

 

              if (TV.iImage==DGI_CLIPROOT) {

                   bNext=FALSE;

              }

 

              LockWindowUpdate(hTree);

              Node=CopyTreeItems2(hTree, hDrag, hTarget,bNext);

              TreeView_EnsureVisible(hTree,Node);

              TreeView_DeleteItem(hTree,hDrag);

              LockWindowUpdate(NULL);

 

              Modified=TRUE;

          }

          return TRUE;

     case WM_TIMER:

          if (wParam == 1) {

              Node=TreeView_GetDropHilight(hTree);

              if ((Node != NULL) && (Node == hTarget)) {

                   ImageList_DragShowNolock(FALSE);

                   TreeView_Expand(hTree,hTarget,TVE_EXPAND);

                   UpdateWindow(hTree);

                   ImageList_DragShowNolock(TRUE);

              }

          }

          if (wParam == 2) {

              SendMessage(hTree,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),NULL);

          }

          if (wParam == 3) {

              SendMessage(hTree,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),NULL);

          }

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          LPNMTREEVIEW ntv;

          LPNMTVDISPINFO ndi;

          hdr=(LPNMHDR)lParam;

          ntv=(LPNMTREEVIEW)lParam;

          ndi=(LPNMTVDISPINFO)lParam;

          if (hdr->hwndFrom == hTree) {

              switch (hdr->code) {

              case TVN_BEGINDRAG:

                   hDrag=ntv->itemNew.hItem;

                   if (hDrag == TreeView_GetRoot(hTree)) {

                        return TRUE;

                   }

                   himl=TreeView_CreateDragImage(hTree,hDrag);

 

                   TreeView_GetItemRect(hTree,hDrag,&rt,TRUE);

                   hotx=ntv->ptDrag.x-(rt.left-18);

                   hoty=ntv->ptDrag.y-rt.top;

                   ImageList_BeginDrag(himl,0,hotx,hoty);

 

                   pt.x=ntv->ptDrag.x;

                   pt.y=ntv->ptDrag.y;

                   ClientToScreen(hDlg,&pt);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

 

                   SetCapture(hDlg);

                   bDrag=TRUE;

                   return TRUE;

              case TVN_SELCHANGED:

                   TV.mask=TVIF_IMAGE | TVIF_PARAM;

                   TV.hItem=ntv->itemNew.hItem;

                   TreeView_GetItem(hTree,&TV);

                   cr=(CClipRecord *)TV.lParam;

                   if (TV.iImage == DGI_CLIP) {

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

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

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

                        // ¹Ì¸® º¸±â Ãâ·Â

                        DisplayClipPreview(pAe,cr);

                   } else {

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

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

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

                        pAe->SetText("",0);

                   }

                   if (TV.iImage == DGI_CLIPROOT) {

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

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

                   } else {

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

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

                   }

                   return TRUE;

              case TVN_BEGINLABELEDIT:

                   TV.mask=TVIF_IMAGE;

                   TV.hItem=ndi->item.hItem;

                   TreeView_GetItem(hTree,&TV);

                   if (TV.iImage != DGI_CLIPROOT) {

                        SendMessage(TreeView_GetEditControl(hTree),EM_LIMITTEXT,31,0);

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);

                   }

                   return TRUE;

              case TVN_ENDLABELEDIT:

                   if (ndi->item.pszText == NULL) {

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        if (strchr(ndi->item.pszText,':') || strchr(ndi->item.pszText,'\\')) {

                            MessageBox(hDlg,"¹­À½ À̸§¿¡ :°ú \\´Â ¾µ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                            SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                        } else {

                            // ½ÇÁ¦ À̸§À» º¯°æÇØ¾ß ÇÑ´Ù. ÀúÀåÇÒ ¶§ NameÀ» ¾îµð¼­ ¾ò´Â°¡¿¡ µû¶ó ¹®Á¦°¡ ´Þ¶óÁø´Ù.

                            TV.mask=TVIF_PARAM;

                            TV.hItem=ndi->item.hItem;

                            TreeView_GetItem(hTree,&TV);

                             cr=(CClipRecord *)TV.lParam;

                            lstrcpy(cr->Name,ndi->item.pszText);

                            SetWindowLongPtr(hDlg,DWLP_MSGRESULT,TRUE);

                            Modified=TRUE;

                        }

                   }

                   return TRUE;

              // lParam¿¡ ±â¾ïµÈ ·¹Äڵ带 ¸ðµÎ »èÁ¦ÇÑ´Ù.

              case TVN_DELETEITEM:

                   TV.mask=TVIF_IMAGE;

                    TV.hItem=ntv->itemOld.hItem;

                   TreeView_GetItem(hTree,&TV);

                   if (TV.iImage == DGI_CLIPROOT) {

                        free((TCHAR *)TV.lParam);

                   } else {

                        cr=(CClipRecord *)ntv->itemOld.lParam;

                        if (cr) {

                            if (cr->Content) {

                                 free(cr->Content);

                             }

                            delete cr;

                        }

                   }

                   return TRUE;

              // ´õºíŬ¸¯Àº »ó¿ë±¸ ÆíÁý°ú °°´Ù.

              case NM_DBLCLK:

                   PostMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNCLIPEDIT,0),0);

                   return TRUE;

              case TVN_KEYDOWN:

                   switch (((NMTVKEYDOWN *)lParam)->wVKey) {

                   case VK_DELETE:

                        if (IsWindowEnabled(GetDlgItem(hDlg,IDC_BTNCLIPDELETE))) {

                            SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNCLIPDELETE,BN_CLICKED),0);

                        }

                        break;

                   case VK_F2:

                        SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNCLIPRENAME,BN_CLICKED),0);

                        break;

                   default:

                        break;

                   }

                   return TRUE;

              }

              return FALSE;

          }

     }

     return FALSE;

}

 

// »ó¿ë±¸ Ãß°¡ ¹× ¼öÁ¤ ´ëÈ­»óÀÚ. lParamÀ¸·Î CClipRecordÀÇ Æ÷ÀÎÅ͸¦ Àü´Þ¹ÞÀ½.

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

{

     static CApiEdit *pAe;

     static CClipRecord *cr;

     RECT brt;

     int len;

     TCHAR szTemp[128];

     const TCHAR *s;

     TCHAR *d;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          SendDlgItemMessage(hDlg,IDC_EDCLIPNAME,EM_LIMITTEXT,31,0);

          SendDlgItemMessage(hDlg,IDC_EDCLIPAUTONAME,EM_LIMITTEXT,15,0);

 

          // ¹öÆ° ÀÚ¸®¿¡ ApiEdit¸¦ ¹èÄ¡ÇÑ´Ù. ´ëºÎºÐÀÇ ¼³Á¤Àº ±âº»°ªÀÌ¸ç ¸î °¡Áö¸¸ ¼öÁ¤ÇÑ´Ù.

          GetWindowRect(GetDlgItem(hDlg,IDC_PLACEAPIEDIT),&brt);

          ScreenToClient(hDlg,(LPPOINT)&brt);

          ScreenToClient(hDlg,(LPPOINT)&brt.right);

          pAe=new CApiEdit;

          pAe->Create(brt.left,brt.top,brt.right-brt.left,brt.bottom-brt.top,

              WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP,0,hDlg);

          SetSetting(*pAe);

          pAe->SetShowState(SHOWMARGIN,TRUE);

          pAe->SetShowState(SHOWLINENUM,TRUE);

          pAe->SetWrap(2);

 

          SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_ADDSTRING,0,(LPARAM)"¾øÀ½");

          SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_ADDSTRING,0,(LPARAM)"C/C++");

          SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_ADDSTRING,0,(LPARAM)"HTML");

          SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_ADDSTRING,0,(LPARAM)"SQL");

 

          SendDlgItemMessage(hDlg,IDC_CBCLIPDEFACTION,CB_ADDSTRING,0,(LPARAM)"»ðÀÔ");

          SendDlgItemMessage(hDlg,IDC_CBCLIPDEFACTION,CB_ADDSTRING,0,(LPARAM)"º¹»ç");

          SendDlgItemMessage(hDlg,IDC_CBCLIPDEFACTION,CB_ADDSTRING,0,(LPARAM)"»õ ÆÄÀÏ·Î");

 

          // »ó¿ë±¸ ³»¿ë Ãâ·Â

          cr=(CClipRecord *)lParam;

          SetDlgItemText(hDlg,IDC_EDCLIPNAME,cr->Name);

          SetDlgItemText(hDlg,IDC_EDCLIPAUTONAME,cr->AutoName);

          SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_SETCURSEL,cr->nParser,0);

          SendDlgItemMessage(hDlg,IDC_CBCLIPDEFACTION,CB_SETCURSEL,cr->DefAction,0);

          if (cr->Content) {

              pAe->SetParser(cr->nParser);

              pAe->SetText(cr->Content,lstrlen(cr->Content));

          }

          SetFocus(pAe->hWnd);

          return FALSE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_CBCLIPSYNTAX:

              switch (HIWORD(wParam)) {

              case CBN_SELCHANGE:

                   pAe->SetParser(SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_GETCURSEL,0,0));

                   return TRUE;

              }

              return FALSE;

          case IDOK:

              // ÆíÁý °á°ú¸¦ ¸Þ¸ð¸®¸¦ ÇÒ´çÇؼ­ µ¹·Á ÁØ´Ù.

              len=pAe->GetTextLength();

              if (len==0) {

                   MessageBox(hDlg,"»ó¿ë±¸ ³»¿ëÀ» ÀÔ·ÂÇØ ÁֽʽÿÀ.","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              GetDlgItemText(hDlg,IDC_EDCLIPAUTONAME,szTemp,16);

              if (strchr(szTemp,' ')) {

                   MessageBox(hDlg,"ÀÚµ¿ »ðÀÔ¸í¿¡´Â °ø¹éÀ» ¾µ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   return TRUE;

              }

 

              if (cr->Content!=NULL) {

                   free(cr->Content);

              }

              cr->Content=(TCHAR *)calloc(len+1,1);

              pAe->GetText(cr->Content,len+1);

 

              // À̸§ÀÌ ¾øÀ» °æ¿ì º»¹®Áß ÀϺθ¦ ¾Ë¾Æ¼­ ÃëÇÑ´Ù.

              // ¾ÕÂÊ °ø¹é ¹«½Ã. DBCS ¹ÝÂÊ ±ÝÁö. 24ÀÚ ÀÌÇÏ. °³ÇàÀ̳ª ¹®¼­ ³¡ ÀνÄ. ÅÇ ¹®¼­´Â °ø¹éÀ¸·Î

              GetDlgItemText(hDlg,IDC_EDCLIPNAME,szTemp,32);

              if (IsStrEmpty(szTemp)) {

                   s=cr->Content;

                   SkipSpace(s);

                   for (d=szTemp;;) {

                        if (d-szTemp > 24 || *s == NULL || *s == '\r') {

                            break;

                        }

                        if (IsDBCSLeadByte(*s)) {

                            *d++=*s++;

                            *d++=*s++;

                        } else {

                            if (*s == '\t') {

                                 *d++=' ';

                                 s++;

                            } else {

                                 *d++=*s++;

                            }

                        }

                   }

                   *d=0;

              }

              StringNormalize(szTemp,cr->Name);

              GetDlgItemText(hDlg,IDC_EDCLIPAUTONAME,cr->AutoName,16);

              cr->nParser=SendDlgItemMessage(hDlg,IDC_CBCLIPSYNTAX,CB_GETCURSEL,0,0);

              cr->DefAction=SendDlgItemMessage(hDlg,IDC_CBCLIPDEFACTION,CB_GETCURSEL,0,0);

 

              DestroyWindow(pAe->hWnd);

              delete pAe;

              EndDialog(hDlg,IDOK);

              return TRUE;

          case IDCANCEL:

              DestroyWindow(pAe->hWnd);

              delete pAe;

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

// ºÐ¼®±â¸¦ º¯°æÇÏ°í ¹Ì¸®º¸±â Ãâ·Â

void DisplayClipPreview(CApiEdit *pAe,CClipRecord *cr)

{

     pAe->SetParser(cr->nParser);

     pAe->SetText(cr->Content,lstrlen(cr->Content));

     // Ç×»ó Àбâ Àü¿ë

     pAe->SetReadOnly(TRUE);

}

 

// ÆíÁýÇÏ´ø ÆÄÀÏÀÇ ÀúÀåÀ» È®ÀÎÇÑ´Ù.

int ConfirmSaveClip(HWND hDlg)

{

     int Result;

 

     Result=MessageBox(hDlg,"ÆíÁýÇÏ´ø ÆÄÀÏÀ» ÀúÀåÇϽðڽÀ´Ï±î?","Áú¹®",MB_YESNOCANCEL);

     if (Result==IDCANCEL || Result==IDNO) {

          return Result;

     }

 

     if (SaveClipFileFromDlg(hDlg)==FALSE) {

          return IDCANCEL;

     }

 

     return IDYES;

}

 

// Path ÆÄÀÏÀ» ´ëÈ­»óÀÚ·Î ÀоîµéÀδÙ.

BOOL LoadClipFileToDlg(HWND hDlg,TCHAR *Path)

{

     HWND hTree;

     CClipFile *cf;

     BOOL Result;

 

     cf=new CClipFile;

     // ¿¡·¯ ó¸®ÇÒ °Í

     if (cf->Load(Path)==0) {

          hTree=GetDlgItem(hDlg,IDC_CLIPTREE);

          TreeView_DeleteAllItems(hTree);

          AddClipFileToTree(hTree,TVI_LAST,"New Clip",cf);

          SetDlgItemText(hDlg,IDC_CLIPFILE,Path);

          SetDlgItemText(hDlg,IDC_CLIPNAME,cf->Header.Name);

          SetDlgItemText(hDlg,IDC_CLIPDESC,cf->Header.Desc);

          Result=TRUE;

     } else {

          Result=FALSE;

     }

     delete cf;

     return Result;

}

 

// cfÀÇ ³»¿ëÀ» hTree ·çÆ®¿¡ Ãß°¡ÇÑ´Ù.

void AddClipFileToTree(HWND hTree,HTREEITEM hPrev,TCHAR *Path,CClipFile *cf)

{

     TVINSERTSTRUCT TI;

     HTREEITEM hRoot;

     TCHAR *p;

 

     TI.hParent=TVI_ROOT;

     TI.hInsertAfter=hPrev;

     TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

     TI.item.iImage=DGI_CLIPROOT;

     TI.item.iSelectedImage=DGI_CLIPROOTSEL;

     TI.item.pszText=cf->Header.Name;

     // ·çÆ®¿¡´Â °æ·Î¸¦ ÀúÀåÇØ µÐ´Ù.

     p=(TCHAR *)malloc(MAX_PATH);

     lstrcpy(p,Path);

     TI.item.lParam=(LPARAM)p;

     hRoot=TreeView_InsertItem(hTree,&TI);

 

     AddClipRecordToTree(hTree,hRoot,cf,-1);

 

     TreeView_SelectItem(hTree,hRoot);

     TreeView_Expand(hTree,hRoot,TVE_EXPAND);

}

 

// pid Â÷Àϵ带 pNode¿¡ Ãß°¡ÇÑ´Ù.

void AddClipRecordToTree(HWND hTree,HTREEITEM pNode,CClipFile *cf,int pid)

{

     int i;

     TVINSERTSTRUCT TI;

     HTREEITEM Node;

     CClipRecord *cr;

 

     for (i=0;i<cf->Header.Num;i++) {

          if (cf->arRecord[i].Parent != pid) {

              continue;

          }

          TI.hParent=pNode;

          TI.hInsertAfter=TVI_LAST;

          TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

          if (cf->arRecord[i].Type == DGCT_FOLDER) {

              TI.item.iImage=DGI_CLIPFOLDER;

              TI.item.iSelectedImage=DGI_CLIPFOLDERSEL;

          } else {

              TI.item.iImage=DGI_CLIP;

              TI.item.iSelectedImage=DGI_CLIPSEL;

          }

          TI.item.pszText=cf->arRecord[i].Name;

 

          // ·¹ÄÚµåÀÇ »çº»À» »õ·Î »ý¼ºÇؼ­ lParam¿¡ ±â¾ï½ÃŲ´Ù.

          cr=new CClipRecord;

          *cr=cf->arRecord[i];

          if (cf->arRecord[i].Content) {

              cr->Content=(TCHAR *)calloc(cf->arRecord[i].len+1,1);

              lstrcpy(cr->Content,cf->arRecord[i].Content);

          }

          TI.item.lParam=(LPARAM)cr;

          Node=TreeView_InsertItem(hTree,&TI);

 

          if (cf->arRecord[i].Type == DGCT_FOLDER) {

              AddClipRecordToTree(hTree,Node,cf,i);

          }

     }

}

 

// pNodeÀÇ ÀڽĵéÀ» cf¿¡ Ãß°¡ÇÑ´Ù.

void AddClipRecordToFile(HWND hTree,HTREEITEM hParent,int pid,CClipFile *cf)

{

     HTREEITEM hChild;

     CClipRecord *cr,*ncr;

     TVITEM TV;

     int self;

 

     // ·çÆ®°¡ ¾Æ´Ñ Æú´õ ·¹Äڵ带 ¸ÕÀú ±â·ÏÇÑ´Ù.

     if (hParent==NULL) {

          hParent=TreeView_GetRoot(hTree);

          self=pid;

     } else {

          TV.mask=TVIF_PARAM | TVIF_IMAGE;

          TV.hItem=hParent;

          TreeView_GetItem(hTree,&TV);

          cr=(CClipRecord *)TV.lParam;

 

          // »çº» ·¹Äڵ带 ÀÛ¼º.Type,Parent´Â Æ®¸®ÀÇ Á¤º¸·ÎºÎÅÍ ¾ò´Â´Ù. Æú´õÀ̹ǷΠContent´Â ¾ø´Ù.

          ncr=new CClipRecord;

          *ncr=*cr;

          ncr->Parent=pid;

          ncr->Type=DGCT_FOLDER;

          self=cf->Header.Num;

          cf->arRecord[self]=*ncr;

          cf->Header.Num++;

     }

 

     hChild=TreeView_GetChild(hTree,hParent);

     while (hChild) {

          TV.mask=TVIF_PARAM | TVIF_IMAGE;

          TV.hItem=hChild;

          TreeView_GetItem(hTree,&TV);

          cr=(CClipRecord *)TV.lParam;

          if (TV.iImage==DGI_CLIPFOLDER) {

              AddClipRecordToFile(hTree,hChild,self,cf);

          } else {

              // »çº» ·¹Äڵ带 ÀÛ¼ºÇÏ°í arRecord¿¡ Ãß°¡ÇÑ´Ù. Content´Â »õ·Î ÇÒ´çÇؼ­ º¹»çÇÏ°í

              // len,Type,Parent´Â Æ®¸®ÀÇ Á¤º¸·ÎºÎÅÍ ¾ò´Â´Ù.

              ncr=new CClipRecord;

              *ncr=*cr;

              ncr->len=lstrlen(ncr->Content);

              ncr->Parent=self;

              ncr->Content=(TCHAR *)calloc(ncr->len+1,1);

              lstrcpy(ncr->Content,cr->Content);

              ncr->Type=DGCT_CLIP;

              cf->arRecord[cf->Header.Num]=*ncr;

              cf->Header.Num++;

          }

          hChild=TreeView_GetNextSibling(hTree,hChild);

     }

}

 

// ÇöÀç ´ëÈ­»óÀÚÀÇ ³»¿ë´ë·Î ¹­À½ ÆÄÀÏÀ» ÀÛ¼ºÇÑ´Ù.

BOOL SaveClipFileFromDlg(HWND hDlg)

{

     HWND hTree;

     CClipFile *cf;

     int RecNum;

     OPENFILENAME OFN;

     TCHAR Path[MAX_PATH];

     TCHAR szTemp[64];

     BOOL Result=TRUE;

 

     GetDlgItemText(hDlg,IDC_CLIPFILE,Path,MAX_PATH);

     if (lstrcmp(Path,"ÀúÀåµÇÁö ¾ÊÀº ÆÄÀÏ")==0) {

          memset(&OFN, 0, sizeof(OPENFILENAME));

          OFN.lStructSize = sizeof(OPENFILENAME);

          OFN.hwndOwner=hDlg;

          OFN.lpstrFilter="´ç±Ù »ó¿ë±¸ ÆÄÀÏ\0*.dgc\0";

          Path[0]=0;

          OFN.lpstrFile=Path;

          OFN.nMaxFile=MAX_PATH;

          OFN.lpstrDefExt="dgc";

          if (GetSaveFileName(&OFN)==FALSE) {

              return FALSE;

          }

     }

 

     hTree=GetDlgItem(hDlg,IDC_CLIPTREE);

     GetDlgItemText(hDlg,IDC_CLIPNAME,szTemp,64);

     if (IsStrEmpty(szTemp)) {

          MessageBox(hDlg,"¹­À½ÀÇ À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

          return FALSE;

     }

 

     // Çì´õ Á¤º¸ ¸ÕÀú ÀÛ¼º. ·¹ÄÚµå ¹è¿­ ¹Ì¸® ÇÒ´çÇØ ³õÀ½

     cf=new CClipFile;

     StringNormalize(szTemp,cf->Header.Name);

     GetDlgItemText(hDlg,IDC_CLIPDESC,cf->Header.Desc,128);

     RecNum=TreeView_GetCount(hTree)-1;

     cf->arRecord=(CClipRecord *)malloc(sizeof(CClipRecord)*RecNum);

 

     AddClipRecordToFile(hTree,NULL,-1,cf);

     if (cf->Save(Path)==FALSE) {

          Result=FALSE;

     }

 

     delete cf;

     return Result;

}

 

HTREEITEM CopyTreeItem2(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest, BOOL bNext)

{

     HTREEITEM hNew;

     TVINSERTSTRUCT TI;

     TVITEM TV;

     TCHAR Text[MAX_PATH];

     CClipRecord *cr,*ncr;

 

     TV.hItem=hSrc;

     TV.mask=TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

     TV.pszText=Text;

     TV.cchTextMax=256;

     TreeView_GetItem(hTree,&TV);

 

     TI.itemex.mask=TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

     TI.itemex.pszText=Text;

     cr=(CClipRecord *)TV.lParam;

     // lParamÀº ´Ù½Ã ÇÒ´çÇؼ­ µî·ÏÇÑ´Ù - ÇÁ·ÎÁ§Æ®¿Í´Â ´Ù¸£´Ù.

     ncr=new CClipRecord;

     *ncr=*cr;

     if (ncr->Content) {

          ncr->len=lstrlen(ncr->Content);

          ncr->Content=(TCHAR *)calloc(ncr->len+1,1);

          lstrcpy(ncr->Content,cr->Content);

     }

     if (TV.iImage==DGI_CLIP) {

          ncr->Type=DGCT_CLIP;

     } else {

          ncr->Type=DGCT_FOLDER;

     }

     TI.itemex.lParam=(LPARAM)ncr;

     TI.itemex.iImage=TV.iImage;

     TI.itemex.iSelectedImage=TV.iSelectedImage;

     if (bNext) {

          TI.hParent=TreeView_GetParent(hTree,hDest);

          TI.hInsertAfter=hDest;

     } else {

          TI.hParent=hDest;

          TI.hInsertAfter=TVI_LAST;

     }

     hNew=TreeView_InsertItem(hTree,&TI);

     return hNew;

}

 

HTREEITEM CopyTreeItems2(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest,BOOL bNext)

{

     HTREEITEM hNew, hChild;

 

     hNew=CopyTreeItem2(hTree, hSrc, hDest,bNext);

 

     hChild=TreeView_GetChild(hTree, hSrc);

     while (hChild != NULL) {

          CopyTreeItems2(hTree,hChild, hNew,FALSE);

          hChild=TreeView_GetNextSibling(hTree,hChild);

     }

 

     return hNew;

}

 

¸Þ´ºÀÇ µµ±¸/»ó¿ë±¸ Ç׸ñÀ» ¼±ÅÃÇÏ¸é »ó¿ë±¸ ´ëÈ­»óÀÚ¸¦ º¸¿© ÁØ´Ù. »ó¿ë±¸¸¦ °ü¸®ÇÏ´Â ¸ðµç Äڵ尡 ´ëÈ­»óÀÚ¿¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ´ëÈ­»óÀÚ¸¦ ¶ç¿ì±â¸¸ ÇÏ¸é µÈ´Ù.

 

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

{

     ....

     case IDM_TOOL_CLIP:

          DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_CLIPFILE),

              hWnd,ClipDlgProc,(LPARAM)NULL);

          break;

 

»ó¿ë±¸ ´ëÈ­»óÀÚÀÇ ÆĶó¹ÌÅÍ´Â ÆíÁý ´ë»ó ¹­À½ ÆÄÀÏÀÇ °æ·ÎÀε¥ NULLÀ̸é ÆíÁý ´ë»óÀÌ ¾ø´Â ä·Î ´ëÈ­»óÀÚ¸¦ ¿¬´Ù. Â÷ÈÄ Æ˾÷ ¸Þ´º¿¡¼­ ´ë»ó »ó¿ë±¸¸¦ Á÷Á¢ ÆíÁýÇÒ ¼ö ÀÖ°Ô ÇÒ °ÍÀÌ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÏ°í ½ÇÇàÇØ º¸¸é »ó¿ë±¸ ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ°í ÆíÁýÇÒ ¼ö ÀÖ´Ù.

³ª.¹­À½ °ü¸®

WM_INITDIALOG¿¡¼­ ¹Ì¸® º¸±â¸¦ À§ÇÑ ApiEdit ÄÁÆ®·ÑÀ» »ý¼ºÇÏ°í ¼Ó¼ºÀ» Àû´çÈ÷ Á¶Á¤ÇÑ´Ù. Á¼Àº ¸éÀû¿¡¼­µµ »ó¿ë±¸ ³»¿ë Àüü¸¦ º¼ ¼ö ÀÖµµ·Ï ÀÚµ¿ °³Çà ¼Ó¼ºÀ» ÁÖ¾ú°í TabÅ° ÀÔ·ÂÀº ±ÝÁöÇÏ¿© TabÅ°¸¦ Æ÷Ä¿½º À̵¿¿¡ »ç¿ëÇß´Ù. »ó¿ë±¸¸¦ Á÷Á¢ ÆíÁýÇÒ ¼ö ¾øµµ·Ï Àбâ Àü¿ëÀ¸·Î ¼³Á¤Çß°í ¹è°æ»öÀ» ¾îµÓ°Ô ÇÏ¿© ÆíÁýÇÒ ¼ö ¾øÀ½À» Ç¥½ÃÇß´Ù. ÀÌ ´ëÈ­»óÀÚÀÇ ApiEdit´Â ´Ü¼øÈ÷ ÅؽºÆ® Ãâ·Â¸¸ ÇϹǷΠâºÐÇÒ ±â´Éµµ »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

lParamÀ¸·Î »ó¿ë±¸ ¹­À½ À̸§ÀÌ Àü´ÞµÇ¾úÀ¸¸é LoadClipFileToDlg ÇÔ¼ö·Î ÀÌ ¹­À½ ÆÄÀÏÀ» ¿­¾î ÆíÁýÇÒ Áغñ¸¦ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Àӽà °´Ã¼ cf¸¦ »ý¼ºÇÏ°í cf->Load¸¦ È£ÃâÇÏ¿© ÆÄÀÏ¿¡ ÀúÀåµÈ »ó¿ë±¸ ·¹Äڵ带 ¸Þ¸ð¸®·Î ÀоîµéÀδÙ. Æ®¸®¸¦ ¿ÏÀüÈ÷ ºñ¿ì°í ¹æ±Ý ÀÐÀº ¹­À½À» Æ®¸®¿¡ Ãß°¡ÇÑ ÈÄ Header¿¡ ÀúÀåµÈ ¹­À½ÀÇ À̸§°ú ¼³¸í, °æ·Î¸¦ ´ëÈ­»óÀÚÀÇ ÄÁÆ®·Ñ¿¡ ´ëÀÔÇÑ´Ù. ±×¸®°í cf¸¦ »èÁ¦ÇÑ ÈÄ ¸®ÅÏÇÑ´Ù.

cf¸¦ »ó¿ë±¸ Æ®¸®¿¡ Ãß°¡ÇÏ´Â ÀÛ¾÷Àº AddClipFileToTree ÇÔ¼ö°¡ ´ã´çÇÑ´Ù. »ó¿ë±¸ °ü¸® ´ëÈ­»óÀÚ´Â ÇÑ ¹ø¿¡ ÇϳªÀÇ ¹­À½¸¸ °ü¸®ÇÏÁö¸¸ ¸ÞÀÎ À©µµ¿ìÀÇ »ó¿ë±¸ âÀº µ¿½Ã¿¡ ¿©·¯ °³ÀÇ »ó¿ë±¸¸¦ ¿­¾î ³õ°í »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ ¹­À½À» Æ®¸®¿¡ Ãß°¡ÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. AddClipFileToTree ÇÔ¼ö´Â ·çÆ® ³ëµå¸¦ ¸ÕÀú µî·ÏÇÏ°í ·çÆ®ÀÇ lParam¿¡ °æ·Î¸¦ ÀúÀåÇØ µÐ´Ù. ÀÌ °æ·Î´Â °ü¸® ´ëÈ­»óÀÚ¿¡¼­´Â »ç¿ëµÇÁö ¾ÊÀ¸¸ç »ó¿ë±¸ â¿¡¼­ ´ë»ó ¹­À½ ÆÄÀÏÀ» ãÀ» ¶§¸¸ »ç¿ëµÈ´Ù. ·çÆ® µî·Ï ÈÄ AddClipRecordToTree ÇÔ¼ö·Î ·¹Äڵ带 Ãß°¡ÇÑ´Ù.

Æ®¸®ÀÇ ±¸Á¶°¡ ¿ø·¡ Àç±ÍÀûÀ̱⠶§¹®¿¡ ÀÌ ÇÔ¼ö´Â Àç±Í È£ÃâÀ» »ç¿ëÇÑ´Ù. cf->Header.Num±îÁö ·çÇÁ¸¦ µ¹¸é¼­ Àμö·Î Àü´ÞµÈ pid ·¹ÄÚµåÀÇ ÀÚ½Ä ·¹Äڵ带 pNode¾Æ·¡¿¡ Ãß°¡ÇÑ´Ù. À̶§ °¢ ³ëµåÀÇ lParam¿¡´Â CClipRecord ±¸Á¶Ã¼ÀÇ »çº»À» »ý¼ºÇؼ­ ±× Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù. ±×·¡¾ß Æ®¸®ÀÇ ³ëµå·ÎºÎÅÍ ³»¿ëÀ» ¹Ù·Î ±¸ÇÒ ¼ö ÀÖ´Ù. Àμö·Î Àü´ÞµÈ cf °´Ã¼ÀÇ ·¹ÄÚµå´Â ÀӽÿëÀ̱⠶§¹®¿¡ ÀÌ °´Ã¼ÀÇ ¸â¹öÀÎ arRecord ¿ä¼ÒÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â °ÍÀº Àǹ̰¡ ¾øÀ¸¸ç ¹Ýµå½Ã »çº»À» ÀÛ¼ºÇؼ­ lParam¿¡ ³Ö¾î µÎ¾î¾ß ÇÏ°í »çº» ·¹ÄÚµåÀÇ Contentµµ ¸Þ¸ð¸®¸¦ »õ·Î ÇÒ´ç¹Þ¾Æ¾ß ÇÑ´Ù. ÀÌ Æ÷ÀÎÅÍ´Â Æ®¸®ÀÇ ³ëµå°¡ Á¦°ÅµÉ ¶§ °°ÀÌ »èÁ¦µÇ¹Ç·Î new·Î °´Ã¼¸¦ »ý¼ºÇؼ­ Æ÷ÀÎÅ͸¦ ´ëÀÔ¸¸ ÇØ ³õÀ¸¸é µÈ´Ù. ¹æ±Ý »ðÀÔÇÑ ·¹Äڵ尡 Æú´õÀ̸é ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÏ¿© ÇöÀç ³ëµå¿¡ ÀÚ½ÅÀÇ ¸ðµç Â÷Àϵ带 Ãß°¡ÇÑ´Ù. ÀÌ·±½ÄÀ¸·Î cfÀÇ ¸ðµç ·¹Äڵ尡 Æ®¸®·Î ÀÐÇôÁø´Ù. È£Ãâ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

ÇÔ¼öÀÇ Àç»ç¿ë¼ºÀ» ³ôÀ̱â À§ÇØ ¿©·¯ ´Ü°èÀÇ ÇÔ¼ö¸¦ ¹Ì¸® ÀÛ¼ºÇØ µÎ¾ú´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ »ó¿ë±¸ â¿¡¼­µµ ÀÌ ÇÔ¼ö·Î ¹­À½À» Àд´Ù. ¹­À½À» ¿­¾î¼­ Æ®¸®¿¡ Ãâ·ÂÇßÀ» ¶§ °¢ ³ëµåÀÇ lParam¿¡´Â »ó¿ë±¸ ·¹ÄÚµåÀÇ Æ÷ÀÎÅÍ°¡ ÀúÀåµÇ¸ç ·çÆ® ³ëµå¿¡´Â »ó¿ë±¸ ¹­À½ ÆÄÀÏÀÇ °æ·Î°¡ ÀúÀåµÈ´Ù. ¶ÇÇÑ lParam¿¡ ÀúÀåµÈ »ó¿ë±¸ ·¹ÄÚµåÀÇ Content ¸â¹ö´Â »ó¿ë±¸ ³»¿ë¿¡ ´ëÇÑ ¹®ÀÚ¿­ ¹öÆÛ Æ÷ÀÎÅ͸¦ °¡¸®Å°°í ÀÖ´Ù. ¾ÆÁÖ °£´ÜÇÑ ¹­À½ ÆÄÀÏÀ» ¿¹·Î µç´Ù¸é ´ÙÀ½°ú °°¾ÆÁú °ÍÀÌ´Ù.

¿­·ÁÁø »ó¿ë±¸ÀÇ ¸ðµç ³»¿ëÀº Æ®¸®°¡ °¡Áö¹Ç·Î »ç¿ëÇÒ ¶§´Â ´Ù½Ã ÆÄÀÏÀ» ¾×¼¼½ºÇÒ ÇÊ¿ä¾øÀÌ Æ®¸® ÄÁÆ®·Ñ·ÎºÎÅÍ ÇÊ¿äÇÑ Á¤º¸¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ÀÌ·± º¹ÀâÇÑ Á¤º¸µéÀ» Æ®¸® ³ëµåÀÇ lParam¿¡ ±â¾ï½ÃÄÑ ³õ¾ÒÀ¸¹Ç·Î ³ëµå°¡ Æı«µÉ ¶§ ¸ðµç ºÎ°¡ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. TVN_DELETEITEM ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ Çѹø¸¸ ÇØÁ¦ÇÏ¸é µÈ´Ù. ´ÙÀ½ Äڵ尡 ÀÌ·± ¿ªÇÒÀ» ÇÑ´Ù.

 

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

{

     ....

     case WM_NOTIFY:

              ....

              case TVN_DELETEITEM:

                   TV.mask=TVIF_IMAGE;

                   TV.hItem=ntv->itemOld.hItem;

                   TreeView_GetItem(hTree,&TV);

                   if (TV.iImage == DGI_CLIPROOT) {

                        free((TCHAR *)TV.lParam);

                   } else {

                        cr=(CClipRecord *)ntv->itemOld.lParam;

                        if (cr) {

                            if (cr->Content) {

                                 free(cr->Content);

                            }

                            delete cr;

                        }

                   }

                   return TRUE;

 

Æ®¸®ÀÇ ³ëµå°¡ »ó¿ë±¸ ·¹Äڵ带 ¸ðµÎ ±â¾ïÇÏ°í ÀÖ¾î¾ß ÇÏ´Â ÀÌÀ¯´Â ¾ðÁ¦µçÁö ÆíÁýµÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÆíÁýÀÌ ¹ß»ýÇÒ ¶§¸¶´Ù °¢ ³ëµåÀÇ lParam¿¡ ÀúÀåµÈ ·¹Äڵ常 ¼öÁ¤ÇÏ¸é µÈ´Ù. Content´Â °¡º¯ ±æÀ̸¦ °¡Áö¹Ç·Î ºó¹øÈ÷ ÀçÇÒ´çµÇ¸ç Parent°°Àº Á¤º¸´Â ½Ç½Ã°£ ¾÷µ¥ÀÌÆ®°¡ ¾î·Æ±â ¶§¹®¿¡ Æ®¸®¿¡¼­ ³ëµå°£ÀÇ °èÃþ ±¸Á¶¸¦ Á÷Á¢ ÆíÁýÇÏ°í ÀúÀåÇÒ ¶§ Parent¸¦ ´Ù½Ã Á¶»çÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù. ¶ÇÇÑ ·¹ÄÚµå »èÁ¦½Ã ´Ù¸¥ ·¹ÄÚµåÀÇ Ã·ÀÚ°¡ º¯°æµÇ±â ¶§¹®¿¡ Parent³ª ·¹ÄÚµå ÷ÀÚ¸¦ °ü¸®ÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ¸ç ·¹ÄÚµå À̵¿½Ã¿¡´Â ÀÌ·± ¹®Á¦°¡ ´õ ½ÉÇÏ´Ù.

»ó¿ë±¸ ·¹Äڵ尡 Æ®¸®ÀÇ ³ëµå·Î µî·ÏµÇ¾î ÀÖ´Â »óÅ¿¡¼­ TypeÀ̳ª Parent ¸â¹ö´Â »ç¿ëµÇÁö ¾Ê´Â´Ù. Type´ë½Å ³ëµåÀÇ À̹ÌÁö°¡ »ç¿ëµÇ¸ç Parent ´ë½Å ³ëµå³¢¸®ÀÇ ¹°¸®ÀûÀÎ °èÃþ ±¸Á¶¸¦ ÂüÁ¶ÇÑ´Ù. Áï, Æ®¸®´Â »ó¿ë±¸ ¹­À½ÀÇ ¿ÏÀüÇÑ »çº»À» °¡Áø´Ù.

¹­À½À» ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÀÛ¾÷Àº SaveClipFileFromDlg ÇÔ¼ö°¡ ó¸®Çϴµ¥ À̸§ÀÌ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ¹­À½ÀÇ ÆÄÀϸíÀ» ¸ÕÀú ÀԷ¹޴´Ù. »ó¿ë±¸ ¹­À½ ÆÄÀÏÀÇ µðÆúÆ® È®ÀåÀÚ´Â dgcÀÌ´Ù. cf Àӽà °´Ã¼¸¦ »ý¼ºÇÏ°í ÃÑ ³ëµå °³¼ö - 1¸¸Å­ arRecord ¹è¿­À» ÇÒ´çÇØ ³õ´Â´Ù. ·çÆ® ³ëµå´Â ÆÄÀÏ¿¡ ÀúÀåµÇÁö ¾ÊÀ¸¸ç ´ë½Å ·çÆ®ÀÇ Á¦¸ñ¸¸ Header.Name¿¡ ÀúÀåµÈ´Ù. ±×·¡¼­ arRecrod ¹è¿­Àº ½ÇÁ¦ ³ëµå °³¼öº¸´Ù Çϳª ´õ Àû´Ù.

°¢ ·¹ÄÚµå´Â AddClipRecordToFile ÇÔ¼ö·Î Á¶»çÇϴµ¥ ÀÌ ÇÔ¼öµµ Àç±Í È£Ãâ ±¸Á¶¸¦ »ç¿ëÇÑ´Ù. Æ®¸®ÀÇ °¢ ³ëµå¸¦ ¼øȸÇϸ鼭 »çº» ·¹Äڵ带 ÀÛ¼ºÇÏ°í ÀÌ ·¹Äڵ带 cf¿¡ Ãß°¡ÇÑ´Ù. Çì´õ¿Í ·¹ÄÚµå ¹è¿­À» ¿Ï¼ºÇÑ ÈÄ ÃÖÁ¾ÀûÀ¸·Î cf->Save¸¦ È£ÃâÇϸé cf³»ÀÇ ¸ðµç »ó¿ë±¸µéÀÌ ÆÄÀÏ·Î ÀúÀåµÈ´Ù. ¿©±â¼­ cf°´Ã¼´Â Æ®¸®ÀÇ °¢ ³ëÆ®¿¡ Èð¾îÁ® ÀÖ´Â ·¹Äڵ带 ¼öÁýÇϱâ À§ÇÑ Àӽà °´Ã¼ÀÌ´Ù. ConfirmSaveClip ÇÔ¼ö´Â ÀúÀåÈ®ÀÎÀ» Çϴµ¥ »õ ¹­À½À» ¸¸µé ¶§³ª ´Ù¸¥ ¹­À½À» ¿­±â Àü¿¡ È£ÃâµÈ´Ù.

»õ ¹­À½À» ¸¸µé ¶§´Â ·çÆ® ³ëµå¸¸ µî·ÏÇÏ°í ÇÁ·ÎÁ§Æ® À̸§ ¿¡µðÆ®·Î Æ÷Ä¿½º¸¦ ¿Å°Ü ¹­À½ÀÇ À̸§ ÀÔ·ÂÀ» ¿ä±¸ÇÑ´Ù. Åõ¸®¸¸ °¡Áø ºó ¹­À½ÀÌ ¸¸µé¾îÁö´Âµ¥ ÀÌ »óÅ¿¡¼­ Æ®¸®¿¡ Æú´õ³ª »ó¿ë±¸ Æú´õ¸¦ Ãß°¡ÇÏ¸é ¸ðµç µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ´Ù°¡ ÀúÀåÇÒ ¶§ Àӽà °´Ã¼¿¡ ¼öÁýµÇ¾î ÆÄÀÏ·Î Ãâ·ÂµÈ´Ù.

´Ù.Æú´õ °ü¸®

Æú´õ¿Í »ó¿ë±¸ °ü¸®´Â ¿ÞÂÊÀÇ Æ®¸®¿¡¼­ ÁÖ·Î ¼öÇàÇÑ´Ù. Æ®¸®´Â Æú´õ¿Í »ó¿ë±¸ ±¸Á¶¸¦ ¸¶Ä¡ Ž»ö±âÀÇ µð·ºÅ丮ó·³ º¸¿©ÁÖ°í °ü¸®ÇÏ¸ç ¾Æ·¡ÂÊÀÇ ¸í·É ¹öÆ°µé·Î Ãß°¡, »èÁ¦, ÆíÁýÇÑ´Ù. Æú´õ Ãß°¡ ¹öÆ°À» ´©¸£¸é »õ·Î¿î Æú´õ ·¹Äڵ带 »ý¼ºÇÏ°í ÇöÀç ³ëµåÀÇ ÀÚ½Ä ³ëµå·Î Ãß°¡ÇÑ´Ù. »õ·Î ¸¸µé¾îÁö´Â Æú´õÀÇ À̸§Àº ÀÏ´Ü "»õ Æú´õ"ÀÌµÇ ³ëµå¸¦ ¸¸µç Á÷ÈÄ¿¡ ·¹À̺í ÆíÁý¸ðµå·Î µé¾î°¡ »ç¿ëÀÚ°¡ Æú´õ¸íÀ» ¿øÇϴ´ë·Î ¼öÁ¤ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. µû¶ó¼­ Æú´õ Ãß°¡¸¦ À§ÇØ º°µµÀÇ ´ëÈ­»óÀÚ¸¦ ¶ç¿ìÁö´Â ¾Ê´Â´Ù.

»ó¿ë±¸¸¦ Ãß°¡ÇÒ ¶§µµ ºñ½ÁÇÑ Äڵ尡 ½ÇÇàµÇ´Âµ¥ ÇöÀç ¼±ÅÃµÈ ³ëµå ¾Æ·¡¿¡ »õ ·¹Äڵ带 »ý¼ºÇÏ¿© Ãß°¡ÇÑ´Ù. ´Ü, »ó¿ë±¸´Â Æú´õº¸´Ù º¹ÀâÇϱ⠶§¹®¿¡ º°µµÀÇ ´ëÈ­»óÀÚ¸¦ ¶ç¿ö ¼Ó¼ºµéÀ» ÀԷ¹޴´Ù. »ó¿ë±¸ ÆíÁý ´ëÈ­»óÀÚÀÇ ¸ð¾çÀº ´ÙÀ½°ú °°À¸¸ç ÀÌ ´ëÈ­»óÀÚÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â EditClipProcÀÌ´Ù.

»ó¿ë±¸ ÆíÁý ´ëÈ­»óÀÚ´Â lParamÀ¸·Î ÆíÁý ´ë»ó »ó¿ë±¸ ·¹ÄÚµåÀÇ Æ÷ÀÎÅ͸¦ Àü´Þ¹ÞÀ¸¹Ç·Î »õ »ó¿ë±¸¸¦ Ãß°¡ÇÒ ¶§´Â ºó ·¹ÄÚµå¶óµµ Àü´ÞÇØ¾ß ÇÑ´Ù. À§ÂÊ¿¡ »ó¿ë±¸ ÆíÁýÀ» À§ÇÑ ApiEdit ÄÁÆ®·ÑÀÌ ÀÖ°í ¿©±â¼­ Á÷Á¢ »ó¿ë±¸ ³»¿ëÀ» ÀÔ·Â ¹× ÆíÁýÇÑ´Ù. ¾Æ·¡ÂÊ¿¡´Â À̸§, ÀÚµ¿»ðÀÔ¸í, »ç¿ë ¹®¹ý, ´õºí Ŭ¸¯½ÃÀÇ ±âº» µ¿ÀÛ µîÀÇ ¼Ó¼ºÀ» ¼±ÅÃÇÑ´Ù.

ÆíÁýÀÌ ¿Ï·áµÇ¸é lParamÀ¸·Î Àü´ÞµÈ cr¿¡ ÆíÁýµÈ ³»¿ëÀ» ´Ù½Ã ¸®ÅÏÇÑ´Ù. ´Ü¼ø ¼Ó¼ºÀº ´Ù½Ã Á¶»ç¸¸ ÇÏ¸é µÇÁö¸¸ ³»¿ë°ú À̸§Àº Á¶±Ý Ưº°ÇÏ°Ô °ü¸®ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ³»¿ëÀ» ÀúÀåÇÏ´Â Content´Â ÆíÁý¿¡ ÀÇÇØ ±æÀÌ°¡ ´õ ´Ã¾î³¯ ¼öµµ ÀÖÀ¸¹Ç·Î ´Ù½Ã ÇÒ´çÇÑ´Ù. À̸§Àº »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ À̸§À» »ç¿ëÇ쵂 ¸¸¾à ÀÔ·ÂÇÏÁö ¾Ê¾ÒÀ» °æ¿ì º»¹® ³»¿ë Áß ÀϺθ¦ ¾Ë¾Æ¼­ ÃëÇÑ´Ù. º»¹® ³»¿ëÁß ÀϺθ¦ ±×´ë·Î »ç¿ëÇ쵂 DBCS °æ°è¿¡ °ÉÄ¡Áö ¾Ê¾Æ¾ß ÇÏ¸ç °³Çà Äڵ峪 ¹®¼­ ³¡À» ¸¸³ª¸é ÁßÁöÇÑ´Ù. ÅÇ ÄÚµå´Â °ø¹éÀ¸·Î ¹Ù²Ù¾î°í Á¤±ÔÈ­ÇÏ¿© ¾ÕµÚ¿¡ °ø¹éÀ» Á¦°ÅÇÑ´Ù. ¸ÅÅ©·Î¿¡ »ó¿ë±¸ À̸§ÀÌ »ç¿ëµÇ¹Ç·Î ÀÏÁ¤ÇÑ Çü½ÄÀ» ÃëÇÏ´Â °ÍÀÌ ÁÁ´Ù.

Æú´õ³ª »ó¿ë±¸³ª »õ·Î Ãß°¡µÇ¸é lParam¿¡ CClipRecrod ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ°¡ ÀúÀåµÈ´Ù. ÀÌÈÄ ·¹Äڵ带 °ü¸®ÇÏ´Â ¸ðµç ÄÚµå´Â ÀÌ Æ÷ÀÎÅͷκÎÅÍ Á¤º¸¸¦ ±¸ÇÑ´Ù. ¿¹¸¦ µé¾î ¼±ÅÃÀÌ º¯°æµÉ ¶§ÀÎ TVN_SELCHANGED¿¡¼­´Â »õ·Î ¼±ÅÃµÈ ³ëµåÀÇ lParamÀ¸·Î Æ÷ÀÎÅ͸¦ ±¸ÇØ DisplayClipPreview¸¦ È£ÃâÇϸç ÀÌ ÇÔ¼ö´Â Àü´ÞµÈ ±¸Á¶Ã¼·ÎºÎÅÍ ºÐ¼®±â¸¦ ¼³Á¤ÇÏ°í ÅؽºÆ®¸¦ ¹Ì¸®º¸±â ApiEdit¿¡ ´ëÀÔÇÑ´Ù. ÀÌ·¸°Ô ³ëµå¿¡ ÀúÀåµÈ ±¸Á¶Ã¼´Â TVN_DELETEITEM¿¡¼­ ÀÏ°ý Á¤¸®ÇϹǷΠÆı«µÇ±âÀü±îÁö ±×´ë·Î µÎ¸é µÈ´Ù.

Æú´õ Æ®¸®¿¡¼­ ·¹Äڵ带 µå·¡±×ÇÏ¿© Æú´õ¿Í »ó¿ë±¸ÀÇ °èÃþ °ü°è¸¦ ÆíÁýÇÒ ¼ö Àִµ¥ ÀÌ ÄÚµå´Â ÇÁ·ÎÁ§Æ® Æ®¸®¸¦ °ü¸®ÇÏ´Â ¹æ¹ý°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ CopyTreeItem2 ÇÔ¼ö¿¡¼­ ³ëµå¸¦ º¹»çÇÒ ¶§ lParam¿¡ ÀúÀåµÇ¾î ÀÖ´Â CClipRecord ±¸Á¶Ã¼ÀÇ »çº»À» º¹»çÇÑ´Ù´Â Á¡¸¸ ´Ù¸£´Ù. ÇÁ·ÎÁ§Æ®´Â lParam¿¡ ¹®ÀÚ¿­À» ÀúÀåÇØ µÎÁö¸¸ »ó¿ë±¸ Æ®¸®´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍÀÌ°í ±× ¾È¿¡ Content¶ó´Â ¶Ç ´Ù¸¥ µ¿Àû ¸Þ¸ð¸®°¡ ÀÖÀ¸¹Ç·Î ±íÀº º¹»ç¸¦ ÇØ¾ß ÇÑ´Ù.