»ó¿ë±¸µµ ¸ÅÅ©·Î³ª ´ÜÃàÅ°¿Í ¸¶Âù°¡Áö·Î ´ëÈ»óÀÚ·Î °ü¸®ÇÑ´Ù. ´ëÈ»óÀÚ ÅÛÇø´Àº ¸®¼Ò½º¿¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ°í »ó¿ë±¸ Æ®¸®¿¡ »ç¿ëÇÒ À̹ÌÁöµµ ÀÛ¼ºÇØ µÎ¾ú´Ù. »ó¿ë±¸ Æ®¸®¿¡ »ç¿ëÇÒ À̹ÌÁö´Â »õ·Î ¸¸µéÁö ¾Ê°í ÆÄÀÏâÀÇ À̹ÌÁö¸¦ °°ÀÌ »ç¿ëÇÑ´Ù. 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¶ó´Â ¶Ç ´Ù¸¥ µ¿Àû ¸Þ¸ð¸®°¡ ÀÖÀ¸¹Ç·Î ±íÀº º¹»ç¸¦ ÇØ¾ß ÇÑ´Ù.