ÇöÀçÇàÀ̶õ ij·µÀÌ ÀÖ´Â À§Ä¡, Áï ÆíÁýÀ» ÇÏ°í Àִ ȸé»óÀÇ À§Ä¡¸¦ ¸»ÇÑ´Ù. ij·µÀº °è¼Ó ±ô¹Ú°Å·Á ´«¿¡ Àß ¶çµµ·Ï µÇ¾î ÀÖÁö¸¸ Å©±â°¡ º°·Î Å©Áö ¾Ê±â ¶§¹®¿¡ ÇÑ´«¿¡ À§Ä¡°¡ Àß ÆľǵÇÁö ¾Ê´Â °æÇâÀÌ ÀÖ´Ù. ƯÈ÷ ½Ã·ÂÀÌ ÁÁÁö ¾ÊÀº »ç¶÷¿¡°Ô ÀÌ ¹®Á¦´Â ¾ÆÁÖ ½É°¢ÇÏ´Ù. ÇöÀçÇà Ç¥½Ã ±â´ÉÀº ij·µÀÌ ÀÖ´Â ÁÙ Àüü¸¦ °Á¶ÇÏ¿© ¾îµðÂë ÆíÁýÇÏ°í ÀÖ´ÂÁö¸¦ ºÐ¸íÇÏ°Ô º¸¿©ÁÖ´Â ±â´ÉÀÌ´Ù. °³ÀÎÀûÀ¸·Î º°·Î ÁÁ¾ÆÇÏÁöµµ ¾Ê°í ²À ÇÊ¿äÇÏ´Ù°íµµ »ý°¢ÇÏÁö ¾ÊÁö¸¸ ´ëºÎºÐÀÇ ÆíÁý±âµéÀÌ ÀÌ ±â´ÉÀ» Áö¿øÇÏ°í ÀÖÀ¸¹Ç·Î ApiEditµµ ÀÌ ±â´ÉÀ» ¸¸µé¾îº¸ÀÚ.
ÇöÀçÇàÀ» °Á¶ÇÒ ¶§´Â º¸Åë »ç°¢ÀÇ ¹Ú½º¸¦ º¸¿©Áְųª ¾Æ´Ï¸é ¹è°æ»öÀ» ´Ù¸¥ »öÀ¸·Î Ä¥ÇØ ´«¿¡ Àß ¶çµµ·Ï Çϴµ¥ ÃëÇâ¿¡ µû¶ó °Á¶ ¹æ½ÄÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. Áï, ÇöÀçÇàÀ» º¸¿©ÁÙ °ÍÀΰ¡ ¾Æ´Ñ°¡ »Ó¸¸ ¾Æ´Ï¶ó ¾î¶² ½ÄÀ¸·Î º¸¿©ÁÙ °ÍÀΰ¡¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ±×·¡¼ º¯¼ö´Â BOOLÇüÀÌ ¾Æ´Ñ Á¤¼öÇüÀ¸·Î ¼±¾ðÇÏ¿´´Ù.
int nShowCurLine;
COLORREF CurColor;
ÀÌ º¯¼öÀÇ °ª¿¡ µû¶ó ÇöÀçÇàÀ» °Á¶ÇÏ´Â ¹æ½ÄÀÌ ´Þ¶óÁö¸ç ´ÙÀ½ 5°¡Áö ¹æ½ÄÀÌ °¡´ÉÇÏ´Ù. ¹°·Ð ÇÊ¿äÇϸé ŸÀÔÀ» ¾ó¸¶µçÁö ´õ ´Ã¸± ¼ö ÀÖ´Ù.
°ª |
ÇöÀçÇà °Á¶ |
0 |
°Á¶ÇÏÁö ¾Ê´Â´Ù. |
1 |
ÇöÀçÇàÀ» µÑ·¯½Î´Â »ç°¢ ÇÁ·¹ÀÓÀ» º¸¿©ÁØ´Ù. |
2 |
ÇöÀçÇà ¾Æ·¡ÂÊ¿¡ ¹ØÁÙÀ» º¸¿©ÁØ´Ù. |
3 |
¹è°æ»öÀ» Ä¥ÇÑ´Ù. |
4 |
¹è°æ»öÀ» Ä¥ÇÏ°í »ç°¢ ÇÁ·¹ÀÓÀ¸·Î °¨½Ñ´Ù. |
5 |
¸¶Áø¿¡ »ï°¢Çü Ç¥½Ã·Î ÇöÀçÇàÀ» Ç¥½ÃÇÑ´Ù. |
Àû´çÇÑ µðÆúÆ®°ªÀ» ¼±ÅÃÇØ¾ß Çϴµ¥ ÀÏ´Ü ÀÌ ±â´ÉÀÌ ÀÖ´Ù´Â °ÍÀ» º¸¿© Áà¾ß ÇϹǷΠ3¹ø ¹è°æ»öÀ» Ä¥ÇÏ´Â °ÍÀ¸·Î ÃʱâÈÇϵµ·Ï ÇÏÀÚ. ¹è°æ»ö»óÀº ´«¿¡ Àß ¶ç´Â ³ë¶õ»öÀ¸·Î ÃʱâÈÇÏ¿´´Ù.
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
....
nShowCurLine=3;
CurColor=RGB(255,255,0);
....
ÀÌ º¯¼ö°ªÀº ÇÑ ÁÙÀ» Ãâ·ÂÇÏ´Â DrawLineÀÇ µ¿ÀÛ¿¡ ¸¹Àº ¿µÇâÀ» ¹ÌÄ¡°Ô µÈ´Ù. ÁÙÀÇ ÅؽºÆ®¸¸ Ãâ·ÂÇÒ °Ô ¾Æ´Ï¶ó ÇöÀç ÁÙµµ °°ÀÌ º¸¿© Áà¾ß Çϱ⠶§¹®ÀÌ´Ù. DrawLineÀÇ Äڵ尡 ¸¹ÀÌ È®ÀåµÇ¾î¾ß ÇÑ´Ù.
int DrawLine(HDC hdc, int Line)
{
....
int r,c;
BOOL bCurLine=FALSE;
RECT lrt;
HBRUSH hCurLine;
int toff;
POINT tri[]={{1,1},{1,0},{0,0},{1,1}};
if (pLine[Line].Start == -1)
return 0;
if (bComp) {
toff=off-2;
} else {
toff=off;
}
GetRCFromOff(toff,r,c);
if (r==Line) {
bCurLine=TRUE;
}
if (bCurLine && (nShowCurLine == 3 || nShowCurLine == 4)) {
SetRect(&lrt,frt.left,0,frt.right,FontHeight);
hCurLine=CreateSolidBrush(CurColor);
FillRect(hdc,&lrt,hCurLine);
DeleteObject(hCurLine);
}
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
x=MarginWidth-xPos;
nowoff=pLine[Line].Start;
for (;;) {
....
if (bInSel && (GetFocus()==hWndMain || HideSelType!=0)) {
fore=SelFore;
back=SelBack;
} else {
fore=RGB(0,0,0);
if ((nShowCurLine==3 || nShowCurLine==4) && bCurLine) {
back=CurColor;
} else {
back=GetSysColor(COLOR_WINDOW);
}
}
DrawSegment(hdc,x,0,nowoff,len,(nowoff+len==pLine[Line].End),fore,back);
nowoff+=len;
if (nowoff == pLine[Line].End)
break;
}
if ((nShowCurLine==1 || nShowCurLine==2 || nShowCurLine==4) && bCurLine) {
if (nShowCurLine == 1 || nShowCurLine == 4) {
SetRect(&lrt,frt.left-1,0,frt.right+1,FontHeight);
} else {
SetRect(&lrt,frt.left-1,FontHeight,frt.right+1,FontHeight);
}
SetTextColor(hdc,RGB(0,0,0));
SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
DrawFocusRect(hdc,&lrt);
}
if (MarginWidth != 0) {
....
if (nShowCurLine == 5 && bCurLine) {
OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
tri[1].y=FontHeight-1-FontHeight % 2;
tri[2].x=FontHeight/2;
tri[2].y=FontHeight/2;
Polygon(hdc,tri,4);
SelectObject(hdc,OldBrush);
}
}
return 1;
}
ÀÏ´Ü ÀÌ ÇÔ¼ö´Â Áö±Ý Ãâ·ÂÇÏ´Â Line ÁÙÀÌ ÇöÀç ij·µÀÌ ÀÖ´Â ÁÙÀÎÁö¸¦ ¸ÕÀú ÆÇ´ÜÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Ãâ·Â ´ë»óÀÌ µÇ´Â ÁÙ¹øÈ£¸¸ ¹ÞÀ» »ÓÀÌÁö ÀÌ ÁÙÀÌ ÇöÀç ÁÙÀÎÁö ¾Æ´ÑÁö´Â Àü´Þ¹ÞÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÇöÀç ij·µ À§Ä¡´Â ÀϹÝÀûÀ¸·Î Àü¿ªº¯¼ö off°¡ °¡¸®Å°´Â À§Ä¡ÀÌµÇ ´Ü ÇѱÛÀ» Á¶¸³ÇÏ°í ÀÖ´Â Áß¿¡´Â 2Ä ¾ÕÂÊÀÇ ¿ÀÇÁ¼ÂÀÌ ÇöÀç ij·µ À§Ä¡°¡ µÈ´Ù. ÀÌ À§Ä¡ÀÇ ÁÙ ¼ö¿Í Line ÁÙÀÌ ¸ÂÀ¸¸é Áö±Ý Ãâ·ÂÇÏ´Â ÁÙÀÌ ÇöÀç ÁÙÀ̸ç À̶§ bCurLine º¯¼ö¸¦ TRUE·Î ¹Ù²Û´Ù. ¸¸¾à ÇöÀç ÁÙÀÌ ¾Æ´Ï°Å³ª nShowCurLineÀÌ 0À̶ó¸é ¾Æ¹«°Íµµ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ÅؽºÆ®¸¸ Á¦´ë·Î Ãâ·ÂÇÏ¸é µÈ´Ù.
nShowCurLineÀÌ 1À̳ª 2ÀÎ °æ¿ìÀÇ Ã³¸®´Â ¸ðµç ÅؽºÆ®¸¦ ´Ù Ãâ·ÂÇÏ°í ³ ´ÙÀ½¿¡ ÇÑ´Ù. »ç°¢ ÇÁ·¹ÀÓÀ» Ãâ·ÂÇÒ ¶§´Â DrawFocusRect ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ ÀÌ ÇÔ¼ö´Â DC¿¡ ¼³Á¤µÈ ÅؽºÆ®ÀÇ Àü°æ, ¹è°æ»öÀ» »ç¿ëÇϹǷΠ°ËÁ¤»ö°ú ¹è°æ»öÀ¸·Î µÈ Á¡¼±À» ±ß±â À§ÇØ Àü°æ, ¹è°æ»öÀ» ¸ðµÎ ¼³Á¤ÇØ¾ß ÇÑ´Ù. nShowCurLine°ª¿¡ µû¶ó ÇÁ·¹ÀÓÀ» Ãâ·ÂÇÒ ¿µ¿ªÀÌ ´Þ¶óÁö´Âµ¥ 1ÀÌ¸é ¾Æ·¡ÂÊ¿¡ 1Çȼ¿ µÎ²²·Î, 2¸é ÁÙ Àüü¸¦ °¨½Î´Â Å©±â´ë·Î Ãâ·ÂÇÏ¿´´Ù. ÇÁ·¹ÀÓÀÇ ¼öÆòÀ§Ä¡´Â Æ÷¸ËÆÿµ¿ªº¸´Ù ÇÑ Çȼ¿¾¿ ¹Ù±ùÂÊÀ¸·Î µÇ¾î Àִµ¥ ¿Ö³ÄÇÏ¸é ¼öÆò½ºÅ©·Ñ½Ã¿¡ ÇÁ·¹ÀÓÀÌ °°ÀÌ ½ºÅ©·ÑµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇؼÀÌ´Ù. ¸¶ÁøÀÇ ¿À¸¥ÂÊ¿¡ ÇÑ Çȼ¿ ¿©À¯ºÐÀÌ ÀÖÀ¸¹Ç·Î ÇÁ·¹ÀÓÀÌ Æ÷¸ËÆÿµ¿ªÀ» ¾à°£ ¹þ¾î³ªµµ º° »ó°üÀÌ ¾ø´Ù.
nShowCurLineÀÌ 3ÀÎ °æ¿ì´Â ¹è°æ»öÀ» Ä¥Çϴµ¥ ¹®ÀÚ°¡ ¾ø´Â ¿µ¿ª¿¡µµ ¹è°æ»öÀÌ ÀÖ¾î¾ß ÇϹǷΠÅؽºÆ® Ãâ·Â Àü¿¡ ÀÏ´Ü ¹è°æ»öÀ» ±ò¾Æ µÎ¾î¾ß ÇÑ´Ù. ±×¸®°í ÅؽºÆ®¸¦ Ãâ·ÂÇÒ ¶§ ¼±Åÿµ¿ªÀÌ ¾Æ´Ñ Á¶°¢ÀÇ ¹è°æ»öÀ» ³ë¶õ»öÀ¸·Î ¹Ù²Ù¾î ÁÜÀ¸·Î½á ÁÙ Àüü°¡ ³ë¶õ ¹è°æÀ» °¡Áöµµ·Ï Çß´Ù. ¹°·Ð ¼±Åÿµ¿ªÀº ¹è°æ»öÀ» ¹«½ÃÇÏ°í ¼±Åÿµ¿ªÀÇ ¹è°æ»öÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. nShowCurLineÀÌ 4ÀÎ °æ¿ì´Â 3ÀÎ °æ¿ì¿Í 2ÀÎ °æ¿ìÀÇ Á¶ÇÕÀ̹ǷΠÅؽºÆ® Ãâ·Â Àü¿¡ ¹è°æÀ» ±ò°í Ãâ·Â ÈÄ¿¡ ÇÁ·¹ÀÓµµ ±×·Á¾ß ÇÑ´Ù.
nShowCurLineÀÌ 5ÀÎ °æ¿ì´Â Æ÷¸ËÆÿµ¿ªÀÌ ¾Æ´Ï¶ó ¸¶Áø¿µ¿ª¿¡ ÇöÀç ÇàÀ» Ç¥½ÃÇϹǷΠif (MarginWidth != 0) ºí·Ï ¾È¿¡ Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÇöÀçÇà Ç¥½Ã´Â ÁÙ¹øÈ£³ª ºÏ¸¶Å© Ç¥½Ãº¸´Ùµµ ´õ À§¿¡ ÀÖ¾î¾ß ÇϹǷΠÀÌ ºí·ÏÀÇ °¡Àå ¾Æ·¡ÂÊ¿¡ ÀÖ´Â °ÍÀÌ ÁÁ´Ù. tri ¹è¿Àº »ï°¢ÇüÀÇ ¼¼ ²ÀÁöÁ¡ ÁÂÇ¥ÀÌµÇ ¾Æ·¡ÂÊ°ú ¿À¸¥ÂÊ ²ÀÁöÁ¡Àº ÆùÆ® Å©±â¿¡ µû¶ó º¯ÇϹǷΠÀÏ´Ü 0À¸·Î ÃʱâÈÇÏ°í »ï°¢ÇüÀ» ±×¸± ¶§ ÁÂÇ¥°ªÀ» Á¶Á¤ÇØ¾ß ÇÑ´Ù. ƯÈ÷ ¾Æ·¡ Á¡ tri[1].y °ªÀº FontHeight°¡ Ȧ¼öÀÏ ¶§´Â 1À» ´õ »©ÁÖ¾î¾ß ¿¹»Û »ï°¢ÇüÀÌ ±×·ÁÁø´Ù.
ij·µÀº ¹®¼¿¡ Æ÷ÇԵǾî ÀÖ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ij·µÀÇ À̵¿À¸·Î ÀÎÇØ È¸éÀ» ´Ù½Ã ±×¸®Áö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ÇöÀçÇà °Á¶ ±â´ÉÀÌ µé¾î°¡¸é ij·µÀÌ À̵¿ÇÒ ¶§¸¶´Ù À̵¿ ÀüÀÇ Çà°ú À̵¿ ÈÄÀÇ ÇàÀ» ´Ù½Ã ±×·Á¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. SetCaret¿¡¼ ij·µÀÇ y ÁÂÇ¥°¡ º¯°æµÇ¸é ¹«È¿ÈÇÏ¿© ´Ù½Ã ±×¸®µµ·Ï ÇØ¾ß ÇÑ´Ù. ¼öÆòÀ¸·Î À̵¿ÇÒ ¶§´Â ±»ÀÌ ´Ù½Ã ±×¸± ÇÊ¿ä°¡ ¾ø´Ù.
void SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
POINT OldPos;
RECT InvRt;
GetCaretPos(&OldPos);
....
if (nShowCurLine != 0 && OldPos.y != y-yPos) {
InvRt.left=0;
InvRt.right=frt.right;
InvRt.top=min(OldPos.y,y-yPos);
InvRt.bottom=max(OldPos.y,y-yPos)+LineHeight;
InvalidateRect(hWndMain,&InvRt,FALSE);
}
}
ij·µÀ» À̵¿Çϱâ Àü¿¡ OldPos¿¡ ij·µÀÇ ÁÂÇ¥¸¦ Á¶»çÇسõ°í ij·µÀ̵¿ ÈÄ OldPosÀÇ y ÁÂÇ¥°¡ À̵¿ÇÑ ÈÄÀÇ y ÁÂÇ¥¿Í ´Ù¸£¸é, Áï ij·µÀÇ ¼öÁ÷ÁÂÇ¥°¡ ¹Ù²î¾úÀ¸¸é ÀÛ¾÷¿µ¿ªÀ» ¹«È¿ÈÇÏ¿© ´Ù½Ã ±×·Á¾ß ÇÑ´Ù.
À̶§ ´Ù½Ã ±×·Á¾ß ÇÒ ¿µ¿ªÀº À̵¿Çϱâ ÀüÀÇ Ä³·µ À§Ä¡¿¡¼ºÎÅÍ À̵¿ÇÑ ÈÄÀÇ Ä³·µ À§Ä¡±îÁöÀÌ¸ç ±× ¿ÜÀÇ ¿µ¿ªÀº ±»ÀÌ ´Ù½Ã ±×¸± ÇÊ¿ä°¡ ¾ø´Ù. ¿¹¸¦ µé¾î 3¹ø ÁÙ¿¡¼ 4¹ø ÁÙ·Î ³»·Á¿Ô´Ù¸é 3¹ø ÁÙ¿¡ ÀÖ´Â ÇöÀçÇà Ç¥½Ã´Â Áö¿ì°í 4¹ø ÁÙ¿¡ ´Ù½Ã ÇöÀçÇàÀ» Ç¥½ÃÇÏ¸é µÈ´Ù. ¹«È¿¿µ¿ªÀ» ÃÖ¼ÒÈÇϱâ À§ÇØ À̵¿ ÀüÀÇ y ÁÂÇ¥¿Í À̵¿ ÈÄÀÇ y ÁÂÇ¥ »çÀ̸¸ ¹«È¿ÈÇÏ¿´´Ù.
ÀÛ¾÷¿µ¿ªÀ» ¹«È¿È½ÃÅ°´Â Invalidate¶ó´Â ÇÔ¼ö¸¦ ÀÌ¹Ì ¸¸µé¾î µÎ¾úÁö¸¸ SetCaretÀº ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ¹«È¿¿µ¿ªÀ» °è»êÇÏ´Â Äڵ带 ÀÛ¼ºÇÏ¿´´Ù. ¿Ö³ÄÇϸé SetCaretÀº ȸé ÁÂÇ¥¸¦ Á÷Á¢ ´Ù·ç¸ç ¿ÀÇÁ¼ÂÀ» ´Ù·ç°í ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ij·µÀÌ À̵¿Çϱâ ÀüÀÇ ¿ÀÇÁ¼Â ÁÂÇ¥¸¦ ¸ð¸£±â ¶§¹®¿¡ Invalidate ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ±×·¡¼ Á÷Á¢ ¹«È¿¿µ¿ªÀ» °è»êÇÏ¿´´Ù. °¢ ŸÀÔ º°·Î ÇöÀçÇàÀº ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµÈ´Ù.
ÇÁ·¹ÀÓÀ» º¸¿©ÁÖ´Â 1¹øÀÌ °¡Àå ±ò²ûÇÑ °Í °°°í 3¹øÀÌ °¡Àå ´«¿¡ Àß ¶è´Ù. 5¹øµµ ±×·°Àú·° ±¦Âú¾Æ º¸À̴µ¥ ÀÌ·± ŸÀÔÀº ¾ó¸¶µçÁö ´õ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.