³ª. Á٠ã¾Æ°¡±â

ÀÌ ±â´ÉÀº »ç¿ëÀÚ°¡ À̵¿ÇÒ ÁÙ¹øÈ£¸¦ Á¤È®ÇÏ°Ô ¾Ë°í ÀÖÀ» ¶§ Á÷Á¢ ã¾Æ°¡´Â ±â´ÉÀÌ´Ù. ÁöÁ¤ÇÑ ÁÙ·Î À§Ä¡¸¦ ¿Å±â´Â GotoLine ÇÔ¼ö´Â ÀÌ¹Ì ºÏ¸¶Å© ±â´ÉÀ» ÀÛ¼ºÇÒ ¶§ ¸¸µé¾î µÐ ÀûÀÌ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ ÇÔ¼ö°¡ ã¾Æ°¡´Â ÁÙÀº Á¤·ÄµÈ °á°úÀÎ pLine¿¡¼­ÀÇ ÁÙ, Áï È­¸é»óÀÇ ¹°¸®ÀûÀÎ ÁÙÀÌ´Ù. »ç¿ëÀÚ¿¡°Ô ÁÙÀ̶ó´Â °³³äÀº °³ÇàÄÚµå·Î ºÐ¸®µÈ ¹®´ÜÀÇ °³³äÀ̹ǷΠÀÌ ÇÔ¼ö¸¦ È®ÀåÇÏ¿© ¹®´ÜÀ» ã¾Æ°¡´Â ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¹°·Ð ÇÔ¼öÀÇ ¿øÇü¿¡ º¯È­°¡ ¾øµµ·Ï ÇÏ¿© ±âÁ¸ ÄÚµå´Â ¿µÇâÀ» ¹ÞÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. GotoLine ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ°í Çì´õ ÆÄÀÏÀÇ ¿øÇüµµ ¼öÁ¤ÇÏÀÚ.

 

 

void CApiEdit::GotoLine(int Line, int Col/*=0*/, int Type/*=0*/)

{

     int tLine;

     ClearSelection();

 

     switch (Type) {

     case 0:

          tLine=min(Line,TotalLine-1);

          off=GetOffFromRC(Line,Col);

          break;

     case 1:

          for (tLine=0;tLine<TotalLine-1;tLine++) {

              if (pLine[tLine].nPara == Line)

                   break;

          }

          off=pLine[tLine].Start+Col;

          break;

     }

     SetCaret();

}

 

ÇÔ¼öÀÇ ±â´ÉÀÌ È®ÀåµÇ¾î ÁÙ¸¸ ã¾Æ°¡´Â °ÍÀÌ ¾Æ´Ï¶ó ÁöÁ¤ÇÑ ÁÙÀÇ ÁöÁ¤ÇÑ Ä­±îÁö ã¾Æ°¡µµ·Ï ÇÏ¿´´Ù. TypeÀÌ 0À̸é ÁÙÀ» ã´Â °ÍÀÌ°í 1ÀÌ¸é ¹®´ÜÀ» ã´Â °ÍÀÌ´Ù. Ãß°¡µÈ µÎ °³ÀÇ Àμö Col°ú TypeÀº ¸ðµÎ µðÆúÆ®°ª 0À» °¡Áø´Ù. ÁÙÀ» ã¾Æ°¥ ¶§´Â GetOffFromRC ÇÔ¼ö·Î °£´ÜÇÏ°Ô À̵¿ÇÒ ¼ö ÀÖÀ¸³ª ¹®´Ü ã±â´Â º°µµÀÇ ÇÔ¼ö°¡ ¾øÀ¸¹Ç·Î ÀÏ´Ü ¼±Çü °Ë»öÇÏ¿´´Ù. ÀÌ ºÎºÐÀº Â÷ÈÄ¿¡ Á» ´õ È¿À²ÀûÀÎ ÄÚµå·Î ¼öÁ¤µÉ °ÍÀÌ´Ù.

Á٠ã±â ´ëÈ­»óÀÚ´Â ÇöÀç ij·µÀÌ ÀÖ´Â °÷ÀÇ ÁÙ¹øÈ£¸¦ º¸¿©ÁÖ°í »ç¿ëÀÚ°¡ ÁÙ¹øÈ£¸¦ ÆíÁýÇÏ¸é º¯°æµÈ ÁÙ·Î À̵¿Çϵµ·Ï ÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ÀÌ ´ëÈ­»óÀÚ¸¦ »ç¿ëÇϸé ÇöÀç À§Ä¡¿¡¼­ »ó´ëÀûÀ¸·Î 100ÁÙ µÚ, 100ÁÙ ÀÌÀü µîÀ¸·Î À̵¿ÇÒ ¼öµµ ÀÖ´Ù. ¾ÆÁ÷ ÇöÀç ÁÙÀ» Á¶»çÇÒ ¼ö ÀÖ´Â ÇÔ¼ö´Â Á¦°øµÇÁö ¾ÊÀ¸¹Ç·Î ÇÔ¼ö¸¦ Çϳª ¸¸µéµµ·Ï ÇÏÀÚ. ¸ÕÀú Çì´õ ÆÄÀÏ¿¡ ´ÙÀ½ ¿­°ÅÇüÀ» ¼±¾ðÇÑ´Ù.

 

enum { AE_INFO_ROW, AE_INFO_COL, AE_INFO_PARA, AE_INFO_LINE, AE_INFO_PARACOL };

 

ƯÁ¤ ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¾î¶² Á¤º¸¸¦ ±¸ÇÒ °ÍÀÎÁö¸¦ ÁöÁ¤ÇÏ´Â ¿­°ÅÇüÀÌ´Ù. ±¸ÇÏ´Â Á¤º¸ÀÇ Á¾·ù°¡ ¸¹±â ¶§¹®¿¡ Á¤¼öÇüÀ» Á÷Á¢ ¾²´Â °Íº¸´Ù ¿­°ÅÇüÀ» ¾²´Â °ÍÀÌ ´õ ÁÁÀ» °Í °°´Ù. ´ÙÀ½ ¸â¹öÇÔ¼ö¸¦ ApiEdit.cpp¿¡ Ãß°¡ÇÑ´Ù.

 

int CApiEdit::GetInfoFromOff(int Type, int nPos/*=-1*/)

{

     int r,c;

     int ret;

 

     if (nPos==-1) {

          nPos=off;

     }

 

     GetRCFromOff(nPos,r,c);

 

     switch (Type) {

     case AE_INFO_ROW:

          ret=r;

          break;

     case AE_INFO_COL:

          ret=c;

          break;

     case AE_INFO_PARA:

          ret=pLine[r].nPara;

          break;

     case AE_INFO_LINE:

          ret=pLine[r].nLine;

          break;

     case AE_INFO_PARACOL:

          while (pLine[r].nLine != 0) r--;

          return nPos-pLine[r].Start;

     }

 

     return ret;

}

 

ÀÌ ÇÔ¼ö´Â ÇöÀç À§Ä¡·ÎºÎÅÍ ¿­, ÁÙ, ¹®´Ü, ¹®´Ü ³»ÀÇ ÁÙ¹øÈ£, ¹®´Ü ³»ÀÇ Ä­ ¹øÈ£ µîÀÇ ´Ù¾çÇÑ °ªÀ» Á¶»çÇÑ´Ù. ÁÙ À̵¿ ´ëÈ­»óÀÚ´Â Á¤¼ö°ª Çϳª¸¦ ÀԷ¹ÞÀ¸¸ç ´ÙÀ½°ú °°ÀÌ µðÀÚÀεǾî ÀÖ´Ù.

¾÷´Ù¿î ÄÁÆ®·ÑÀÌ ¿¡µðÆ®ÀÇ ¹öµð·Î ÁöÁ¤µÇ¾î ÀÖ¾î ¸¶¿ì½º·Î À̵¿ÇÒ ÁÙÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´À¸¸ç ¿¡µðÆ®´Â ¼ýÀÚ¸¸ ÀԷ¹ÞÀ» ¼ö ÀÖÀ¸¹Ç·Î ES_NUMBER ¼Ó¼ºÀ» ÁÖ¾ú´Ù. ÀÌ ´ëÈ­»óÀÚÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

 

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

{

     HWND hActive;

     SInfo *pSi;

     int nPara;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

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

          nPara=pSi->Ae.GetInfoFromOff(AE_INFO_PARA)+1;

          SetDlgItemInt(hDlg,IDC_GOLINENUM,nPara,FALSE);

          SendDlgItemMessage(hDlg,IDC_GOTOLINESPIN,UDM_SETRANGE,0,MAKELPARAM(UD_MAXVAL,1));

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDOK:

              EndDialog(hDlg,GetDlgItemInt(hDlg,IDC_GOLINENUM,NULL,FALSE));

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,-1);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

WM_INITDIALOG¿¡¼­ È°¼º Â÷ÀϵåÀÇ ÇöÀç ¹®´Ü¹øÈ£¸¦ ±¸ÇØ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ´ëÀÔÇÏ¿´´Ù. ¾÷´Ù¿î ÄÁÆ®·ÑÀº µðÆúÆ®·Î À§ÂÊ ¹öÆ°ÀÌ °¨¼Ò, ¾Æ·¡ÂÊ ¹öÆ°ÀÌ Áõ°¡ÀÌ¸ç ¿ì¸®ÀÇ Á÷°üÀûÀÎ »ý°¢°ú´Â ¹Ý´ë·Î µÇ¾î ÀÖ´Ù. ¾÷´Ù¿î ÄÁÆ®·ÑÀÇ ¹üÀ§°¡ ¹Ý´ë·Î µÇ¾î ÀÖ´Â ÀÌÀ¯°¡ Á» ÀÌ»óÇÏ°Ô »ý°¢µÇ°ÚÁö¸¸ ½ºÅ©·Ñ¹Ùµµ »ç½Ç ¹Ý´ë·Î µÇ¾î ÀÖ¾î ¾Æ·¡ÂÊ ¹öÆ°ÀÌ Áõ°¡ÀÌ°í À§ÂÊ ¹öÆ°ÀÌ °¨¼ÒÀÌ´Ù. Áö±Ý ¿ì¸®´Â ¾÷´Ù¿î ÄÁÆ®·ÑÀ» ½ºÅ©·Ñ ¿ëµµ·Î ¾²´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ÀÌ ¹üÀ§¸¦ ´Ù½Ã ¹Ý´ë·Î µÚÁý¾î ÁÖ¾ú´Ù. Áï À§ÂÊ ¹öÆ°ÀÌ Áõ°¡ÀÌ°í ¾Æ·¡ÂÊ ¹öÆ°ÀÌ °¨¼ÒÀÌ´Ù.

»ç¿ëÀÚ´Â ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ À̵¿ÇÏ°íÀÚ ÇÏ´Â ÁÙ¹øÈ£¸¦ ÀÔ·ÂÇϰųª ¾÷´Ù¿î ÄÁÆ®·Ñ·Î À̵¿ÇÒ ÁÙ¹øÈ£¸¦ Áõ°¨ÇÑ ÈÄ È®ÀÎ ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. À̶§ EndDialogÀÇ µÎ ¹ø° ÀμöÀÎ Á¾·áÄڵ忡 »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ÁÙ¹øÈ£¸¦ ¸®ÅÏÇÏ¿´´Ù. ¸Þ´º¿¡¼­ ÀÌ ´ëÈ­»óÀÚ¸¦ ºÎ¸£°í ´ëÈ­»óÀÚÀÇ ¸®ÅÏ°ªÀ¸·Î Àü´ÞµÈ ¹®´ÜÀ¸·Î À̵¿ÇÑ´Ù. ´Ü Ãë¼ÒÇßÀ» °æ¿ì¿¡´Â -1ÀÌ ³Ñ¾î ¿À´Âµ¥ À̶§´Â ¾Æ¹« °Íµµ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

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

{

     ....

     case IDM_SEARCH_GOTOLINE:

          s=DialogBox(g_hInst,MAKEINTRESOURCE(IDD_GOTOLINE),hWnd,GotoLineDlgProc);

          if (s != -1) {

              pSi->Ae.GotoLine(s-1,0,1);

          }

          break;

 

»ç¿ëÀÚ°¡ °¡°í ½ÍÀº ÁÙ¹øÈ£¿¡¼­ 1À» »« ÁÙ·Î À̵¿Çϴµ¥ »ç¶÷µéÀº ÀÚ¿¬¼ö¸¦ ¾²Áö¸¸ ApiEditÀÇ ¹®´Ü¹øÈ£´Â Á¦·Î º£À̽º(Zero Base)ÀÓÀ» À¯ÀÇÇØ¾ß ÇÑ´Ù. »ç¿ëÀÚ°¡ 5¹ø ÁÙ·Î À̵¿ÇÏ°í ½Í´Ù¸é ½ÇÁ¦·Î´Â 4¹ø ¹®´ÜÀ¸·Î À̵¿ÇØ¾ß ÇÑ´Ù. Á٠ã±â ±â´ÉÀº ´ÜÃàÅ° <Ctrl+G>·Î Á¤ÀǵǾî ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ´ëÈ­»óÀÚ¸¦ ºÎ¸ð À©µµ¿ìÀÇ Áß¾ÓÀ¸·Î À̵¿½ÃÅ°´Âµ¥ Util.cpp¿¡ Ãß°¡ÇÑ´Ù.

 

void MoveToParentCenter(HWND hWnd)

{

     RECT wrt,crt;

 

     GetWindowRect(GetParent(hWnd),&wrt);

     GetWindowRect(hWnd,&crt);

     SetWindowPos(hWnd,HWND_NOTOPMOST,wrt.left+(wrt.right-wrt.left)/2-(crt.right-crt.left)/2,

          wrt.top+(wrt.bottom-wrt.top)/2-(crt.bottom-crt.top)/2,0,0,SWP_NOSIZE);

}

 

Á٠ã±â ´ëÈ­»óÀÚÀÇ WM_INITDIALOG¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸ÞÀÎ À©µµ¿ìÀÇ Áß¾Ó¿¡ ¿­¸®µµ·Ï ÇÏ¿´´Ù. ¾ÕÀ¸·Îµµ ¸¹Àº ´ëÈ­»óÀÚ¸¦ ¿­°Ô µÉ ÅÙµ¥ ±×¶§¸¶´Ù ºÎ¸ð À©µµ¿ìÀÇ Áß¾Ó ÁÂÇ¥¸¦ °è»êÇÏÀÚ¸é ¹ø°Å·Î¿ì¹Ç·Î ¾Æ¿¹ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ¸¸µé¾î µÎ¾ú´Ù. ÀÌ ÇÔ¼ö´Â ºÎ¸ð À©µµ¿ìÀÇ ÁÂÇ¥, Å©±â ±×¸®°í ÀÚ½ÅÀÇ Å©±â¸¦ °í·ÁÇÏ¿© Á¤ Áß¾ÓÀ¸·Î ´ëÈ­»óÀÚ¸¦ ¿Å°ÜÁØ´Ù.