³ª. Æ÷¸ËÆÿµ¿ª

¸¶ÁøÀÌ Ãß°¡µÇ¸é À©µµ¿ìÀÇ ÀÛ¾÷¿µ¿ª ÀϺδ ¸¶Áø¿µ¿ªÀ» À§ÇØ ÇÒ´çµÇ¾î¾ß ÇÑ´Ù. À̶§ ¸¶ÁøÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ¿µ¿ª, ±×·¯´Ï±î ½ÇÁ¦·Î ÅؽºÆ®¸¦ º¸¿©ÁÖ°í ÆíÁý¿¡ »ç¿ëÇÒ ¿µ¿ªÀ» Æ÷¸ËÆÿµ¿ª(Formatting Area)À̶ó°í ÇÑ´Ù. Æ÷¸ËÆÿµ¿ªÀº Á¤·Ä, Ãâ·Â, ¸¶¿ì½ºµ¿ÀÛÀÌ ÀÌ·ç¾îÁö´Â ¿µ¿ªÀ̹ǷΠ¸ðµç ÆíÁýÄÚµå´Â ÀÌ ¿µ¿ª ¾È¿¡¼­ µ¿ÀÛÇØ¾ß ÇÑ´Ù.

ApiEdit6±îÁö´Â ÀÛ¾÷¿µ¿ª°ú Æ÷¸ËÆÿµ¿ªÀÌ ¿ÏÀüÈ÷ ÀÏÄ¡ÇÏ¿´±â ¶§¹®¿¡ GetClientRect ÇÔ¼ö·Î ±¸ÇÑ ÀÛ¾÷¿µ¿ªÀ» ±×´ë·Î Æ÷¸ËÆÿµ¿ªÀ¸·Î »ç¿ëÇß´Ù. ÇÏÁö¸¸ ¸¶ÁøÀÌ Ãß°¡µÇ¸é ÀÛ¾÷¿µ¿ª¿¡¼­ ¸¶ÁøÀÇ Æø¸¸Å­ »©ÁØ ¿µ¿ª¸¸ Æ÷¸ËÆÿµ¿ªÀÌ µÈ´Ù. ÀÌ ¿µ¿ªÀº ÆíÁýÄÚµåµéÀÌ ¼ö½Ã·Î Âü°íÇØ¾ß ÇϹǷΠÀü¿ªº¯¼ö·Î °ü¸®ÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ´ÙÀ½ ³× °³ÀÇ Àü¿ªº¯¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

int MarginWidth;

COLORREF MarColor1, MarColor2;

RECT frt;

 

MarginWidth º¯¼ö´Â À̸§ ±×´ë·Î ¸¶ÁøÀÇ ÆøÀÌ¸ç µÎ °³ÀÇ »ö»ó º¯¼ö´Â ¸¶ÁøÀ» ±×¸®´Â µ¥ »ç¿ëÇÒ »ö»ó°ªÀÌ´Ù. frt°¡ ¹Ù·Î Æ÷¸ËÆÿµ¿ªÀε¥ ÀÛ¾÷¿µ¿ª¿¡¼­ ¸¶ÁøÀÇ ÆøÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ¿µ¿ªÀ» Â÷ÁöÇÏ°Ô µÈ´Ù. Æ÷¸ËÆÿµ¿ªÀ» ÃʱâÈ­ÇÏ°í °»½ÅÇÏ´Â ÀÏÀº ÀÛ¾÷¿µ¿ªÀÇ Å©±â°¡ º¯°æµÇ´Â ½ÃÁ¡ÀÎ OnSize¿¡¼­ ÇÑ´Ù.

 

void OnSize(HWND hWnd, UINT state, int cx, int cy)

{

     if (state != SIZE_MINIMIZED) {

        GetClientRect(hWnd,&frt);

        frt.left += MarginWidth;

     ....

}

 

GetClientRect ÇÔ¼ö·Î ÀÛ¾÷¿µ¿ªÀ» ¸ÕÀú ±¸ÇÏ°í ¸¶ÁøÀÇ Æø¸¸Å­ ¿ÞÂÊ º¯À» ´õÇß´Ù. ¸¶ÁøÀº ¿À¸¥ÂÊ¿¡ µÑ ¼öµµ ÀÖ°í ¿ÞÂÊ¿¡ µÑ ¼öµµ Àִµ¥ º¸Åë ¿ÞÂÊ¿¡ µÎ¹Ç·Î frt.left¸¦ ¸¶ÁøÆø¸¸Å­ ¿À¸¥ÂÊÀ¸·Î À̵¿½ÃÅ°¸é µÈ´Ù. OnCreate¿¡¼­´Â ¸¶ÁøÆøÀ» ÃʱâÈ­ÇÑ´Ù.

 

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     ....

     MarginWidth=25;

     MarColor1=RGB(192,192,192);

     MarColor2=RGB(160,160,160);

     SendMessage(hWnd,WM_SIZE,0,0);

 

     return TRUE;

}

 

MarginWidth´Â 25Çȼ¿·Î ÃʱâÈ­ÇßÀ¸¸ç »ö»óÀº ȸ»ö °èÅëÀ¸·Î µÎ °³¸¦ Á¤ÀÇÇß´Ù. ¸¶ÁøÆøÀ» Á¤ÇÑ ÈÄ °ð¹Ù·Î WM_SIZE ¸Þ½ÃÁö¸¦ º¸³» frtµµ °°ÀÌ ÃʱâÈ­Çϵµ·Ï ÇÏ¿´´Ù. ¿Ö ÀÌ ½ÃÁ¡¿¡¼­ OnSizeÈ£ÃâÀÌ ÇÊ¿äÇÑ°¡ Çϸé ÃʱâÈ­ ÇÔ¼öÀÎ UpdateLineInfo, UpdateScrollInfo°¡ frt¸¦ ¸ÕÀú »ç¿ëÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ OnCreate°¡ ³¡³ª±â Àü¿¡ OnSize¸¦ È£ÃâÇØ¾ß Çϴµ¥ OnSize¿¡¼­´Â frt ÃʱâÈ­»Ó¸¸ ¾Æ´Ï¶ó UpdateLineInfo, UpdateScrollInfo ÇÔ¼öµµ °°ÀÌ È£ÃâÇÑ´Ù. ÀÌÁ¦ OnCreate¿¡¼­´Â ÀÌ µÎ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø¾îÁ³À¸¹Ç·Î »èÁ¦Çϵµ·Ï ÇÏÀÚ.

Æ÷¸ËÆÿµ¿ªÀÌ ÃʱâÈ­µÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ ¸ðµç ÆíÁýÄÚµå´Â ÀÛ¾÷¿µ¿ª ´ë½Å frt¸¦ ´ë½Å »ç¿ëÇØ¾ß ÇÑ´Ù. frt¿¡´Â ¸¶ÁøÆøÀÌ ÀÌ¹Ì °è»êµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¿µ¿ª¸¸ Âü°íÇϸé ÆíÁýÄÚµå´Â ¸¶ÁøÀÇ Á¸Àç¿¡ ´ëÇØ Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. ÀÛ¾÷ ´ë»ó ÇÔ¼ö´Â ´ÙÀ½ 9°³ÀÌ´Ù.

 

OnKey, OnPaint, OnHScroll, OnVScroll, OnMouseMove,

GetLine, SetCaret, UpdateScrollInfo, Invalidate

 

¼öÁ¤ÇØ¾ß ÇÒ ÇÔ¼ö°¡ ¸¹±â´Â ÇÏÁö¸¸ ÀÛ¾÷ ÀýÂ÷´Â ¾ÆÁÖ °£´ÜÇÏ´Ù. ¸ðµç ÇÔ¼öÀÇ RECT crt; ¼±¾ð¹®°ú GetClientRect ÇÔ¼ö È£Ãâ¹®À» »èÁ¦ÇÏ°í crt´Â ¸ðÁ¶¸® frt·Î ¹Ù²Ù¸é µÈ´Ù. ã±â, ¹Ù²Ù±â ±â´ÉÀ» »ç¿ëÇϸé ÇÑ ¹ø¿¡ Äڵ带 ¼öÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ·± ÀÛ¾÷ÀÌ¾ß ¾ÆÁÖ ½¬¿î ÆíÀÌ´Ù. ÀÌ ÀÛ¾÷ ÈÄ¿¡ crt¶ó´Â º¯¼ö´Â ¼Ò½º Àüü¸¦ ÅëƲ¾î Çϳªµµ ¾ø¾î¾ß Çϸç GetClientRect È£Ãâ¹®Àº OnSize¿¡ Çϳª¸¸ ÀÖ¾î¾ß ÇÑ´Ù. ¸¶ÁøÀ» ¸¸µé¾úÀ¸´Ï È­¸é¿¡ º¸À̵µ·Ï Ãâ·ÂÇغ¸ÀÚ. OnPaint¸¦ ¶Ç ÇÑ ¹ø ´ëÆø ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void OnPaint(HWND hWnd)

{

     HDC hdc, hMemDC;

     PAINTSTRUCT ps;

     int l;

     int s,e,t;

     HBRUSH hBrush;

     HBITMAP OldBitmap;

     RECT lrt;

    HBRUSH hMarBrush;

    RECT mrt;

    HPEN hMarPen,OldPen;

 

     hdc=BeginPaint(hWnd,&ps);

 

     t=yPos/LineHeight;

     s=(yPos+ps.rcPaint.top)/LineHeight;

     e=(yPos+ps.rcPaint.bottom-1)/LineHeight;

     e=min(e,TotalLine-1);

 

     hMemDC=CreateCompatibleDC(hdc);

     if (hBit == NULL) {

          hBit=CreateCompatibleBitmap(hdc,frt.right,LineHeight);

     }

     OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);

 

     hBrush=GetSysColorBrush(COLOR_WINDOW);

     SetRect(&lrt,MarginWidth-1,0,frt.right,LineHeight);

 

     for (l=s;l<=e;l++) {

          FillRect(hMemDC,&lrt,hBrush);

          DrawLine(hMemDC,l);

          BitBlt(hdc,0,(l-t)*LineHeight,frt.right,(l-t)*LineHeight+LineHeight,

              hMemDC,0,0,SRCCOPY);

     }

 

    if (MarginWidth != 0) {

        hMarBrush=CreateSolidBrush(MarColor1);

        SetRect(&mrt,0,(l-t)*LineHeight,MarginWidth-1,frt.bottom);

        FillRect(hdc,&mrt,hMarBrush);

        hMarPen=CreatePen(PS_SOLID,1,MarColor2);

        OldPen=(HPEN)SelectObject(hdc,hMarPen);

        MoveToEx(hdc,MarginWidth-2,(l-t)*LineHeight,NULL);

        LineTo(hdc,MarginWidth-2,frt.bottom);

 

        SelectObject(hdc,OldPen);

        DeleteObject(hMarPen);

        DeleteObject(hMarBrush);

    }

     SetRect(&lrt,MarginWidth-1,(l-t)*LineHeight,frt.right,frt.bottom);

     FillRect(hdc,&lrt,hBrush);

 

     DeleteObject(hBrush);

     SelectObject(hMemDC,OldBitmap);

     DeleteDC(hMemDC);

     EndPaint(hWnd,&ps);

}

 

¸î °³ÀÇ Áö¿ªº¯¼ö°¡ Ãß°¡µÇ¾ú´Âµ¥ hMarBrush, hMarPenÀº ¸¶Áø ä»ö¿¡ »ç¿ëÇÒ ºê·¯½Ã¿Í ÆæÀÇ ÇÚµéÀ̸ç mrt´Â ¸¶ÁøÀÇ ¿µ¿ªÀÌ´Ù. ÅؽºÆ®°¡ Ãâ·ÂµÇ¾î¾ß ÇÒ ¿µ¿ªÀÎ lrtÀÇ ¿ÞÂÊ ÁÂÇ¥´Â ¸¶ÁøÀÇ Æø°ú °°¾ÆÁ®¾ß Çϳª 1Çȼ¿¸¸Å­ ¿©À¯¸¦ µÎ¾î ¸¶Áø°ú ÅؽºÆ®°¡ ³Ê¹« ºÙ¾î º¸ÀÌÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ÀÛ¾÷¿µ¿ªÀÇ ¿ÞÂÊ¿¡ ¸¶ÁøÆø¸¸Å­ ÀÚ¸®°¡ ºñ¿öÁö°í ±× ¿À¸¥ÂÊ¿¡ ÅؽºÆ®°¡ Ãâ·ÂµÈ´Ù. °¢ ÁÙ¿¡ ´ëÇØ DrawLineÀ» È£ÃâÇϸé ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼­ ¸¶Áø°ú ÅؽºÆ®¸¦ ºñÆ®¸Ê¿¡ °°ÀÌ Ãâ·ÂÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.

¸ðµç ÁÙÀÇ Ãâ·ÂÀÌ ³¡³­ ÈÄ ¾Æ·¡ÂÊ ¿©¹é¿¡ ´ëÇؼ­µµ ¸¶ÁøÀ» Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. ¸¶ÁøÆø¿¡¼­ 2Çȼ¿À» »«¸¸Å­ MarColor1·Î ä¿ì°í ±× ¿À¸¥ÂÊ¿¡ MarColor2·Î ÇÑ ÁÙ ¼±À» ±×¾î ÁÖ¾ú´Ù. ´Ü¼øÇÑ ±×·¡ÇÈ Ãâ·Â¹®ÀÏ »ÓÀÌ´Ù. °¢ ÁÙÀÇ ¸¶Áø¿µ¿ªÀº DrawLine ÇÔ¼ö°¡ ºñÆ®¸Ê¿¡ ±×·Á ÁØ´Ù.

 

int DrawLine(HDC hdc, int Line)

{

    HBRUSH hMarBrush;

    HPEN hMarPen,OldPen;

    RECT mrt;

     ....

          DrawSegment(hdc,x,0,nowoff,len,

              (nowoff+len==pLine[Line].End),fore,back);

 

          nowoff+=len;

          if (nowoff == pLine[Line].End)

           break;

     }

 

    if (MarginWidth != 0) {

        hMarBrush=CreateSolidBrush(MarColor1);

        SetRect(&mrt,0,0,MarginWidth-1,LineHeight);

        FillRect(hdc,&mrt,hMarBrush);

        hMarPen=CreatePen(PS_SOLID,1,MarColor2);

        OldPen=(HPEN)SelectObject(hdc,hMarPen);

        MoveToEx(hdc,MarginWidth-2,0,NULL);

        LineTo(hdc,MarginWidth-2,LineHeight);

 

        SelectObject(hdc,OldPen);

        DeleteObject(hMarPen);

        DeleteObject(hMarBrush);

    }

    return 1;

}

 

ÁÙ ³¡À» ¸¸³µÀ» ¶§ ±×³É ¸®ÅÏÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÏ´Ü ·çÇÁ¸¦ ºüÁ® ³ª¿Í ¸¶ÁøÀ» ±×¸° ÈÄ ¸®ÅÏÇØ¾ß ÇÑ´Ù. ¸¶ÁøÀº ÅؽºÆ®¸¦ Ãâ·ÂÇϱâ Àü¿¡ ±×·Áµµ µÇ°í ÅؽºÆ®¸¦ ¸ÕÀú Ãâ·ÂÇÑ ÈÄ ±×·Áµµ µÇ´Âµ¥ ¼öÆòÀ¸·Î ½ºÅ©·ÑµÉ ¶§ ÅؽºÆ®·Î ÀÎÇØ ¸¶Áø¿µ¿ªÀÌ Áö¿öÁö´Â °ÍÀ» µû·Î ó¸®ÇÏÁö ¾Ê±â À§ÇØ ÅؽºÆ®¸¦ ¿ÏÀüÈ÷ Ãâ·ÂÇÑ ÈÄ ¸¶ÁøÀ» µû·Î ±×¸®´Â °ÍÀÌ ÁÁ´Ù. ÅؽºÆ®°¡ ¼³»ç ¸¶Áø¿µ¿ª¿¡ Ãâ·ÂµÇ´õ¶óµµ ¸¶ÁøÀ» ´Ù½Ã ±×¸®¹Ç·Î Ç×»ó ¸¶ÁøÀÌ ÅؽºÆ®º¸´Ù ´õ À§¿¡ ÀÖ°Ô µÈ´Ù. DrawLineÀÇ ¸¶Áø Ãâ·Â¹®µµ OnPaint¿¡¼­¿Í °ÅÀÇ µ¿ÀÏÇÏ´Ù. ¿©±â±îÁö ¼öÁ¤ÇÑ ÈÄ ½ÇÇàÇغ¸ÀÚ.

¿ÞÂÊ¿¡ ¿¶Àº ȸ»öÀÇ ¸¶ÁøÀÌ ³ªÅ¸³ª±â´Â Çϴµ¥ ¾ÆÁ÷ ³ª¸ÓÁö ÄÚµåµéÀÌ ¼öÁ¤µÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¹®ÀåÀÌ ¸¶Áø¿¡ ÀÇÇØ °¡·ÁÁö°í ij·µÀÌ ¸¶Áø ¾È¿¡¼­ ³î°í ÀÖ´Ù. Á¤·ÄÇÔ¼ö¿Í Ãâ·ÂÇÔ¼ö µîÀÌ ¸¶ÁøÀ» Á¦´ë·Î ÀνÄÇϵµ·Ï ÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù.