³ª. ¼±Åÿµ¿ª È®Àå

¹ÝÀü ¼±ÅùýÀ¸·Î ¼±Åÿµ¿ªÀ» Ç¥½ÃÇÒ ¶§µµ ¼±ÅÃÀ» ¸¸µå´Â ¹æ¹ýÀº °ÅÀÇ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ´Ù½Ã ±×¸®Áö ¾Ê±â ¶§¹®¿¡ ¸¶¿ì½ºÀÇ À̵¿¿¡ ÀÇÇØ Ãß°¡·Î ¼±ÅÃµÈ ¿µ¿ª¸¸ µû·Î ¹ÝÀü½ÃÄÑ¾ß ÇÑ´Ù. ±âÁ¸¿¡ ¼±ÅõǾî ÀÖ´Â ¹ÝÀü ºí·ÏÀ» ±×´ë·Î µÎ°í Ãß°¡ ¿µ¿ª¸¸ ±¸ÇØ ¹ÝÀü½ÃÅ°¸é µÇ´Âµ¥ ÀÌ Ã³¸®´Â °£´ÜÇÑ ¼öÇÐ½Ä Çϳª·Î ÇØ°áµÈ´Ù. ´ÙÀ½ ÇÔ¼ö°¡ Ãß°¡ ¼±Åÿµ¿ªÀ» ¹ÝÀü½ÃÄÑ ÁØ´Ù.

 

void InvertNewSel(HDC hdc, int s, int e1, int e2)

{

     HRGN rgn1, rgn2, rgnOR, rgnAND, rgnDIFF;

     MakeSelRgn(s, e1, rgn1);

     MakeSelRgn(s, e2, rgn2);

 

     rgnOR=CreateRectRgn(0,0,0,0);

     rgnAND=CreateRectRgn(0,0,0,0);

     rgnDIFF=CreateRectRgn(0,0,0,0);

     CombineRgn(rgnOR, rgn1, rgn2, RGN_OR);

     CombineRgn(rgnAND, rgn1, rgn2, RGN_AND);

     CombineRgn(rgnDIFF, rgnOR, rgnAND, RGN_DIFF);

 

     InvertRgn(hdc,rgnDIFF);

 

     DeleteObject(rgnOR);

     DeleteObject(rgnAND);

     DeleteObject(rgnDIFF);

     DeleteObject(rgn1);

     DeleteObject(rgn2);

}

 

±âÁ¸ ¼±Åÿµ¿ªÀ» A¶ó°í ÇÏ°í »õ·Î ¼±ÅÃµÈ ¿µ¿ªÀ» B¶ó°í ÇÒ ¶§ Ãß°¡·Î ¹ÝÀü½ÃÄÑ¾ß ÇÒ ¿µ¿ªÀº A¿Í BÀÇ ÇÕÁýÇÕ¿¡¼­ A¿Í BÀÇ ±³ÁýÇÕÀ» »« ¿µ¿ªÀÌ´Ù. InvertNewSel ÇÔ¼ö´Â ¼±Åà ½ÃÀÛ Á¡ s¿Í ÀÌÀüÀÇ ¼±Åà ³¡Á¡ e1, »õ ¼±Åà ³¡Á¡ e2¸¦ Àμö·Î Àü´Þ ¹Þ¾Æ µÎ ¼±Åÿµ¿ªÀÇ ¸®ÀüÀ» ±¸ÇÑ ÈÄ °ø½Ä¿¡ µû¶ó »õ·Î ¹ÝÀü½Ãų ¸®ÀüÀ» ±¸ÇÑ´Ù. ±×¸®°í InvertRgn ÇÔ¼ö·Î ÀÌ ¸®ÀüÀ» ¹ÝÀü½ÃŲ´Ù.

ÀÌ °ø½ÄÀº ¼±Åÿµ¿ªÀÌ È®ÀåµÉ ¶§»Ó¸¸ ¾Æ´Ï¶ó ¼±Åÿµ¿ªÀÌ Ãà¼ÒµÉ ¶§µµ ±×´ë·Î Àû¿ëµÈ´Ù. ¿Ö³ÄÇÏ¸é ¹ÝÀüµÈ ¿µ¿ªÀ» ´Ù½Ã ¹ÝÀü½ÃÅ°¸é ¿ø·¡´ë·Î µ¹¾Æ¿À±â ¶§¹®ÀÌ´Ù. Áï, ÀÌ ÇÔ¼ö´Â µÎ ¼±Åÿµ¿ªÀ¸·ÎºÎÅÍ È®ÀåµÇ¾î¾ß ÇÒ ºÎºÐ, ¶Ç´Â Ãà¼ÒµÇ¾î¾ß ÇÒ ºÎºÐÀ» °è»êÇؼ­ ±×¸¸Å­À» ¹ÝÀü½ÃÄÑ ÁØ´Ù. ¸¶¿ì½º ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ÄÚµå´Â ´Ù½Ã ±×¸®´Â ¹æ¹ý°ú °ÅÀÇ À¯»çÇÏ´Ù.

 

void OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     HDC hdc;

 

     UpdateWindow(hWnd);

     hdc=GetDC(hWnd);

     InvertSelect(hdc);

     ReleaseDC(hWnd,hdc);

     SelStart=SelEnd=0;

 

     off=GetOffFromXY(x+xPos,y+yPos);

     SelStart=SelEnd=off;

     SetCapture(hWnd);

     bCapture=TRUE;

     SetCaret();

}

 

void OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)

{

     HDC hdc;

     int OldSelEnd;

     BOOL bInstTimer;

     RECT crt;

     int r,c;

     int s,e;

 

     if (bCapture == FALSE)

          return;

 

     OldSelEnd=SelEnd;

     off=SelEnd=GetOffFromXY(x+xPos,y+yPos);

 

     hdc=GetDC(hWnd);

     if (OldSelEnd != SelEnd) {

          InvertNewSel(hdc,SelStart,OldSelEnd,SelEnd);

     }

     ReleaseDC(hWnd,hdc);

 

     bInstTimer=FALSE;

     GetClientRect(hWnd,&crt);

     if (y>crt.bottom) {

          SendMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0L);

          bInstTimer=TRUE;

     }

     if (y <0) {

          SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);

          bInstTimer=TRUE;

     }

 

     if (nWrap == 0) {

          GetRCFromOff(SelEnd,r,c);

          GetLine(r,s,e);

          if (x>crt.right && SelEnd != e) {

               SendMessage(hWnd, WM_HSCROLL, SB_LINERIGHT, 0L);

               bInstTimer=TRUE;

          }

          if (x<0 && SelEnd != s) {

               SendMessage(hWnd, WM_HSCROLL, SB_LINELEFT, 0L);

               bInstTimer=TRUE;

          }

     }

 

     if (bInstTimer==TRUE) {

          SetTimer(hWnd, 1, 200, NULL);

     } else {

          KillTimer(hWnd, 1);

     }

     SetCaret();

}

 

void OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags)

{

     bCapture=FALSE;

     ReleaseCapture();

     KillTimer(hWnd,1);

}

 

void OnTimer(HWND hWnd, UINT id)

{

     POINT pt;

 

     switch (id) {

     case 1:

          GetCursorPos(&pt);

          ScreenToClient(hWnd, &pt);

          SendMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(pt.x, pt.y));

          break;

     }

}

 

OnLButtonUp, OnTimer´Â ´Ù½Ã ±×¸®´Â ¹æ¹ý°ú ¿ÏÀüÈ÷ µ¿ÀÏÇϸç OnLButtonDown, OnMouseMove¿¡¼­ ¼±ÅÃÀ» ¸¸µå´Â ¹æ¹ý¸¸ Á¶±Ý ´Ù¸£´Ù. ÀÌÀü ¼±ÅÃÀÇ ³¡Á¡À» OldSelEnd¿¡ º¸°üÇسõ°í »õ·Î¿î ¼±Åà ³¡Á¡°ú ÇÔ²² InvertNewSel ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ¼±Åÿµ¿ªÀÌ ¹Ù²î¾ú´õ¶óµµ È­¸éÀ» ´Ù½Ã ±×¸± ÇÊ¿ä´Â ¾ø±â ¶§¹®¿¡ InvalidateRect ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä´Â ¾ø´Ù. ŸÀ̸Ӹ¦ »ç¿ëÇÏ¿© ½ºÅ©·Ñ½ÃÅ°´Â ¹æ¹ýµµ ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù.

¼±Åÿµ¿ªÀ» Åë°·Î ¹ÝÀü½ÃÅ°±â ¶§¹®¿¡ ÁÙ°£ÀÇ »çÀ̳ª ÁÙÀÇ µÞºÎºÐ±îÁö °°ÀÌ ¼±ÅõǴ Á¡ÀÌ Á¶±Ý ´Ù¸£¸ç È­¸éÀ» ´Ù½Ã ±×¸®Áö ¾Ê±â ¶§¹®¿¡ ±ô¹ÚÀÓÀÌ ÀüÇô ¾ø´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì ¾ÆÁ÷ ÃÖÀûÈ­°¡ µÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ½ºÅ©·Ñ ¼Óµµ°¡ ´À¸®Áö¸¸ ½ºÅ©·Ñ¸¸ »¡¸® µÈ´Ù¸é ¹ÝÀü ¼±ÅùýÀº ±²ÀåÈ÷ ºü¸¥ ¼Óµµ·Î µ¿ÀÛÇÑ´Ù. ¿¹¹®ÀÌ ÀüºÎ º¸ÀÏ Á¤µµ·Î À©µµ¿ì¸¦ Å©°Ô ¸¸µé¾î¼­ Å×½ºÆ®Çغ¸¸é ¸¶¿ì½º¸¦ ¾Æ¹«¸® »¡¸® ¿òÁ÷¿©µµ ¼±Åÿµ¿ªÀÌ ¸¶¿ì½º¸¦ Àß µû¶ó´Ù´Ï´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.