»ó¿ë±¸¿Í »ó¿ë±¸ â °ü¸®¸¦ À§ÇØ ¿©¼¸ °³ÀÇ »õ·Î¿î ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.
struct SOption
{
....
BOOL bShowClipWnd;
int ClipWndRatio;
BOOL bReloadClip;
BOOL bPreviewClip;
BOOL bUseAutoClip;
BOOL bAutoClipByTab;
};
bShowClipWnd´Â »ó¿ë±¸ âÀ» º¸ÀÏ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. ÆíÁýâÀÌ ±×¸® ³ÐÁö ¾ÊÀ¸¹Ç·Î »ó¿ë±¸ âÀº ÆÄÀÏ⠾Ʒ¡ÂÊ¿¡ ¹èÄ¡ÇÒ °ÍÀÌ´Ù. ClipWndRatio´Â ÆÄÀÏâ°ú »ó¿ë±¸Ã¢ÀÇ ³ôÀÌ ºñÀ²ÀÌ¸ç ¸¸ºÐÀ²ÀÌ´Ù. bReloadClipÀº ½ÃÀÛÇÒ ¶§ Àü¿¡ »ç¿ëÇÏ´ø »ó¿ë±¸¸¦ ´Ù½Ã ÀÐÀ» °ÍÀΰ¡¸¦ ÁöÁ¤Çϸç bPreviewClipÀº »ó¿ë±¸ â¿¡¼ ÅøÆÁÀ¸·Î ³»¿ëÀ» ¹Ì¸® º¸¿©ÁÙ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. ³ª¸ÓÁö µÎ °³ÀÇ ¿É¼ÇÀº ÀÚµ¿ »ó¿ë±¸¿Í °ü·ÃµÈ ¿É¼ÇÀÌ´Ù. µðÆúÆ®°ªÀº ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.
void SOption::Init()
{
....
bShowClipWnd=TRUE;
ClipWndRatio=5000;
bReloadClip=TRUE;
bPreviewClip=FALSE;
bUseAutoClip=TRUE;
bAutoClipByTab=TRUE;
}
Å×½ºÆ®¸¦ ÇØ¾ß ÇϹǷΠ¸ðµç ¿É¼ÇÀ» ÀÏ´Ü È°¼ºÈÇÑä·Î ÃʱâÈÇß´Ù. Save¿¡¼ ÀÌ ¿É¼ÇµéÀ» ÀúÀåÇϰí Load¿¡¼ ´Ù½Ã ºÒ·¯¿Â´Ù.
void SOption::Load(TCHAR *Key)
{
....
bShowClipWnd=SHRegReadInt(SHCU,szKey,"bShowClipWnd",0);
ClipWndRatio=SHRegReadInt(SHCU,szKey,"ClipWndRatio",0);
bReloadClip=SHRegReadInt(SHCU,szKey,"bReloadClip",0);
bPreviewClip=SHRegReadInt(SHCU,szKey,"bPreviewClip",0);
bUseAutoClip=SHRegReadInt(SHCU,szKey,"bUseAutoClip",0);
bAutoClipByTab=SHRegReadInt(SHCU,szKey,"bAutoClipByTab",0);
void SOption::Save(TCHAR *Key)
{
....
SHRegWriteInt(SHCU,szKey,"bShowClipWnd",bShowClipWnd);
SHRegWriteInt(SHCU,szKey,"ClipWndRatio",ClipWndRatio);
SHRegWriteInt(SHCU,szKey,"bReloadClip",bReloadClip);
SHRegWriteInt(SHCU,szKey,"bPreviewClip",bPreviewClip);
SHRegWriteInt(SHCU,szKey,"bUseAutoClip",bUseAutoClip);
SHRegWriteInt(SHCU,szKey,"bAutoClipByTab",bAutoClipByTab);
´ÙÀ½Àº »ç¿ëÀÚµéÀÌ ¼³Á¤À» º¯°æÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤ ´ëÈ»óÀÚ¿¡¼ ÀÌ ¿É¼ÇµéÀ» °ü¸®ÇÑ´Ù. ¸¹ÀÌ ÇØ º» ÀÛ¾÷À̹ǷΠƯº°ÇÑ ±â¼úÀº ÇÊ¿ä¾ø°í ¼Õ¸¸ ºÎÁö·±È÷ ³î¸®¸é µÈ´Ù. »ó¿ë±¸ ´Ù½Ã ¿±â ¿É¼ÇÀº ÀÏ¹Ý ÆäÀÌÁö¿¡ ¹èÄ¡µÇ¾î ÀÖ´Ù.
BOOL CALLBACK GeneralDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
....
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_SETACTIVE:
....
CheckDlgButton(hDlg,IDC_RELOADCLIP,NewOption.bReloadClip);
....
case PSN_KILLACTIVE:
....
NewOption.bReloadClip=IsDlgButtonChecked(hDlg,IDC_RELOADCLIP);
....
case WM_COMMAND:
switch (LOWORD(wParam)) {
....
case IDC_RELOADPROJECT:
case IDC_RELOADCLIP:
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
ÀÌ ¿É¼ÇÀº Á¾·á Á÷Àü¿¡¸¸ Á¡°ËµÇ¹Ç·Î ApplyNow¿¡¼ ó¸®ÇÒ Çʿ䰡 ¾ø´Ù. ÀÚµ¿ »ó¿ë±¸ ¿É¼Ç µÑÀº µ¿ÀÛ ÆäÀÌÁö¿¡ ÀÖ´Ù.
BOOL CALLBACK OperationDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
....
case IDC_USEAUTOCLIP:
AdjustDlgUI(10,hDlg);
case IDC_WORDWRAP:
case IDC_HANGUL:
case IDC_AUTOCONVERT:
case IDC_AUTOCLIPBYTAB:
case IDC_PREVIEWCLIP:
PropSheet_Changed(GetParent(hDlg),hDlg);
break;
}
return TRUE;
case WM_NOTIFY:
LPNMHDR hdr;
hdr=(LPNMHDR)lParam;
switch (hdr->code) {
case PSN_SETACTIVE:
....
CheckDlgButton(hDlg,IDC_PREVIEWCLIP,NewOption.bPreviewClip);
CheckDlgButton(hDlg,IDC_USEAUTOCLIP,NewOption.bUseAutoClip);
CheckDlgButton(hDlg,IDC_AUTOCLIPBYTAB,NewOption.bAutoClipByTab);
AdjustDlgUI(10,hDlg);
return TRUE;
case PSN_APPLY:
ApplyNow();
return TRUE;
case PSN_KILLACTIVE:
....
NewOption.bPreviewClip=IsDlgButtonChecked(hDlg,IDC_PREVIEWCLIP);
NewOption.bUseAutoClip=IsDlgButtonChecked(hDlg,IDC_USEAUTOCLIP);
NewOption.bAutoClipByTab=IsDlgButtonChecked(hDlg,IDC_AUTOCLIPBYTAB);
return TRUE;
}
break;
}
return FALSE;
}
AdjustDlgUI¿¡¼ ÄÁÆ®·ÑÀÇ »ç¿ë °¡´É¼º ¿©ºÎ¸¦ °ü¸®ÇÑ´Ù. ÅÇŰ·Î ÀÚµ¿ »ó¿ë±¸ »ðÀÔ ¿É¼ÇÀº ÀÚµ¿ »ó¿ë±¸ ±â´ÉÀ» »ç¿ëÇÒ ¶§¸¸ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
void AdjustDlgUI(int Page,HWND hDlg)
{
switch (Page) {
....
case 10:
if (IsDlgButtonChecked(hDlg,IDC_USEAUTOCLIP) == BST_CHECKED) {
EnableWindow(GetDlgItem(hDlg,IDC_AUTOCLIPBYTAB),TRUE);
} else {
EnableWindow(GetDlgItem(hDlg,IDC_AUTOCLIPBYTAB),FALSE);
}
break;
}
}
ÀÌ µÎ ¿É¼ÇÀº ÆíÁýÁß¿¡ »ç¿ëµÇ¹Ç·Î º¯°æ Áï½Ã Àû¿ëµÇ¾î¾ß ÇÑ´Ù. ApplyNow¿¡ µÎ ¿É¼ÇÀ» Àд Äڵ带 ÀÛ¼ºÇϰí SetSetting¿¡¼ ApiEdit ÄÁÆ®·Ñ¿¡µµ Àû¿ëÇÑ´Ù.
void ApplyNow()
{
if (Option.bShowFileTab != NewOption.bShowFileTab ||
Option.bShowFileWnd != NewOption.bShowFileWnd ||
Option.bShowStatus != NewOption.bShowStatus ||
Option.bShowToolBar != NewOption.bShowToolBar ||
Option.bShowClipWnd != NewOption.bShowClipWnd) {
bRelayout=TRUE;
}
....
while (hChild) {
....
if (Option.bUseAutoClip != NewOption.bUseAutoClip) {
pSi->Ae.SetUseAutoClip(NewOption.bUseAutoClip);
}
if (Option.bAutoClipByTab != NewOption.bAutoClipByTab) {
pSi->Ae.SetAutoClipByTab(NewOption.bAutoClipByTab);
}
hChild=GetWindow(hChild,GW_HWNDNEXT);
}
....
void SetSetting(CApiEdit &Ae)
{
....
if (Option.bUseAutoClip != Ori.bUseAutoClip) {
Ae.SetUseAutoClip(Option.bUseAutoClip);
}
if (Option.bAutoClipByTab != Ori.bAutoClipByTab) {
Ae.SetAutoClipByTab(Option.bAutoClipByTab);
}
}
»ó¿ë±¸ â º¸±â ¿É¼ÇÀº ´ëÈ»óÀÚ¿¡ ÀÖÁö ¾Ê°í º¸±â ¸Þ´º¿¡ ÀÖ´Ù. ÀÌ ¿É¼ÇÀÌ º¯°æµÇ¸é Â÷Àϵå âµéÀ» ´Ù½Ã Àç¹èÄ¡ÇØ¾ß ÇÑ´Ù.
»ó¿ë±¸¸¦ ½Å¼ÓÇÏ°Ô ÂüÁ¶Çϱâ À§Çؼ´Â »ó¿ë±¸ ¸ñ·ÏÀÌ Ç×»ó ȸ鿡 Ç¥½ÃµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼ º°µµÀÇ »ó¿ë±¸ âÀ» ¸¸µé¾î ÆÄÀÏ⠾Ʒ¡¿¡ ¹èÄ¡Çϱâ·Î ÇÑ´Ù. »ó¿ë±¸ â°ú »ó¿ë±¸ ¸ñ·Ï Ç¥½Ã¿¡ »ç¿ëµÉ Æ®¸®ÀÇ À©µµ¿ì ÇÚµéÀ» Dangeun.cpp¿¡ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.
HWND hClipWnd;
HWND hClipTree;
¿ÜºÎ¿¡¼µµ ÀÌ ÇÚµéÀ» ÂüÁ¶ÇϹǷΠglobal.h¿¡µµ extern ¼±¾ð
extern HWND hClipWnd;
extern HWND hClipTree;
WinMain¿¡¼ »ó¿ë±¸ âÀ» À§ÇÑ À©µµ¿ì Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù. ÀÌÈÄÀÇ ÀÛ¾÷Àº À©µµ¿ì¸¦ ¹èÄ¡ÇÏ´Â ºñ±³Àû ½¬¿î ½Ç½ÀÀ̹ǷΠ¿ä¾àÀûÀ¸·Î °úÁ¤À» Á¤¸®Çß´Ù.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
WndClassEx.lpszClassName="DGClipFrame";
WndClassEx.lpfnWndProc=(WNDPROC)DGClipProc;
RegisterClassEx(&WndClassEx);
Ưº°ÇÑ ½ºÅ¸ÀÏÀÌ ¾ø´Â º¸ÆíÀûÀÎ À©µµ¿ì Ŭ·¡½ºÀÌ´Ù. ¸Þ½ÃÁö ÇÁ·Î½ÃÀú´Â DGClipProcÀ̸ç ÀÌ ÇÔ¼ö¿¡¼ »ó¿ë±¸ âÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ °ÍÀÌ´Ù. OnCreate¿¡¼ »ó¿ë±¸ À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù.
int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
hClipWnd=CreateWindowEx(WS_EX_CLIENTEDGE,"DGClipFrame",NULL,WS_CHILD | WS_VISIBLE,
0,0,0,0,hWnd,NULL,g_hInst,NULL);
ÆÄÀÏâ¿¡¼ ÃʱâÈÇÏ´Â hFileImg À̹ÌÁö ¸®½ºÆ®¸¦ ºô·Á¼ ¾²°í Àֱ⠶§¹®¿¡ ÆÄÀÏ⺸´Ù ´õ ´Ê°Ô ¸¸µé¾î¾ß ÇÑ´Ù. º¸±â/»ó¿ë±¸¿¡¼ »ó¿ë±¸ âÀ» Åä±ÛÇÏ°í ¸Þ´º¿¡ »ó¿ë±¸ âÀÇ ÇöÀç »óŸ¦ Ãâ·ÂÇÑ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case IDM_VIEW_CLIP:
Option.bShowClipWnd = !Option.bShowClipWnd;
Relayout();
break;
void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (Option.bShowClipWnd) {
CheckMenuItem(hMenu, IDM_VIEW_CLIP, MF_BYCOMMAND | MF_CHECKED);
} else {
CheckMenuItem(hMenu, IDM_VIEW_CLIP, MF_BYCOMMAND | MF_UNCHECKED);
}
}
»ó¿ë±¸ âÀº ÆÄÀÏ⠾Ʒ¡¿¡ ¹èÄ¡ÇÒ °ÍÀÌ´Ù. Â÷ÀϵåÀÇ Å©±â¸¦ ±¸ÇÏ´Â GetChildSize ÇÔ¼ö¿¡ »ó¿ë±¸ âÀÇ ³ôÀ̸¦ °°ÀÌ ±¸ÇÑ´Ù. »õ·Î¿î Àμö°¡ Ãß°¡µÈ´Ù.
void GetChildSize(int &t,int &s,int &f,int &o,int &w,int &ch)
{
....
ch=0;
....
if (Option.bShowFileWnd || Option.bShowClipWnd) {
w=Option.FileWndWidth;
}
GetClientRect(g_hFrameWnd,&crt);
c=crt.bottom-(t+s+f+o+(o ? GAP:0));
if (c < 0 && o) {
o=crt.bottom-(t+s+f+GAP);
}
if (Option.bShowClipWnd) {
if (Option.bShowFileWnd) {
ch=c*Option.ClipWndRatio/10000;
} else {
ch=c;
}
}
}
ÆÄÀÏâÀÇ Æø w´Â ÆÄÀÏâÀ̳ª »ó¿ë±¸ â µÑ Áß Çϳª¸¸ º¸À̸é FileWndWidth°¡ µÈ´Ù. »ó¿ë±¸ âÀÇ ³ôÀÌ´Â ÀÛ¾÷¿µ¿ª ³ôÀÌ¿¡¼ ClipWndRatio ºñÀ²¸¸ÅÀÌµÇ ´Ü, ÆÄÀÏâÀÌ º¸ÀÌÁö ¾ÊÀ¸¸é ÆÄÀÏâÀÇ Àüü ³ôÀ̸¦ È¥ÀÚ¼ ´Ù »ç¿ëÇÑ´Ù. ÀÚ½ÄâÀ» ¹èÄ¡ÇÏ´Â RelayOut ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.
void Relayout()
{
RECT crt;
int t,s,f,o,w,ch;
int fh;
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w,ch);
....
if (Option.bShowFileWnd) {
fh=crt.bottom-(t+s+f+o+(o ? GAP:0)+ch+(ch ? GAP:0));
MoveWindow(hFileWnd,0,t+f,w,fh,TRUE);
ShowWindow(hFileWnd,SW_SHOW);
} else {
fh=0;
ShowWindow(hFileWnd,SW_HIDE);
}
if (Option.bShowClipWnd) {
MoveWindow(hClipWnd,0,t+f+fh+GAP,w,ch,TRUE);
ShowWindow(hClipWnd,SW_SHOW);
} else {
ShowWindow(hClipWnd,SW_HIDE);
}
MoveWindow(g_hMDIClient,w+(w ? GAP:0),t+f,crt.right-w-(w ? GAP:0),
crt.bottom-(t+s+f+o+(o ? GAP:0)),TRUE);
....
Ŭ¸³Ã¢ÀÇ ³ôÀ̸¸Å ÆÄÀÏâÀÇ ³ôÀ̰¡ Á¦¿ÜµÈ´Ù. µÑ »çÀÌ¿¡´Â ¹°·Ð GAP¸¸Å °£°ÝÀÌ ÀÖ¾î¾ß ÇÑ´Ù. OnSizeµµ ¼öÁ¤ÇÑ´Ù.
BOOL OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (bShowOutput==FALSE && Option.bShowToolBar==FALSE
&& Option.bShowStatus==FALSE && Option.bShowFileWnd==FALSE
&& Option.bShowFileTab==FALSE && Option.bShowClipWnd==FALSE) {
return FALSE;
} else {
Relayout();
return TRUE;
}
}
RelayoutÀ» ºÒ·¯¾ß ÇÒ Á¶°ÇÀÌ Çϳª ´õ Ãß°¡µÇ¾ú´Ù. â °æ°è¸¦ µå·¡±×ÇØ¼ ÆÄÀÏâ°úÀÇ ³ôÀ̸¦ Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. OnSetCursor¿¡¼ °æ°è¼±¿¡ °É·ÈÀ» ¶§ Ä¿¼¸¦ º¯°æÇÑ´Ù.
BOOL OnSetCursor(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
POINT pt;
RECT crt;
int t,s,f,o,w,ch;
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w,ch);
GetCursorPos(&pt);
ScreenToClient(hWnd,&pt);
if (LOWORD(lParam)==HTCLIENT) {
if ((Option.bShowFileWnd || Option.bShowClipWnd) &&
pt.x >= w && pt.x <= w+GAP &&
pt.y > t+f && pt.y < crt.bottom-(o+s)) {
SetCursor(hCurHorz);
return TRUE;
}
if (bShowOutput &&
pt.y >= crt.bottom-(o+s+GAP)
&& pt.y <= crt.bottom-(o+s)) {
SetCursor(hCurVert);
return TRUE;
}
if (Option.bShowFileWnd && Option.bShowClipWnd && pt.x < w &&
pt.y >= crt.bottom-(s+o+(o ? GAP:0)+ch+GAP) &&
pt.y <= crt.bottom-(s+o+(o ? GAP:0)+ch)) {
SetCursor(hCurVert);
return TRUE;
}
}
return FALSE;
}
ÆÄÀÏâ°ú »ó¿ë±¸ÀÇ ¼öÆòÆøÀº µÑ Áß Çϳª¶óµµ º¸ÀÌ´Â »óÅÂÀ̸é Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é ¼öÁ÷ÆøÀº ÆÄÀÏâ°ú »ó¿ë±¸ âÀÌ ¸ðµÎ º¸ÀÌ´Â »óÅ¿¡¼¸¸ °æ°è¸¦ Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. ¸¶¿ì½º ¸Þ½ÃÁö ó¸® ·çƾ¿¡¼ âÀÇ °æ°è¸¦ µå·¡±×ÇÒ ¶§ ºñÀ²À» Á¶Á¤ÇÑ´Ù.
void OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
POINT pt;
RECT crt;
int t,s,f,o,w,ch;
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w,ch);
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
iDrag=0;
if ((Option.bShowFileWnd || Option.bShowClipWnd) &&
pt.x >= w && pt.x <= w+GAP &&
pt.y > t+f && pt.y < crt.bottom-(o+s)) {
iDrag=1;
DragOriginal=Option.FileWndWidth;
}
....
if (Option.bShowFileWnd && Option.bShowClipWnd && pt.x < w &&
pt.y >= crt.bottom-(s+o+(o ? GAP:0)+ch+GAP) &&
pt.y <= crt.bottom-(s+o+(o ? GAP:0)+ch)) {
iDrag=3;
DragOriginal=Option.ClipWndRatio;
}
if (iDrag) {
SetCapture(hWnd);
}
}
void OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT crt;
int Value;
int t,s,f,o,w,ch;
int fs,fh,y;
if (iDrag==0) {
return;
}
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w,ch);
....
if (iDrag==3) {
fs=t+f;
fh=crt.bottom-(t+s+f+o+(o ? GAP:0));
y=(int)(short)HIWORD(lParam);
Value=(fh-(y-fs))*10000/fh;
Option.ClipWndRatio=min(max(500,Value),9500);
Relayout();
}
}
void OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (iDrag==1) {
if (Option.FileWndWidth == 5) {
Option.FileWndWidth=DragOriginal;
SendMessage(g_hFrameWnd,WM_COMMAND,MAKEWPARAM(IDM_VIEW_FILE,0),0);
Option.bShowFileWnd=FALSE;
Option.bShowClipWnd=FALSE;
Relayout();
}
}
....
if (iDrag==3) {
if (Option.ClipWndRatio == 500) {
Option.ClipWndRatio=DragOriginal;
SendMessage(g_hFrameWnd,WM_COMMAND,MAKEWPARAM(IDM_VIEW_CLIP,0),0);
}
if (Option.ClipWndRatio == 9500) {
Option.ClipWndRatio=DragOriginal;
SendMessage(g_hFrameWnd,WM_COMMAND,MAKEWPARAM(IDM_VIEW_FILE,0),0);
}
}
iDrag=0;
ReleaseCapture();
}
°æ°è¼±¿¡¼ ¸¶¿ì½º ¹öưÀ» ´©¸£¸é Å©±â Á¶Á¤À» ½ÃÀÛÇÑ´Ù. iDrag´Â 1,2¹øÀ» ÀÌ¹Ì »ç¿ëÇϰí ÀÖÀ¸¹Ç·Î 3À¸·Î Á¤ÀÇÇÑ´Ù. iDrag°¡ 3±îÁö ÀÖÀ¸¹Ç·Î ´ç±ÙÀÇ Â÷ÀϵåµéÀº ¸ðµÎ ¼¼ ±ºµ¥¸¦ µå·¡±×ÇØ¼ Å©±â Á¶Á¤À» ÇÒ ¼ö ÀÖ´Â ¼ÀÀÌ´Ù. ¸¶¿ì½º°¡ ¿òÁ÷ÀÏ ¶§ µÎ âÀÇ ºñÀ²À» °è»êÇϴµ¥ ½ÄÀÌ ´Ù¼Ò º¹ÀâÇÏ´Ù. ±×·¡¼ ½ÄÀ» Á¶±ÝÀ̳ª¸¶ °£´ÜÇÏ°Ô Ç¥ÇöÇϱâ À§ÇØ ¸¶¿ì½º Ä¿¼ÀÇ ¼öÁ÷ À§Ä¡¸¦ º°µµÀÇ Áö¿ª º¯¼ö y¿¡ ´ëÀÔÇß´Ù.
fs´Â ÆÄÀÏâÀÇ »ó´Ü ÁÂÇ¥À̰í fh´Â ÆÄÀÏâÀÇ ³ôÀÌÀÌ´Ù. ÀÌ µÎ °ª°ú ÇöÀç ¸¶¿ì½º À§Ä¡ y·ÎºÎÅÍ »õ ºñÀ²À» °è»êÇØ ³½´Ù. y-fs´Â ÇöÀç Ä¿¼°¡ ÀÖ´Â À§Ä¡¿¡¼ ÆÄÀÏ Ã¢ÀÇ ³ôÀÌÀ̸ç fh¿¡¼ ÀÌ °ªÀ» »©¸é »ó¿ë±¸ âÀÇ ³ôÀ̰¡ µÈ´Ù. ¿©±â¿¡ 10000À» °öÇÏ°í ´Ù½Ã fh·Î ³ª´©¸é ÆÄÀÏâ ÀüüÀÇ ³ôÀÌ fh¿¡ ´ëÇÑ »ó¿ë±¸ â ³ôÀÌÀÇ ¸¸ºÐÀ²ÀÌ ±¸ÇØÁø´Ù. ÀÌ ºñÀ²°ªÀº ÃÖ¼Ò 500~ÃÖ´ë 9500 ¹üÀ§¿¡ ÀÖµµ·Ï Á¶Á¤ÇÏ¿© ClipWndRatio¿¡ ´ëÀԵȴÙ. Relayout ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ºñÀ²·ÎºÎÅÍ »ó¿ë±¸ âÀÇ ½ÇÁ¦ ³ôÀ̰¡ º¯°æµÉ °ÍÀÌ´Ù.
¸¶¿ì½º ¹öưÀ» ³õ¾ÒÀ» ¶§ »ó¿ë±¸ âÀÌ ³Ê¹« Å©°Å³ª ³Ê¹« ÀÛÀ¸¸é µÑ Áß Çϳª¸¦ ¼û±ä´Ù. »ó¿ë±¸ âÀ» À§ÂÊÀ¸·Î µå·¡±×ÇÏ¸é ÆÄÀÏâÀ» ¼û±â°í ¾Æ·¡ÂÊÀ¸·Î µå·¡±×ÇÏ¸é »ó¿ë±¸ âÀ» ¼û±âµÇ À̶§ ¿ø·¡ ºñÀ²Àº ÀúÀåÇØ µÎ¾î¾ß ¼û±ä À©µµ¿ì°¡ ´Ù½Ã º¸ÀÏ ¶§¸¦ ¼û±â ÀüÀÇ ÆøÀ¸·Î º¹±¸µÈ´Ù. ÆÄÀÏâ°ú ÆíÁýâÀÇ °æ°è¸¦ µå·¡±×(iDrag°¡ 1)ÇÏ¿© 5Çȼ¿ ¹Ì¸¸ÀÌ µÉ ¶§ »ó¿ë±¸ âµµ °°ÀÌ ¼û°Ü¾ß ÇÑ´Ù. ÀÌÀü ÄÚµå´Â ÆÄÀÏ⸸ ¼û±â¸é µÇ¹Ç·Î IDM_FILE_VIEW ¸Þ´º¸¦ ¼±ÅÃÇØ¼ ¼û°å´Âµ¥ iDrag°¡ 1À̶ó´Â Á¶°Ç ÀÚü°¡ ÀÌ¹Ì ÆÄÀÏâÀÌ º¸Àδٴ ¶æÀ̹ǷΠÀÌ ¸Þ´º¸¦ ´Ù½Ã ¼±ÅÃÇÏ¸é ¼û±æ ¼ö ÀÖ¾ú´Ù. ÀÌÁ¦ ÀÌ °æ°è¼±ÀÌ ÆÄÀÏÀÇ Æø»Ó¸¸ ¾Æ´Ï¶ó »ó¿ë±¸ÀÇ Æø±îÁö ÁöÁ¤ÇϹǷΠ¿É¼Ç º¯¼ö¸¦ Á÷Á¢ Á¶ÀÛÇØ¼ µÑ ´Ù °Á¦·Î ¼û°Ü¾ß ÇÑ´Ù.
´ÙÀ½Àº Clip.cpp¿¡ »ó¿ë±¸ âÀÇ ¸Þ½ÃÁö ÇÁ·Î½ÃÀú¸¦ ÀÛ¼ºÇÑ´Ù. »ó¿ë±¸¸¦ º¸¿©ÁÖ°í °ü¸®ÇÏ´Â µ¿ÀÛÀÌ ÀÌ Ã¢¿¡¼ ÀÌ·ç¾îÁø´Ù.
LRESULT CALLBACK DGClipProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
RECT crt;
TVITEM TV;
CClipRecord *cr;
HTREEITEM Node,tNode,tNode2;
HWND hActive;
SInfo *pSi;
HMENU hMenu, hPopup;
TVHITTESTINFO ht;
TCHAR Path[MAX_PATH];
switch(iMessage) {
case WM_CREATE:
hClipTree=CreateWindow(WC_TREEVIEW, "", WS_CHILD | WS_VISIBLE |
TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
TVS_SHOWSELALWAYS | TVS_INFOTIP,
0,0,0,0,hWnd,(HMENU)1,g_hInst,NULL);
SendMessage(hClipTree, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)hFileImg);
return 0;
case WM_SIZE:
GetClientRect(hWnd,&crt);
MoveWindow(hClipTree,0,0,crt.right,crt.bottom,TRUE);
return 0;
case WM_CONTEXTMENU:
POINT pt;
hMenu=LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));
hPopup=GetSubMenu(hMenu, 4);
ht.pt.x=LOWORD(lParam);
ht.pt.y=HIWORD(lParam);
ScreenToClient(hWnd,&ht.pt);
TreeView_HitTest(hClipTree,&ht);
TreeView_SelectItem(hClipTree,ht.hItem);
if (ht.hItem) {
TV.mask=TVIF_IMAGE | TVIF_PARAM;
TV.hItem=ht.hItem;
TreeView_GetItem(hClipTree,&TV);
if (TV.iImage != DGI_CLIP) {
EnableMenuItem(hMenu, IDM_CLIP_INSERT, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLIP_COPY, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLIP_NEWFILE, MF_BYCOMMAND | MF_GRAYED);
}
} else {
EnableMenuItem(hMenu, IDM_CLIP_INSERT, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLIP_COPY, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLIP_NEWFILE, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLIP_CLOSE, MF_BYCOMMAND | MF_GRAYED);
}
if (LOWORD(lParam)==65535) {
pt.x=20;
pt.y=20;
ClientToScreen(hWnd,&pt);
lParam=MAKELPARAM(pt.x,pt.y);
}
TrackPopupMenu(hPopup, TPM_LEFTALIGN, (short)LOWORD(lParam), (short)HIWORD(lParam),
0, hWnd, NULL);
DestroyMenu(hMenu);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_CLIP_CLOSEWND:
Option.bShowClipWnd=FALSE;
Relayout();
break;
case IDM_CLIP_INSERT:
case IDM_CLIP_NEWFILE:
Node=TreeView_GetSelection(hClipTree);
TV.mask=TVIF_IMAGE | TVIF_PARAM;
TV.hItem=Node;
TreeView_GetItem(hClipTree,&TV);
if (TV.iImage==DGI_CLIP) {
cr=(CClipRecord *)TV.lParam;
if (LOWORD(wParam)==IDM_CLIP_INSERT) {
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,(LPARAM)NULL);
} else {
hActive=NewChild();
}
if (hActive!=NULL) {
pSi=(SInfo *)GetWindowLong(hActive,0);
pSi->Ae.GetActiveView()->InsertClipText(cr->Content);
if (LOWORD(wParam)==IDM_CLIP_NEWFILE) {
pSi->Ae.SetParser(cr->nParser);
}
// »ðÀÔ ÈÄ È°¼ºÃ¢À¸·Î Æ÷Ä¿½º¸¦ °Á¦·Î ³Ñ±ä´Ù.
SetFocus(hActive);
}
}
break;
case IDM_CLIP_COPY:
HGLOBAL hmem;
TCHAR *ptr;
TCHAR *s,*d;
int len;
Node=TreeView_GetSelection(hClipTree);
TV.mask=TVIF_IMAGE | TVIF_PARAM;
TV.hItem=Node;
TreeView_GetItem(hClipTree,&TV);
if (TV.iImage==DGI_CLIP) {
cr=(CClipRecord *)TV.lParam;
hmem=GlobalAlloc(GHND, lstrlen(cr->Content)+1);
ptr=(TCHAR *)GlobalLock(hmem);
// Ç¥½ÄÀº »©°í º¹»çÇØ¾ß ÇÑ´Ù.
len=lstrlen(cr->Content);
for (s=cr->Content,d=ptr;*s;) {
if (s-cr->Content <= len-3 && s[0]=='^' && s[1]=='|' && s[2]=='^') {
s+=3;
} else {
*d++=*s++;
}
}
*d=0;
GlobalUnlock(hmem);
if (OpenClipboard(g_hFrameWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
}
break;
case IDM_CLIP_EDIT:
Node=TreeView_GetSelection(hClipTree);
if (Node == NULL) {
DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_CLIPFILE),
g_hFrameWnd, ClipDlgProc,(LPARAM)NULL);
} else {
for (tNode=Node;tNode2=TreeView_GetParent(hClipTree,tNode);tNode=tNode2);
TV.mask=TVIF_PARAM;
TV.hItem=tNode;
TreeView_GetItem(hClipTree,&TV);
lstrcpy(Path,(TCHAR *)TV.lParam);
DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_CLIPFILE),
g_hFrameWnd, ClipDlgProc,(LPARAM)Path);
}
break;
case IDM_CLIP_CLOSE:
Node=TreeView_GetSelection(hClipTree);
for (tNode=Node;tNode2=TreeView_GetParent(hClipTree,tNode);tNode=tNode2);
TreeView_DeleteItem(hClipTree,tNode);
break;
}
return 0;
case WM_NOTIFY:
LPNMHDR hdr;
LPNMTREEVIEW ntv;
LPNMTVDISPINFO ndi;
LPNMTVGETINFOTIP nit;
hdr=(LPNMHDR)lParam;
ntv=(LPNMTREEVIEW)lParam;
ndi=(LPNMTVDISPINFO)lParam;
nit=(LPNMTVGETINFOTIP)lParam;
if (hdr->hwndFrom == hClipTree) {
switch (hdr->code) {
case NM_DBLCLK:
Node=TreeView_GetSelection(hClipTree);
TV.mask=TVIF_PARAM;
TV.hItem=Node;
TreeView_GetItem(hClipTree,&TV);
cr=(CClipRecord *)TV.lParam;
switch (cr->DefAction) {
case 0:
// SendMessage·Î º¸³»¸é Æ÷Ä¿½º°¡ Ȱ¼ºÃ¢À¸·Î °¡Áö ¾ÊÀ½
PostMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_CLIP_INSERT,0),0);
break;
case 1:
PostMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_CLIP_COPY,0),0);
break;
case 2:
PostMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_CLIP_NEWFILE,0),0);
break;
}
break;
case TVN_DELETEITEM:
TV.mask=TVIF_IMAGE;
TV.hItem=ntv->itemOld.hItem;
TreeView_GetItem(hClipTree,&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;
}
}
break;
case TVN_GETINFOTIP:
if (Option.bPreviewClip) {
TV.mask=TVIF_PARAM | TVIF_IMAGE;
TV.hItem=nit->hItem;
TreeView_GetItem(hClipTree,&TV);
if (TV.iImage == DGI_CLIP) {
cr=(CClipRecord *)TV.lParam;
if (cr->Content) {
lstrcpyn(nit->pszText,cr->Content,min(256,nit->cchTextMax));
}
}
}
break;
}
}
return 0;
case WM_DESTROY:
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
WM_CREATE¿¡¼ »ó¿ë±¸¸¦ º¸¿©ÁÙ Æ®¸® ÄÁÆ®·ÑÀ» »ý¼ºÇϰí WM_SIZE¿¡¼ ÀÛ¾÷¿µ¿ª¿¡ °¡µæ ä¿î´Ù. Æ®¸®°¡ â Àüü¸¦ ä¿ì°í ÀÖÀ¸¹Ç·Î ¸í·ÉÀ» ³»¸± ¼ö ÀÖ´Â º°µµÀÇ ÀÎÅÍÆäÀ̽º´Â ¾ø´Â ¼ÀÀε¥ ¸í·ÉÀ» ³»¸± ¶§´Â ÆË¾÷ ¸Þ´º¸¦ »ç¿ëÇÑ´Ù. ȸéÀÌ Á¼¾Æ º°µµÀÇ ¸í·É ¹öưÀ» ¹èÄ¡ÇÒ °ø°£ÀÌ ¾ø¾î ÇÊ¿äÇÒ ¶§ ÆË¾÷ ¸Þ´º¸¦ È£ÃâÇÏ´Â °ÍÀÌ ÁÁ´Ù. IDR_POPUP ¸Þ´º¿¡ ´Ù¸¥ ÆË¾÷ ¸Þ´º¿Í ÇÔ²² ÀÛ¼ºÇØ µÎ¾ú´Ù.

»ó¿ë±¸ »ðÀÔ Ç׸ñÀ» ¼±ÅÃÇϰųª ´õºíŬ¸¯Çϸé Ȱ¼ºÃ¢¿¡ »ó¿ë±¸ ³»¿ëÀ» »ðÀÔÇÑ´Ù. ÀÌ µ¿ÀÛÀ» À§ÇØ ±âº»ºäÀÎ ApiEditText¿¡ InsertClipText¶ó´Â ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
class CApiEditText : public CWindow
....
virtual void InsertClipText(TCHAR *Text);
}
Àμö·Î Àü´ÞµÈ ¹®ÀÚ¿À» ÆíÁýâÀÇ Ä³·µ À§Ä¡¿¡ »ðÀÔÇÑ´Ù. Çí»ç ºä °´Ã¼µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã °¡»ó ÇÔ¼ö¿©¾ß ÇÑ´Ù.
// »ó¿ë±¸ »ðÀÔ. »ðÀÔ ÈÄ Ä³·µ À̵¿, ¼±ÅñîÁö ÇØ¾ß ÇÑ´Ù.
void CApiEditText::InsertClipText(TCHAR *Text)
{
TCHAR *pTemp;
TCHAR *s,*d;
int ts=-1,te=-1;
int len;
pFrame->StartUndoGroup(22);
DeleteSelection();
len=lstrlen(Text);
pTemp=(TCHAR *)malloc(len+1);
for (s=Text,d=pTemp;*s;) {
// µÚÂÊ¿¡ ÃÖ¼ÒÇÑ 3¹ÙÀÌÆ® ³²¾ÒÀ» ¶§ Á¡°Ë
if (s-Text <= len-3 && s[0]=='^' && s[1]=='|' && s[2]=='^') {
// óÀ½ ¹ß°ßµÇ¾úÀ» ¶§ ¿ÀÇÁ¼Â ±â·Ï
if (ts==-1) {
ts=off+(s-Text);
// µÎ¹øÂ° ¹ß°ßµÇ¾úÀ» ¶§ ³¡ ¿ÀÇÁ¼Â ±â·Ï. ¼¼¹øÂ° ÀÌÈÄ´Â ¹«½Ã
} else if (te==-1) {
te=off+(s-Text)-3;
}
// °Ç³Ê ¶Ü
s+=3;
} else {
*d++=*s++;
}
}
*d=0;
InsertText(pTemp);
if (te != -1) {
SetSelect(ts,te,FALSE);
} else if (ts != -1) {
SetOffset(ts);
} else {
SetCaret();
}
free(pTemp);
pFrame->EndUndoGroup();
}
»ó¿ë±¸¸¦ ´Ü¼øÈ÷ ÇöÀç À§Ä¡¿¡ »ðÀÔÇϱ⸸ ÇÑ´Ù¸é ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â InsertText¶ó´Â ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÇ°ÚÁö¸¸ »ó¿ë±¸ »ðÀÔÀº ±×º¸´Ù Á¶±Ý ´õ º¹ÀâÇÏ´Ù. »ó¿ë±¸³»¿¡ Ç¥½ÄÀÌ ¹ß°ßµÇ¸é ij·µÀ» Ç¥½Ä À§Ä¡·Î ¿Å±â°Å³ª ¼±ÅÃÇÑ´Ù. »ó¿ë±¸¿¡´Â ^|^ ÀÌ·¸°Ô ƯÀÌÇÏ°Ô »ý±ä Ç¥½ÄÀÌ Æ÷Ç﵃ ¼ö Àִµ¥ ÀÌ Ç¥½ÄÀÌ Çϳª ÀÖÀ¸¸é ij·µÀ» ¿Å±â°í µÑ ÀÖÀ¸¸é µÎ Ç¥½Ä »çÀ̸¦ ¼±ÅÃÇÑ´Ù. »ó¿ë±¸ »ðÀÔ ÈÄ »ç¿ëÀÚ°¡ Á÷Á¢ ÀÔ·ÂÇØ¾ß ÇÒ À§Ä¡·Î ij·µÀ» ¿Å±â´Â ±â´ÉÀε¥ Àλ縻À̳ª switch ¹® µîÀÇ »ùÇà »ó¿ë±¸¸¦ »ðÀÔÇØ º¸¸é ¹«½¼ ±â´ÉÀÎÁö ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¶ÇÇÑ ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é ¸ÕÀú »èÁ¦ÇÑ´Ù. InsertText ÇÔ¼ö¿¡¼µµ DeleteSelectionÀ» È£ÃâÇÏÁö¸¸ ¸ÕÀú »èÁ¦¸¦ ÇØ¾ß Ç¥½ÄÀÇ Á¤È®ÇÑ ¿ÀÇÁ¼ÂÀ» °è»êÇÒ ¼ö ÀÖ´Ù. ¼±Åÿµ¿ªÀÌ ´ëüµÉ ¼öµµ ÀÖÀ¸¹Ç·Î ±×·ìÀ» ±¸¼ºÇØ¾ß ÇÑ´Ù. ÀÌ·± ¿©·¯ °¡Áö ÀÌÀ¯·Î º°µµÀÇ »ó¿ë±¸ »ðÀÔ ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù. ÀÌ ±â´É ¶§¹®¿¡ ApiEdit°¡ »ó¿ë±¸ÀÇ Æ÷¸Ë¿¡ ´ëÇØ Á¶±ÝÀº ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à ÀÌ·± ±â´ÉÀÌ ¾ø´Ù¸é ¿ÜºÎ¿¡¼ »ó¿ë±¸¸¦ °ð¹Ù·Î »ðÀÔÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ·¸°Ô µÇ¸é »ó¿ë±¸ ±â´ÉÀº ¿ÂÀüÈ÷ È£½ºÆ®¸¸ÀÇ ±â´ÉÀÌ µÉ ¼öµµ ÀÖ´Ù.
»ó¿ë±¸ â¿¡ ¹À½ ÆÄÀÏÀ» ¿©´Â ¹æ¹ýÀº ÀÏ¹Ý ÆÄÀϰú µ¿ÀÏÇÏ´Ù. »ó¿ë±¸¸¸ ¿©´Â ¸í·ÉÀÌ º°µµ·Î ¾ø°í ÆÄÀÏ/¿ÀÇ ¸í·ÉÀ¸·Î »ó¿ë±¸ ÆÄÀÏÀ» ¿©´Âµ¥ ´Ù¸¸ È®ÀåÀÚ°¡ dgcÀÌ¸é »ó¿ë±¸ ¹À½ ÆÄÀÏ·Î ÇØ¼®ÇÑ´Ù. Open ÇÔ¼öÀÇ ÇÊÅÍ¿¡ »ó¿ë±¸ ÆÄÀÏÀ» Ãß°¡ÇÑ´Ù.
void Open()
{
....
OFN.lpstrFilter="¸ðµç ÆÄÀÏ(*.*)\0*.*\0ÅØ½ºÆ® ÆÄÀÏ\0*.txt\0´ç±Ù ÇÁ·ÎÁ§Æ®(*.dgp)"
"\0*.dgp*\0´ç±Ù »ó¿ë±¸ ÆÄÀÏ(*.dgc)\0*.dgc";
OpenFromFile ÇÔ¼ö¿¡¼ È®ÀåÀÚ¸¦ º¸°í dgcÀÌ¸é ¹®¼ ÆÄÀÏÀÌ ¾Æ´Ñ »ó¿ë±¸¸¦ ¿¬´Ù. ¸¸¾à »ó¿ë±¸ âÀÌ º¸ÀÌÁö ¾ÊÀ¸¸é ÀÌ Ã¢À» ¸ÕÀú Ç¥½ÃÇÏ°í »ó¿ë±¸¸¦ ¿¾î¾ß ÇÑ´Ù.
BOOL OpenFromFile(TCHAR *Path, BOOL bReadOnly/*=FALSE*/, BOOL bBrowse/*=FALSE*/)
{
....
if (stricmp(ext,".dgc")==0) {
if (Option.bShowClipWnd==FALSE) {
Option.bShowClipWnd=TRUE;
Relayout();
}
LoadClipFile(Path,FALSE);
return TRUE;
}
»ó¿ë±¸ ÆÄÀÏÀ» ¿©´Â ÇÔ¼ö´Â Clipp.cpp¿¡ LoadClipFile ÇÔ¼öÀÌ´Ù.
BOOL LoadClipFile(TCHAR *Path,BOOL bUpdate)
{
CClipFile *cf;
HTREEITEM hChild, hPrev;
TVITEM TV;
BOOL Result;
// ÀÌ¹Ì ¿·Á ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.
hPrev=TVI_LAST;
hChild=TreeView_GetRoot(hClipTree);
while (hChild) {
TV.mask=TVIF_PARAM;
TV.hItem=hChild;
TreeView_GetItem(hClipTree,&TV);
if (lstrcmpi((TCHAR *)TV.lParam,Path) == 0) {
hPrev=TreeView_GetPrevSibling(hClipTree,hChild);
if (hPrev==NULL) {
hPrev=TVI_FIRST;
}
TreeView_DeleteItem(hClipTree,hChild);
break;
}
hChild=TreeView_GetNextSibling(hClipTree,hChild);
}
// ¿·Á ÀÖÁö ¾Ê°í ¾÷µ¥ÀÌÆ®¸¸ ÇÏ¸é ¾Æ¹« °Íµµ ÇÏÁö ¾ÊÀ½
// Áï ¾÷µ¥ÀÌÆ®´Â ¿·Á ÀÖ´Â ÆÄÀϸ¸ ´ë»óÀ¸·Î ÇÑ´Ù.
if (hChild == NULL && bUpdate==TRUE) {
return TRUE;
}
cf=new CClipFile;
if (cf->Load(Path)==0) {
AddClipFileToTree(hClipTree,hPrev,Path,cf);
Result=TRUE;
} else {
Result=FALSE;
}
delete cf;
return Result;
}
bUpdate Àμö´Â ÀÌ¹Ì »ó¿ë±¸ ÆÄÀÏÀÌ ¿·Á ÀÖÀ» ¶§ÀÇ Ã³¸®¸¦ ÁöÁ¤Çϴµ¥ ÀÌ °ªÀÌ TRUEÀÌ¸é ¿·ÁÁ® ÀÖ´Â »ó¿ë±¸¸¦ ¾÷µ¥ÀÌÆ®ÇÏ°í ¿·Á ÀÖÁö ¾ÊÀ¸¸é ±×³É ¸®ÅÏÇØ ¹ö¸°´Ù. »ó¿ë±¸ °ü¸® ´ëÈ»óÀÚ¿¡¼ ÆíÁýÇÑ ÈÄ ÀúÀåÇÒ ¶§´Â ÀÌ Àμö°¡ TRUE¿©¾ß ÇÑ´Ù.
BOOL SaveClipFileFromDlg(HWND hDlg)
{
....
// »ó¿ë±¸ ÆÄÀÏÀ» ÀúÀåÇÑ ÈÄ »ó¿ë±¸ âÀ» ¾÷µ¥ÀÌÆ®ÇÑ´Ù.
if (cf->Save(Path)==FALSE) {
Result=FALSE;
} else {
LoadClipFile(Path,TRUE);
}
delete cf;
return Result;
}
¹èÆ÷ ÆÄÀÏ¿¡ Æ÷ÇÔµÈ Sample.dgc¸¦ ¿¾î º¸¸é »ó¿ë±¸ â¿¡ »ùÇà »ó¿ë±¸µéÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. LoadClipFile ÇÔ¼ö´Â »õ »ó¿ë±¸ ¹À½À» À§ÇØ Æ®¸®ÀÇ ³ëµå¸¦ Ç×»ó »õ·Î »ý¼ºÇϹǷΠµ¿½Ã¿¡ µÎ °³ ÀÌ»óÀÇ »ó¿ë±¸¸¦ ¿¾î ³õÀ» ¼öµµ ÀÖ´Ù. ¿¾î ³õÀº »ó¿ë±¸ ¸ñ·ÏÀº ´ÙÀ½ »ç¿ëÀ» À§ÇØ ·¹Áö½ºÆ®¸®¿¡ ÀúÀåÇÑ´Ù.
void OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
// ¿¾î ³õÀº »ó¿ë±¸ ¸ñ·Ï ÀúÀå
nEditing=0;
hNode=TreeView_GetRoot(hClipTree);
while (hNode) {
TV.mask=TVIF_PARAM | TVIF_IMAGE;
TV.hItem=hNode;
TreeView_GetItem(hClipTree,&TV);
if (TV.iImage == DGI_CLIPROOT) {
wsprintf(szKey,"Clip%d",++nEditing);
SHRegWriteString(SHCU,KEY"Clip",szKey,(TCHAR *)TV.lParam);
}
hNode=TreeView_GetNextSibling(hClipTree,hNode);
}
SHRegWriteInt(SHCU,KEY"Clip","Num",nEditing);
bReloadClip ¿É¼ÇÀÌ È°¼ºÈµÇ¾î ÀÖÀ¸¸é ÀúÀåµÈ ¸ñ·ÏÀ» OnTimer¿¡¼ ´Ù½Ã Àоî¿Â´Ù. ÀÚÁÖ »ç¿ëÇÏ´Â »ó¿ë±¸ ¹À½Àº Çѹø ¿¾î ³õ±â¸¸ ÇÏ¸é »ó¿ë±¸ â¿¡¼ °è¼Ó »ç¿ëÇÒ ¼ö ÀÖ´Ù.
void OnTimer(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
switch (wParam) {
case 100:
....
// ÀúÀåµÈ »ó¿ë±¸ ¸ñ·ÏÀ» ´Ù½Ã Àд´Ù.
if (Option.bReloadClip) {
nEditing=SHRegReadInt(SHCU,KEY"Clip","Num",0);
for (i=1;i<=nEditing;i++) {
wsprintf(szKey,"Clip%d",i);
SHRegReadString(SHCU,KEY"Clip",szKey,"",Path,MAX_PATH);
LoadClipFile(Path,FALSE);
}
}
if (__argc > 1) {
....
»ó¿ë±¸ âÀÇ ÆË¾÷ ¸Þ´º¿¡´Â »ðÀÔ ¿Ü¿¡µµ ¸î°¡Áö ±â´ÉÀÌ ´õ µé¾î ÀÖ´Ù. º¹»ç´Â »ó¿ë±¸ ³»¿ëÀ» Ŭ¸³º¸µå·Î º¹»çÇÏ¿© ¿øÇÏ´Â À§Ä¡¿¡ »ðÀÔÇϰųª ´Ù¸¥ ÇÁ·Î±×·¥¿¡ ºÙ¿© ³ÖÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù. º¹»çÇÒ ¶§´Â ¼ø¼öÇÑ ÅØ½ºÆ®°¡ ¾Æ´Ñ Ç¥½ÄÀº Á¦¿ÜÇÑ´Ù. »õ ÆÄÀÏ·Î ¸í·ÉÀº Ȱ¼ºÃ¢¿¡ »ó¿ë±¸¸¦ »ðÀÔÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »õ ¹®¼¸¦ ¸¸µé°í »ó¿ë±¸¸¦ »ðÀÔÇÑ´Ù. HTML ½ÃÀÛ ÆäÀÌÁö³ª ¾ç½Ä ¹®¼ µîÀº »õ ¹®¼·Î ¸¸µé±â ¸í·ÉÀÌ Æí¸®ÇÏ´Ù. ÀÌ»óÀÇ »ðÀÔ, º¹»ç, »õ ¹®¼·Î ¸í·ÉÀº °¢ »ó¿ë±¸¸¶´Ù ±âº» µ¿ÀÛÀ» ÁöÁ¤ÇÒ ¼ö Àִµ¥ ´õºíŬ¸¯Çϸé ÁöÁ¤µÈ µ¿ÀÛÀ» ¼öÇàÇÑ´Ù. »ó¿ë±¸ÀÇ ³»¿ë¿¡ µû¶ó ±âº»µ¿ÀÛÀ» ÀûÀýÈ÷ ÁöÁ¤ÇÏ¸é Æí¸®ÇÏ´Ù.
»ó¿ë±¸ ⠴ݱ⠸í·ÉÀº ¸» ±×´ë·Î »ó¿ë±¸ âÀ» ´ÝÀ¸¸ç »ó¿ë±¸ ´Ý±â´Â ¼±ÅÃµÈ »ó¿ë±¸ ¹À½ Çϳª¸¸ ´Ý´Â´Ù. »ó¿ë±¸ °ü¸® ¸í·ÉÀº »ó¿ë±¸ °ü¸® ´ëÈ»óÀÚ¸¦ È£ÃâÇϴµ¥ À̶§ lParamÀ¸·Î ´ë»ó »ó¿ë±¸ ÆÄÀÏÀ» Àü´ÞÇϹǷΠ°ð¹Ù·Î ÆíÁýÇÒ ¼ö ÀÖ´Ù. ´ëÈ»óÀÚ¿¡¼ »ó¿ë±¸¸¦ ÆíÁýÇÑ ÈÄ ÀúÀåÇÏ¸é »ó¿ë±¸ âÀÇ ³»¿ëµµ Áï½Ã °»½Å´Ù. »ó¿ë±¸ ¹Ì¸® º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é Ä¿¼°¡ ÀÖ´Â À§Ä¡ÀÇ »ó¿ë±¸ ³»¿ë ÀϺθ¦ ÅøÆÁÀ¸·Î º¸¿©ÁØ´Ù.