ÀÌ ±â´ÉÀº »ç¿ëÀÚ°¡ À̵¿ÇÒ ÁÙ¹øÈ£¸¦ Á¤È®ÇÏ°Ô ¾Ë°í ÀÖÀ» ¶§ Á÷Á¢ ã¾Æ°¡´Â ±â´ÉÀÌ´Ù. ÁöÁ¤ÇÑ ÁÙ·Î À§Ä¡¸¦ ¿Å±â´Â GotoLine ÇÔ¼ö´Â ÀÌ¹Ì ºÏ¸¶Å© ±â´ÉÀ» ÀÛ¼ºÇÒ ¶§ ¸¸µé¾î µÐ ÀûÀÌ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ ÇÔ¼ö°¡ ã¾Æ°¡´Â ÁÙÀº Á¤·ÄµÈ °á°úÀÎ pLine¿¡¼ÀÇ ÁÙ, Áï ȸé»óÀÇ ¹°¸®ÀûÀÎ ÁÙÀÌ´Ù. »ç¿ëÀÚ¿¡°Ô ÁÙÀ̶ó´Â °³³äÀº °³ÇàÄÚµå·Î ºÐ¸®µÈ ¹®´ÜÀÇ °³³äÀ̹ǷΠÀÌ ÇÔ¼ö¸¦ È®ÀåÇÏ¿© ¹®´ÜÀ» ã¾Æ°¡´Â ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¹°·Ð ÇÔ¼öÀÇ ¿øÇü¿¡ º¯È°¡ ¾øµµ·Ï ÇÏ¿© ±âÁ¸ ÄÚµå´Â ¿µÇâÀ» ¹ÞÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. GotoLine ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ°í Çì´õ ÆÄÀÏÀÇ ¿øÇüµµ ¼öÁ¤ÇÏÀÚ.
void CApiEdit::GotoLine(int Line, int
{
int tLine;
ClearSelection();
switch (Type) {
case 0:
tLine=min(Line,TotalLine-1);
off=GetOffFromRC(Line,
break;
case 1:
for (tLine=0;tLine<TotalLine-1;tLine++) {
if (pLine[tLine].nPara == Line)
break;
}
off=pLine[tLine].Start+
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¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸ÞÀÎ À©µµ¿ìÀÇ Áß¾Ó¿¡ ¿¸®µµ·Ï ÇÏ¿´´Ù. ¾ÕÀ¸·Îµµ ¸¹Àº ´ëÈ»óÀÚ¸¦ ¿°Ô µÉ ÅÙµ¥ ±×¶§¸¶´Ù ºÎ¸ð À©µµ¿ìÀÇ Áß¾Ó ÁÂÇ¥¸¦ °è»êÇÏÀÚ¸é ¹ø°Å·Î¿ì¹Ç·Î ¾Æ¿¹ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ¸¸µé¾î µÎ¾ú´Ù. ÀÌ ÇÔ¼ö´Â ºÎ¸ð À©µµ¿ìÀÇ ÁÂÇ¥, Å©±â ±×¸®°í ÀÚ½ÅÀÇ Å©±â¸¦ °í·ÁÇÏ¿© Á¤ Áß¾ÓÀ¸·Î ´ëÈ»óÀÚ¸¦ ¿Å°ÜÁØ´Ù.