3.»ó¿ë±¸ â

°¡.»ó¿ë±¸ °ü·Ã ¿É¼Ç

»ó¿ë±¸¿Í »ó¿ë±¸ â °ü¸®¸¦ À§ÇØ ¿©¼¸ °³ÀÇ »õ·Î¿î ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.

 

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À¸·Î ´ë»ó »ó¿ë±¸ ÆÄÀÏÀ» Àü´ÞÇϹǷΠ°ð¹Ù·Î ÆíÁýÇÒ ¼ö ÀÖ´Ù. ´ëÈ­»óÀÚ¿¡¼­ »ó¿ë±¸¸¦ ÆíÁýÇÑ ÈÄ ÀúÀåÇÏ¸é »ó¿ë±¸ âÀÇ ³»¿ëµµ Áï½Ã °»½Å´Ù. »ó¿ë±¸ ¹Ì¸® º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é Ä¿¼­°¡ ÀÖ´Â À§Ä¡ÀÇ »ó¿ë±¸ ³»¿ë ÀϺθ¦ ÅøÆÁÀ¸·Î º¸¿©ÁØ´Ù.