¹ÝÀü ¼±ÅùýÀ¸·Î ¼±Åÿµ¿ªÀ» Ç¥½ÃÇÒ ¶§µµ ¼±ÅÃÀ» ¸¸µå´Â ¹æ¹ýÀº °ÅÀÇ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ´Ù½Ã ±×¸®Áö ¾Ê±â ¶§¹®¿¡ ¸¶¿ì½ºÀÇ À̵¿¿¡ ÀÇÇØ Ãß°¡·Î ¼±ÅÃµÈ ¿µ¿ª¸¸ µû·Î ¹ÝÀü½ÃÄÑ¾ß ÇÑ´Ù. ±âÁ¸¿¡ ¼±ÅõǾî ÀÖ´Â ¹ÝÀü ºí·ÏÀ» ±×´ë·Î µÎ°í Ãß°¡ ¿µ¿ª¸¸ ±¸ÇØ ¹ÝÀü½ÃÅ°¸é µÇ´Âµ¥ ÀÌ Ã³¸®´Â °£´ÜÇÑ ¼öÇÐ½Ä Çϳª·Î ÇØ°áµÈ´Ù. ´ÙÀ½ ÇÔ¼ö°¡ Ãß°¡ ¼±Åÿµ¿ªÀ» ¹ÝÀü½ÃÄÑ ÁØ´Ù.
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 ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä´Â ¾ø´Ù. ŸÀ̸Ӹ¦ »ç¿ëÇÏ¿© ½ºÅ©·Ñ½ÃÅ°´Â ¹æ¹ýµµ ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù.
¼±Åÿµ¿ªÀ» Åë°·Î ¹ÝÀü½ÃÅ°±â ¶§¹®¿¡ ÁÙ°£ÀÇ »çÀ̳ª ÁÙÀÇ µÞºÎºÐ±îÁö °°ÀÌ ¼±ÅõǴ Á¡ÀÌ Á¶±Ý ´Ù¸£¸ç ȸéÀ» ´Ù½Ã ±×¸®Áö ¾Ê±â ¶§¹®¿¡ ±ô¹ÚÀÓÀÌ ÀüÇô ¾ø´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì ¾ÆÁ÷ ÃÖÀûÈ°¡ µÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ½ºÅ©·Ñ ¼Óµµ°¡ ´À¸®Áö¸¸ ½ºÅ©·Ñ¸¸ »¡¸® µÈ´Ù¸é ¹ÝÀü ¼±ÅùýÀº ±²ÀåÈ÷ ºü¸¥ ¼Óµµ·Î µ¿ÀÛÇÑ´Ù. ¿¹¹®ÀÌ ÀüºÎ º¸ÀÏ Á¤µµ·Î À©µµ¿ì¸¦ Å©°Ô ¸¸µé¾î¼ Å×½ºÆ®Çغ¸¸é ¸¶¿ì½º¸¦ ¾Æ¹«¸® »¡¸® ¿òÁ÷¿©µµ ¼±Åÿµ¿ªÀÌ ¸¶¿ì½º¸¦ Àß µû¶ó´Ù´Ï´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.