°¡. ºí·Ï Ç¥½Ã ¹æ¹ý

ApiEdit4ÀÇ ¼±Åÿµ¿ª Ç¥½Ã ¹æ¹ýÀº ¾ÆÁÖ ¿ø·ÐÀûÀÌ´Ù. ¸¶¿ì½º³ª Å°º¸µå·Î SelStart¿Í SelEnd°ªÀ» ÀûÀýÈ÷ º¯°æÇÏ°í ¼±Åÿµ¿ª¿¡ Á¶±ÝÀÌ¶óµµ º¯È­°¡ ÀÖÀ¸¸é ÀÛ¾÷¿µ¿ª Àüü¸¦ ¹«È¿È­ÇÏ¿© º¯°æµÈ ºí·ÏÀ» È­¸é¿¡ ´Ù½Ã ±×¸®µµ·Ï ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ÄÚµåµéÀº ¿À·ÎÁö SelStart¿Í SelEnd°ªÀ» Á¶ÀÛÇÏ´Â µ¥¸¸ °ü½ÉÀ» °¡Áö¸ç ºí·ÏÀ» Ç¥½ÃÇÏ´Â ÄÚµå´Â ÀÌ µÎ °ªÀ» ÂüÁ¶ÇÏ¿© È­¸é¿¡ ¼±Åà ºí·ÏÀ» Ãâ·ÂÇϱ⸸ ÇÑ´Ù.

¾î¶»°Ô º¸¸é ´ç¿¬ÇÑ °Í °°Áö¸¸ ÀÌ ¹æ¹ýÀº ¾ÆÁÖ ¿ø½ÃÀûÀÎ ¹æ¹ýÀÌ´Ù. ¼±Åÿµ¿ª¿¡ Á¶±Ý¸¸ º¯È­°¡ »ý°Üµµ È­¸éÀ» Åë°·Î ´Ù½Ã ±×¸®´Â ºñÈ¿À²ÀûÀÎ ¹æ¹ýÀ» »ç¿ëÇÏ°í ÀÖ´Â °ÍÀÌ´Ù. ¼±ÅÃÀ» ÇÏ°í ºí·ÏÀ» Ç¥½ÃÇÏ´Â ¹æ¹ýÀ» ¹Ù²Ù¸é ÀÌ ¹æ¹ýº¸´Ù´Â ÈξÀ ´õ °í¼ÓÀ¸·Î µ¿ÀÛÇÏ´Â ¼±Åà Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ¾Õ¿¡¼­ ½Ç½ÀÇغ» ¼±Åà ¹æ¹ý°ú´Â ÁúÀûÀ¸·Î ´Ù¸¥ ¹æ¹ýÀε¥ ÀÌ ¹æ¹ýµµ ¾Ë¾Æ µÎ¸é ÀÀ¿ëÇÒ ¼ö ÀÖ´Â °÷ÀÌ ¸¹À¸¹Ç·Î ±¸°æÇغ¸µµ·Ï ÇÏÀÚ.

½Ç½ÀÀ» À§ÇØ ApiEdit3 ÇÁ·ÎÁ§Æ®¸¦ º¹»çÇÏ¿© ApiEdit4a ÇÁ·ÎÁ§Æ®¸¦ »õ·Î ÀÛ¼ºÇÑ´Ù. OnCreate¿¡¼­ »ùÇà ÅؽºÆ®·Î ¹öÆÛ¸¦ ÃʱâÈ­ÇÏ´Â °Í°ú GetOffFromXY ÇÔ¼ö, ±×¸®°í ¼±Åà Àü¿ªº¯¼ö¸¦ ¼±¾ðÇÏ°í ÃʱâÈ­ÇÏ´Â µ¥±îÁö´Â ApiEdit4¿Í °°´Ù. ±×·¯³ª ¼±ÅÃÀ» ÇÏ´Â ¹æ¹ý°ú ¼±Åÿµ¿ªÀ» º¸¿©ÁÖ´Â ¹æ¹ýÀº ´Þ¶óÁø´Ù. ½Ã°£ÀÌ ¾ø°Å³ª º°·Î Çʿ並 ´À³¢Áö ¸øÇÑ´Ù¸é ÀÌ ½Ç½ÀÀº ÇÏÁö ¾Ê¾Æµµ ÁÁ´Ù. ¾îµð±îÁö³ª ÀÌ·± ½ÄÀ¸·Îµµ ¼±ÅÃÀ» ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁÖ°íÀÚ ÇÏ´Â °Í»ÓÀÌ´Ù.

¸ÕÀú ¼±ÅÃÀÌ ÀÌ¹Ì µÇ¾î ÀÖ´Â »óȲ¿¡¼­ ÀÌ ¿µ¿ªÀ» È­¸é¿¡ º¸¿©ÁÖ´Â ¹æ¹ýºÎÅÍ ¿¬±¸Çغ¸ÀÚ. È­¸éÀ» ±×¸± ¶§´Â ¼±Åÿµ¿ªÀ» °í·ÁÇÏÁö ¾Ê°í ¿ÏÀüÈ÷ ´Ù ±×¸° ÈÄ ¼±Åÿµ¿ª¸¸ ¹ÝÀü½ÃÄÑ º¸¿©ÁÖ¸é µÈ´Ù. ±×·¯±â À§Çؼ­´Â ¼±Åÿµ¿ªÀ¸·ÎºÎÅÍ ¹ÝÀü½Ãų ¿µ¿ªÀ» ±¸ÇØ¾ß Çϴµ¥ ¼±Åÿµ¿ªÀ̶õ »ç°¢Çü ¿µ¿ªÀÌ ¾Æ´Ï¶ó ´Ù°¢ÇüÀ̹ǷΠRECT ±¸Á¶Ã¼·Î´Â ÀÌ ¿µ¿ªÀ» Ç¥ÇöÇÒ ¼ö ¾ø´Ù. ´Ù°¢ÇüÀ̳ª °î¸é ¶Ç´Â ¶³¾îÁ® ÀÖ´Â ¿µ¿ªÀ» Ç¥ÇöÇÏ·Á¸é ¸®ÀüÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¼±ÅÃÀÇ ½ÃÀÛÁ¡ Sel1°ú ³¡Á¡ Sel2¸¦ Àμö·Î Àü´Þ¹Þ¾Æ ÀÌ ¼±Åÿµ¿ªÀ» Ç¥ÇöÇÏ´Â ¸®Àü °´Ã¼¸¦ ¸¸µé¾îÁØ´Ù.

 

void MakeSelRgn(int Sel1, int Sel2, HRGN &Rgn)

{

     RECT rt1, rt2, rt3;

     HRGN rgn1, rgn2, rgn3;

     int x1,y1,x2,y2;

     int SelFirst, SelSecond;

     RECT crt;

     BOOL OldbLineEnd;

 

     GetClientRect(hWndMain,&crt);

     SelFirst=min(Sel1,Sel2);

     SelSecond=max(Sel1,Sel2);

 

     OldbLineEnd=bLineEnd;

     bLineEnd=TRUE;

     GetXYFromOff(SelFirst,x1,y1);

     GetXYFromOff(SelSecond,x2,y2);

     bLineEnd=OldbLineEnd;

     x1-=xPos;

     y1-=yPos;

     x2-=xPos;

     y2-=yPos;

 

     SetRect(&rt1,0,0,0,0);

     SetRect(&rt2,0,0,0,0);

     SetRect(&rt3,0,0,0,0);

 

     if (SelFirst != SelSecond && y1==y2) {

          SetRect(&rt1,x1,y1,x2,y2+LineHeight);

     }

 

     if (y2-y1 >= LineHeight) {

          SetRect(&rt1,x1,y1,crt.right,y1+LineHeight);

          SetRect(&rt3,crt.left,y2,x2,y2+LineHeight);

     }

 

     if (y2-y1 >= LineHeight*2) {

          SetRect(&rt2,crt.left,y1+LineHeight,crt.right,y2);

     }

 

     rgn1=CreateRectRgnIndirect(&rt1);

     rgn2=CreateRectRgnIndirect(&rt2);

     rgn3=CreateRectRgnIndirect(&rt3);

     Rgn=CreateRectRgn(0,0,0,0);

     CombineRgn(Rgn,rgn1,rgn2,RGN_OR);

     CombineRgn(Rgn,Rgn,rgn3,RGN_OR);

     DeleteObject(rgn1);

     DeleteObject(rgn2);

     DeleteObject(rgn3);

}

 

¼±Åÿµ¿ªÀÇ µÎ ÁöÁ¡ÀÎ Sel1°ú Sel2´Â SelFirst¿Í SelSecond·Î Á¤±ÔÈ­µÇ¸ç ÀÌ µÎ ÁöÁ¡ÀÇ ÁÂÇ¥´Â x1, y1, x2, y2¿¡ °¢°¢ Á¶»çµÈ´Ù. À̶§´Â ÀÚµ¿°³ÇàµÈ ÁÙÀÇ Ã³À½°ú ³¡À» ±»ÀÌ ±¸ºÐÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î bLineEnd´Â ¹«Á¶°Ç TRUE(FALSE·Î Çصµ ºñ½ÁÇÏ´Ù)·Î ÇÏ¿© ÁÂÇ¥¸¦ °è»êÇß´Ù. ÀÌ ÁÂÇ¥¿Í ¼±Åÿµ¿ªÀÇ ¹üÀ§¿¡ µû¶ó ¼±Åà ¸®ÀüÀÌ ¸¸µé¾îÁø´Ù. ¼±Åÿµ¿ªÀº ÇÑ ÁÙ, µÎ ÁÙ, ¼¼ ÁÙ ÀÌ»óÀÎ °æ¿ì·Î °¢°¢ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.

ÇÑ ÁÙ¸¸ ¼±ÅõǾî ÀÖ´Â °æ¿ì ¼±Åÿµ¿ªÀº »ç°¢ ¿µ¿ª Çϳª·Î Ç¥ÇöµÈ´Ù. µÎ ÁÙÀÌ ¼±ÅõǾî ÀÖÀ¸¸é À­ÁÙ°ú ¾Æ·¡ÁÙ µÎ °³ÀÇ »ç°¢ ¿µ¿ªÀ¸·Î Ç¥ÇöµÈ´Ù. ¼¼ ÁÙ ÀÌ»óÀÎ °æ¿ì´Â ¼±Åà ½ÃÀÛÁ¡ÀÌ ÀÖ´Â ÁÙÀÇ »ç°¢Çü°ú ¼±Åà ³¡Á¡ÀÌ ÀÖ´Â ÁÙÀÇ »ç°¢Çü, ±×¸®°í ±× »çÀÌ¿¡ ÀÖ´Â »ç°¢Çü ¼ÂÀÌ ¸ð¿©¾ß ¼±Åÿµ¿ªÀ» Á¦´ë·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

MakeSelRgn ÇÔ¼ö´Â ¼¼ °³ÀÇ »ç°¢¿µ¿ª rt1, rt2, rt3¸¦ ¼±¾ðÇÏ°í ¼±Åà À¯Çü¿¡ µû¶ó ºí·ÏÀ» ±¸¼ºÇÏ´Â ÀÛÀº »ç°¢ ¿µ¿ªÀ» ±¸ÇÑ´Ù. ±×¸®°í ÀÌ·¸°Ô ±¸ÇØÁø ¼¼ °³ÀÇ »ç°¢¿µ¿ªÀ» ¸ðµÎ ÇÕÃÄ ÇϳªÀÇ ¸®ÀüÀ¸·Î ¸¸µé¸é ÀÌ ¸®ÀüÀÌ ¹Ù·Î ¼±Åÿµ¿ªÀÌ µÇ´Â °ÍÀÌ´Ù. SelStart¿Í SelEnd·Î ¼±Åà ¸®ÀüÀ» ¸¸µé¾î È­¸é¿¡ Ç¥½ÃÇÏ´Â ÀÏÀº ´ÙÀ½ ÇÔ¼ö°¡ ÇÑ´Ù.

 

void InvertSelect(HDC hdc)

{

     HRGN SelRgn;

     MakeSelRgn(SelStart,SelEnd,SelRgn);

     InvertRgn(hdc,SelRgn);

     DeleteObject(SelRgn);

}

 

MakeSelRgn ÇÔ¼ö·Î SelStart¿Í SelEnd »çÀÌÀÇ ¸®ÀüÀ» ±¸ÇÑ ÈÄ InvertRgn API ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÀÌ ¿µ¿ªÀ» ¹ÝÀü½ÃÅ°´Â °ÍÀÌ´Ù. OnPaint¿¡¼­´Â ¸ðµç ÅؽºÆ®¸¦ ´Ù Ãâ·ÂÇÑ ÈÄ¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù.

 

void OnPaint(HWND hWnd)

{

     ....

    if (SelStart != SelEnd) {

        InvertSelect(hdc);

    }

     EndPaint(hWnd,&ps);

}

 

ÅؽºÆ®¸¦ Ãâ·ÂÇÒ ¶§´Â ¼±Åÿµ¿ªÀ» ÀüÇô ½Å°æ¾²Áö ¾ÊÀ¸¸ç ÅؽºÆ®°¡ Á¤»óÀûÀ¸·Î Ãâ·ÂµÈ ÈÄ InvertSelect ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¼±Åÿµ¿ªÀÌ ¹ÝÀüµÇ¾î º¸ÀÏ °ÍÀÌ´Ù.