1.â ºÐÇÒ

°¡. ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ

¾ÕÀå¿¡¼­ Èûµé°Ô °´Ã¼¸¦ ºÐÇÒÇØ ³õ¾ÒÀ¸´Ï ÀÌÁ¦ °´Ã¼µéÀ» Àß ¿ä¸®Çؼ­ ÆíÁýâÀ» ºÐÇÒÇØ º¸ÀÚ. ÀÌ ½Ç½ÀÀ» ¸¶Ä¡°í ³ª¸é ÇÑ ÆÄÀÏÀÇ µÎ °÷À» µ¿½Ã¿¡ º¸¸é¼­ ÆíÁýÇÒ ¼ö ÀÖ´Ù. ´Ã ±×·¡¿ÔµíÀÌ Dangeun14¸¦ º¹»çÇÏ¿© »õ·Î¿î Dangeun15 ÇÁ·ÎÁ§Æ®¸¦ »õ·Î ÀÛ¼ºÇÏ°í ½Ç½ÀÀ» ½ÃÀÛÇÑ´Ù. ÀÌ ½Ç½Àµµ ¾ÕÀå¿¡¼­ ÀÌ¹Ì ÇØ º¸¾Ò´ø SplitView ¿¹Á¦¸¦ µû¶ó Ç쵂 ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡ Àû¿ëÇØ¾ß ÇϹǷΠÁ¶±Ý ´õ ¾çÀÌ ¸¹°í »ç¼ÒÇÑ ¹®Á¦±îÁöµµ °í·ÁÇØ¾ß ÇÑ´Ù´Â Á¡¿¡¼­ ´Ù¼Ò ±î´Ù·Ó´Ù.

â ºÐÇÒÀº ÄÁÆ®·ÑÀÇ °íÀ¯ ±â´ÉÀ̹ǷΠ¿ÜºÎÀÇ µµ¿òÀÌ ¾ø¾îµµ ÄÁÆ®·ÑÀÌ ½º½º·Î ºÐÇÒÀ» ½ÃÀÛÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ â ºÐÇÒÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Â À¯Àú ÀÎÅÍÆäÀ̽ºµµ ÄÁÆ®·ÑÀÌ °¡Áö´Âµ¥ ÇÁ·¹ÀÓÀº ºä¿¡ ¿ÏÀüÈ÷ °¡·ÁÁ® Àֱ⠶§¹®¿¡ ºÐÇÒ ¸í·ÉÀ» À§ÇÑ È­¸é ¿µ¿ªÀ» °¡Áú ¼ö ¾ø´Ù. ±×·¡¼­ ÃÖÃÊÀÇ ºÐÇÒ ¸í·ÉÀ» À§ÇÑ À¯Àú ÀÎÅÍÆäÀ̽º¸¦ ºä°¡ Á¦°øÇØ¾ß ÇÑ´Ù.

ºäÀÇ ½ºÅ©·Ñ ¹Ù À§¿¡ Á¶±×¸¸ »ç°¢ ¹Ú½º¸¦ ¸¸µé°í »ç¿ëÀÚ°¡ ÀÌ »ç°¢ ¹Ú½º¸¦ µå·¡±×ÇÏ¸é ºÐÇÒÀ» ½ÃÀÛÇÒ °ÍÀÌ´Ù. ÀÌ ¹Ú½º¸¦ ½ºÇø´ ¹Ú½º(Split Box)¶ó°í Çϴµ¥ Ç×»ó È­¸é¿¡ º¸À̱⠶§¹®¿¡ Á÷°üÀûÀ̸ç ÆíÁýâÀ» ºÐÇÒÇÏ´Â °¡Àå Ç¥ÁØÀûÀÎ ¹æ¹ýÀÌ´Ù. ºñÁÖ¾ó ½ºÆ©µð¿ÀÀÇ ÆíÁý±â¸¦ º¸¸é ¼öÁ÷ ½ºÅ©·Ñ ¹Ù À§¿¡ Á¶±×¸¸ »ç°¢ ¹Ú½º°¡ Àִµ¥ ÀÌ°ÍÀÌ ¹Ù·Î ½ºÇø´ ¹Ú½ºÀÌ´Ù. ÀÌ ºÎºÐÀ» ¸¶¿ì½º·Î µå·¡±×ÇÏ¸é ¼öÁ÷À¸·Î ÆíÁýâÀÌ ºÐÇҵȴÙ.

½ºÅ©·Ñ ¹Ù À§¿¡ ½ºÇø´ ¹Ú½º¸¦ ¹èÄ¡ÇÏ·Á¸é Ç¥ÁØ ½ºÅ©·Ñ ¹Ù´Â ¾µ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé Ç¥ÁØ ½ºÅ©·Ñ ¹Ù°¡ Â÷ÁöÇÏ´Â ¿µ¿ªÀº ¾Æ¿¹ ÀÛ¾÷ ¿µ¿ª¿¡¼­ Á¦¿ÜµÇ¾î ¹ö¸®±â ¶§¹®¿¡ À©µµ¿ì°¡ ÀÌ ¿µ¿ªÀ» °Çµå¸± ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ ¸¶À½´ë·Î ÇÁ·Î±×·¡¹ÖÇÒ ¼ö ÀÖ´Â ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀ» ´ë½Å »ç¿ëÇØ¾ß ÇÑ´Ù. ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀº ¹öÆ°À̳ª ¿¡µðƮó·³ À§Ä¡³ª Å©±â¸¦ ¸¶À½´ë·Î Á¶ÀÛÇÒ ¼ö ÀÖÀ¸¹Ç·Î ½ºÅ©·Ñ ¹Ù À§¿¡ ½ºÇø´ ¹Ú½º¸¦ À§ÇÑ ¿©¹éÀ» ¸¸µé ¼ö ÀÖ´Ù. ApiEdit.h¿¡ ´ÙÀ½ »ó¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

#define AEID_VERTSCROLL 1

#define AEID_HORZSCROLL 2

#define AEID_BTNSETTING 3

#define SPLITWIDTH 8

#define SBW GetSystemMetrics(SM_CXHSCROLL)

 

½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ID¿Í ½ºÇø´ ¹Ú½ºÀÇ ÆøÀ» Á¤ÀÇÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù. SBW´Â ½ºÅ©·Ñ ¹ÙÀÇ ÆøÀ» Á¤ÀÇÇÏ´Â ½Ã½ºÅÛ ¸ÞÆ®¸¯½º °ªÀ» ±¸ÇÏ´Â ¸ÅÅ©·Î ÇÔ¼öÀε¥ ÄÁÆ®·Ñ ¹èÄ¡¿¡ ÀÚÁÖ »ç¿ëµÈ´Ù. ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¸ÅÅ©·Îº¸´Ù Àü¿ª º¯¼ö·Î Á¤ÀÇÇÏ°í OnCreate¿¡¼­ µü Çѹø¸¸ Á¶»çÇÏ¸é ¾à°£ÀÇ ¼Óµµ Çâ»óÀ» ±â´ëÇÒ ¼ö ÀÖ°ÚÁö¸¸ ºü¸¥ ÇÔ¼öÀ̹ǷΠ±×³É ¸ÅÅ©·Î·Î Á¤ÀÇÇß´Ù. ÀÌ °ªµéÀº ºä¿¡¼­ »ç¿ëÇÏÁö¸¸ ¸ðµç ºä°¡ ´Ù ÂüÁ¶ÇØ¾ß ÇϹǷΠÇÁ·¹ÀÓÀÇ Çì´õ ÆÄÀÏ¿¡ »ó¼ö¸¦ ¼±¾ðÇÏ¿´´Ù. ºäÀÇ Çì´õ ÆÄÀÏÀÎ ApiEditText.h¿¡´Â °ü·Ã ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

class CApiEditText : public CWindow

{

protected:

     ....

     BOOL bVertSplit;

     BOOL bHorzSplit;

     HWND hVertScroll;

     HWND hHorzScroll;

     HWND hBtnSetting;

 

public:

     ....

     virtual BOOL GetVertSplit() { return bVertSplit; }

     virtual void SetVertSplit(BOOL aValue);

     virtual BOOL GetHorzSplit() { return bHorzSplit; }

     virtual void SetHorzSplit(BOOL aValue);

 

bVertSplit, bHorzSplitÀº ¼öÆò, ¼öÁ÷ ºÐÇÒÀ» Çã¿ëÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÏ´Â ¿É¼Ç º¯¼öÀ̸ç h*´Â ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ À©µµ¿ì ÇÚµéÀÌ´Ù. hBtnSettingÀº µÎ ½ºÅ©·Ñ ¹ÙÀÇ ¾Æ·¡¿Í ¿À¸¥ÂÊ ¸ð¼­¸®ÀÇ ³²´Â ¿µ¿ª¿¡ ¹èÄ¡µÇ´Â ¹öÆ° ÄÁÆ®·ÑÀε¥ ´çÀåÀº ¿ëµµ°¡ Á¤ÇØÁ® ÀÖÁö ¾Ê´Ù. ÇöÀç´Â ºó ÀÚ¸®¸¦ ä¿ì±â¸¸ Çϴµ¥ Â÷ÈÄ¿¡ ¾µ ÀÏÀÌ ÀÖÀ» °ÍÀÌ´Ù. OnCreate¿¡¼­ µÎ °³ÀÇ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ°ú ÇϳªÀÇ ¸í·É ¹öÆ°À» »ý¼ºÇϴµ¥ À§Ä¡¿Í Å©±â´Â ½ÇÇàÁß¿¡ °è»êµÇ¹Ç·Î ¸ðµÎ 0À¸·Î ÁØ´Ù. ¶ÇÇÑ OnCreate¿¡¼­ ºÐÇÒ Çã¿ë Ç÷¡±×¸¦ ÃʱâÈ­Çϸç SetÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

BOOL CApiEditText::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     ....

    hVertScroll=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_VERT,

        0,0,0,0,hWnd,(HMENU)AEID_VERTSCROLL,GetModuleHandle(NULL),NULL);

    hHorzScroll=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,

        0,0,0,0,hWnd,(HMENU)AEID_HORZSCROLL,GetModuleHandle(NULL),NULL);

    hBtnSetting=CreateWindow("button","",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

        0,0,0,0,hWnd,(HMENU)AEID_BTNSETTING,GetModuleHandle(NULL),NULL);

 

     SetDefaultSetting();

     InitView();

    bVertSplit=TRUE;

    bHorzSplit=TRUE;

 

     return TRUE;

}

 

void CApiEditText::SetVertSplit(BOOL aValue)

{

     if (bVertSplit!=aValue) {

          bVertSplit=aValue;

          SendMessage(hWnd,WM_SIZE,0,0);

     }

}

 

void CApiEditText::SetHorzSplit(BOOL aValue)

{

     if (bHorzSplit!=aValue) {

          bHorzSplit=aValue;

          SendMessage(hWnd,WM_SIZE,0,0);

     }

}

 

bVertSplit, bHorzSplitÀ» ¸ðµÎ TRUE·Î ÃʱâÈ­ÇßÀ¸¹Ç·Î ¾çÂÊ ¹æÇâÀ¸·Î ¸ðµÎ ºÐÇÒ °¡´ÉÇÏ´Ù. ÀÌ µÎ º¯¼ö´Â »ý¼ºµÉ ¶§ Çѹø¸¸ ÃʱâÈ­ÇØ¾ß ÇϹǷΠOnCreate¿¡ Äڵ带 ÀÛ¼ºÇϴµ¥ InitView¿¡¼­ ÃʱâÈ­ÇÏ´Â °ÍÀÌ ¾Æ´ÔÀ» ÁÖÀÇÇÏÀÚ. InitView ÇÔ¼ö´Â ÀÌ¹Ì ºÐÇÒ µÇ¾î ÀÖ´Â »óÅ¿¡¼­µµ È£ÃâµÉ ¼ö ÀÖÀ¸¹Ç·Î À̶§´Â ºÐÇÒ Çã¿ë ¿©ºÎ¸¦ ¸®¼ÂÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. OnCreate´Â µü Çѹø¸¸ ÇØ¾ß ÇÒ ÃʱâÈ­¸¦ ´ã´çÇϸç InitView´Â ºä¸¦ ÀçÃʱâÈ­ÇÑ´Ù´Â Â÷ÀÌ°¡ ÀÖ´Ù.

Set ÇÔ¼öµéÀº Àμö·Î Àü´ÞµÈ aValue°ªÀ» bHorz(Vert)Split ¸â¹ö º¯¼ö¿¡ ´ëÀÔÇ쵂 Áߺ¹ ó¸® ¹æÁö¸¦ À§ÇØ ÇöÀç°ªÀÌ »õ°ª°ú °°À¸¸é ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â´Ù. ÀÌ °ªÀÌ º¯°æµÇ¸é ½ºÇø´ ¹Ú½º¸¦ ¹èÄ¡Çϰųª »èÁ¦ÇØ¾ß ÇϹǷΠWM_SIZE ¸Þ½ÃÁö¸¦ º¸³» ºä¸¦ Àç¹èÄ¡ÇÑ´Ù. OnSize´Â ºÐÇÒ °¡´É Ç÷¡±×ÀÇ °ª¿¡ µû¶ó ½ºÅ©·Ñ ¹Ù¸¦ ÀûÀýÈ÷ ¹èÄ¡ÇÑ´Ù.

 

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

{

    RECT crt;

 

     if (state != SIZE_MINIMIZED) {

        GetClientRect(hWnd,&crt);

        frt=crt;

        // ½ºÅ©·Ñ ¹Ù ¿µ¿ªÀº ÆíÁý ¿µ¿ª¿¡¼­ Á¦¿ÜµÈ´Ù.

        frt.right-=SBW;

        frt.bottom-=SBW;

          frt.left += MarginWidth;

        // ºÐÇÒ °¡´ÉÇÏ¸é ½ºÅ©·Ñ ¹Ù À§, ¿ÞÂÊ¿¡ ½ºÇø´ ¹Ú½º¸¦ À§ÇÑ ¿©¹éÀ» ³²±ä´Ù.

        if (bVertSplit) {

           MoveWindow(hVertScroll,crt.right-SBW,SPLITWIDTH,SBW,

               crt.bottom-SBW-SPLITWIDTH,TRUE);

        } else {

           MoveWindow(hVertScroll,crt.right-SBW,0,SBW,crt.bottom-SBW,TRUE);

        }

        if (bHorzSplit) {

           MoveWindow(hHorzScroll,SPLITWIDTH,crt.bottom-SBW,

               crt.right-SBW-SPLITWIDTH,SBW,TRUE);

        } else {

           MoveWindow(hHorzScroll,0,crt.bottom-SBW,crt.right-SBW,SBW,TRUE);

        }

        MoveWindow(hBtnSetting,crt.right-SBW,crt.bottom-SBW,SBW,SBW,TRUE);

 

          if (nWrap) {

          ....

 

¼öÆò, ¼öÁ÷ ½ºÅ©·Ñ ¹Ù¸¦ ÀÛ¾÷ ¿µ¿ªÀÇ ¿À¸¥ÂÊ°ú ¾Æ·¡ÂÊ¿¡ ¹èÄ¡ÇÑ´Ù. bVertSplit, bHorzSplit º¯¼ö°¡ TRUEÀÌ¸é ½ºÅ©·Ñ ¹Ù À§, ¿ÞÂÊ¿¡ SPLITWIDTH¸¸Å­ ¿©¹éÀ» ³²°ÜµÎ°í ±×·¸Áö ¾ÊÀ¸¸é ½ºÅ©·Ñ ¹Ù°¡ º®À» °¡µæ ä¿î´Ù. Æ÷¸ËÆà ¿µ¿ª frt¿¡´Â ½ºÅ©·Ñ ¹Ù ¿µ¿ªÀÌ Á¦¿ÜµÇ°í ¿©±â¿¡ ¸¶Áø ¿µ¿ª±îÁö Á¦¿ÜµÈ´Ù. Áï frt´Â ºäÀÇ ÀÛ¾÷¿µ¿ª Áß Â÷Àϵ峪 ¸¶Áø¿¡ ÀÇÇØ °¡·ÁÁöÁö ¾ÊÀº ¿µ¿ª¸¸À» °¡Áø´Ù.

Ç¥ÁØ ½ºÅ©·Ñ ¹Ù ´ë½Å ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀ» »ç¿ëÇÔÀ¸·Î½á ½ºÅ©·Ñ ¹Ù °ü¸® Á¤Ã¥À» ¾à°£ º¯°æÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. Áö±Ý±îÁö ¼öÁ÷ ½ºÅ©·Ñ ¹Ù´Â Ç×»ó º¸ÀÌ°Ô ÇÏ°í ¼öÆò ½ºÅ©·Ñ ¹Ù´Â ÀÚµ¿ °³Çà ¿É¼Ç¿¡ µû¶ó º¸À̰ųª ¼û°å´Âµ¥ ÀÌÈĺÎÅÍ´Â ÀÚµ¿ °³Çà ¿©ºÎ¿¡ »ó°ü¾øÀÌ ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ Ç×»ó Ç¥½ÃÇÑ´Ù. ´Ù¸¸ ÀÚµ¿ °³Çà »óÅÂÀÏ ¶§´Â ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ »ç¿ë ±ÝÁö½ÃÄÑ ½ºÅ©·ÑÇÒ ¼ö ¾ø°Ô ÇÒ °ÍÀÌ´Ù.

ÀÌ·¸°Ô Á¤Ã¥À» ¹Ù²Ù´Â ÀÌÀ¯´Â ÀÚµ¿ °³Çà ¿É¼Ç°ú´Â »ó°ü¾øÀÌ ¼öÆòÀ¸·Î ÆíÁýâÀ» ºÐÇÒÇÒ ¼ö ÀÖ¾î¾ß ÇÏ°í ±×·¯ÀÚ¸é ¼öÆò ½ºÇø´ ¹Ú½º°¡ Ç×»ó È­¸é¿¡ º¸¿©¾ß Çϱ⠶§¹®ÀÌ´Ù. ¼öÆò ½ºÇø´ ¹Ú½º´Â ¼öÆò ½ºÅ©·Ñ ¹Ù ¿·¿¡ ¹èÄ¡µÇ´Âµ¥ ½ºÅ©·Ñ ¹Ù ¾øÀÌ ½ºÇø´ ¹Ú½º¸¸ ÀÖÀ¸¸é º¸±â¿¡ ÁÁÁö ¾Ê´Ù. ¼öÁ÷ ½ºÅ©·Ñ ¹Ù ¾Æ·¡¿¡ ¾à°£ÀÇ ¿©¹éÀÌ ÀÖÀ¸¹Ç·Î ¿©±â¿¡ ¼öÆò ½ºÇø´ ¹Ú½º¸¦ µÑ ¼öµµ ÀÖÁö¸¸ Á÷°üÀûÀÌÁö ¸øÇÏ´Ù.

ÀÌ·¸°Ô Çصµ ±â´ÉÀûÀÎ ¹®Á¦´Â ¾øÁö¸¸ ±×¸²¿¡¼­ º¸´Ù½ÃÇÇ ¸¶Áø ¾Æ·¡ÂÊ¿¡ ½ºÇø´ ¹Ú½º¸¸ ´ú·· ±×·ÁÁ® ÀÖ´Â ¸ð½ÀÀÌ ¾ó¸¶³ª ¾î»öÇÑ°¡. ¶ÇÇÑ ÀÌÁ¦ ½ºÅ©·Ñ ¹Ù°¡ ÄÁÆ®·ÑÀ̱⠶§¹®¿¡ ½ºÅ©·Ñ ¹Ù°¡ ¼û¾î ¹ö¸®¸é Æ÷¸ËÆà ¿µ¿ªÀÌ º¯°æµÈ´Ù´Â ¹®Á¦µµ ÀÖ´Ù. Ç¥ÁØ ½ºÅ©·Ñ ¹Ù´Â ÀÛ¾÷ ¿µ¿ª ¹Ù±ù¿¡ »ý¼ºµÇ¹Ç·Î Æ÷¸ËÆà ¿µ¿ª¿¡´Â ¿µÇâÀ» ÁÖÁö ¾ÊÁö¸¸ ÄÁÆ®·ÑÀº ±×·¸Áö°¡ ¸øÇÑ °ÍÀÌ´Ù. ¼öÁ÷À¸·Î ½ºÅ©·ÑÇÒ ¶§¸¶´Ù ¼öÆò ½ºÅ©·Ñ ¹Ù°¡ ÀÖ´ÂÁö ¾ø´ÂÁö¸¦ ÀÏÀÏÀÌ °è»êÇØ¾ß ÇÑ´Ù´Â ºÎ´ãµµ Àֱ⠶§¹®¿¡ ¼û±â´Â ´ë½Å »ç¿ë±ÝÁöÇÏ´Â Á¤Ã¥À» ¼±ÅÃÇß´Ù. ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ °ü¸®ÇÏ´Â SetWrap ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::SetWrap(int aWrap)

{

     nWrap=aWrap;

     if (nWrap && RightWrap==0) {

          EnableScrollBar(hHorzScroll,SB_CTL,ESB_DISABLE_BOTH);

          xPos=0;

     } else {

          EnableScrollBar(hHorzScroll,SB_CTL,ESB_ENABLE_BOTH);

     }

 

     Invalidate(-1);

     UpdateLineInfo();

     UpdateScrollInfo();

     SetCaret();

}

 

ÀÚµ¿ °³Çà ¿©ºÎ¿¡ µû¶ó ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ »ç¿ë ±ÝÁö ¶Ç´Â Çã°¡ÇÑ´Ù. Ç¥ÁØ ½ºÅ©·Ñ ¹Ù ´ë½Å ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÌ »ç¿ëµÇ¾úÀ¸¹Ç·Î ½ºÅ©·Ñ ¹Ù¸¦ ÇÁ·Î±×·¡¹ÖÇÏ´Â ¸ðµç °÷ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. Get(Set)ScrollInfo ÇÔ¼öÀÇ µÎ¹ø° Àμö¸¦ SB_HORZ, SB_VERT ´ë½Å SB_CTL·Î º¯°æÇÏ°í ù ¹ø° Àμö¿¡ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ÁÖ¸é µÈ´Ù. UpdateScrollInfo¸¦ ´ÙÀ½Ã³·³ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::UpdateScrollInfo()

{

     ....

    SetScrollInfo(hWnd, SB_VERT, &si, TRUE);

     SetScrollInfo(hVertScroll, SB_CTL, &si, TRUE);

     if (si.nPage >= (unsigned)si.nMax) {

          EnableWindow(hVertScroll,FALSE);

     }

 

     if (nWrap == 0 || RightWrap != 0) {

          ....

        SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);

          SetScrollInfo(hHorzScroll, SB_CTL, &si, TRUE);

          if (si.nPage >= (unsigned)si.nMax) {

              EnableWindow(hHorzScroll,FALSE);

          }

     }

}

 

½ºÅ©·Ñ ¹ÙÀÇ À§Ä¡¿Í ¹üÀ§¸¦ ÁöÁ¤ÇÏ´Â ´ë»óÀÌ Ç¥ÁØ ½ºÅ©·Ñ ¹Ù¿¡¼­ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ·Î ¹Ù²ï °Í ¹Û¿¡´Â Â÷ÀÌ°¡ ¾ø´Ù. ¿©±â¼­ SB_HORZ, SB_VERT Ç¥ÁØ ½ºÅ©·Ñ ¹Ù¿¡ ´ëÇÑ ¹üÀ§¸¦ ÁöÁ¤ÇÏÁö ¾Ê±â ¶§¹®¿¡ ºä¿¡´Â ´õ ÀÌ»ó Ç¥ÁØ ½ºÅ©·Ñ ¹Ù°¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù.

½ºÅ©·Ñ ¹Ù ¹üÀ§¸¦ ¼³Á¤ÇÑ ÈÄ ÆäÀÌÁö Å©±â°¡ ¹üÀ§º¸´Ù ´õ Å©¸é ½ºÅ©·Ñ ¹Ù¸¦ ¾Æ¿¹ »ç¿ë ±ÝÁöÇÑ´Ù. SetScrollInfo ÇÔ¼ö¿¡ SIF_DISABLENOSCROLLÀ̶ó´Â Ç÷¡±×°¡ ÀÖÁö¸¸ À§Ä¡°ªÀ» °°ÀÌ ÁöÁ¤ÇÒ ¶§´Â ÀÌ Ç÷¡±×°¡ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â °Í °°´Ù. ¶ÇÇÑ »ç¿ë±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù¿¡ ´ëÇØ SetScrollInfo³ª SetScrollPos·Î À§Ä¡¸¦ º¯°æÇÏ¸é ´Ù½Ã »ç¿ë Çã°¡ »óÅ·Πµ¹¾Æ¿Í ¹ö¸®´Â ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ ¹üÀ§ Á¡°Ë ÈÄ Á÷Á¢ »ç¿ë ±ÝÁö ½ÃÄ×´Ù. ½ºÅ©·Ñ ¹ÙÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â µÎ ÇÔ¼öµµ ¼öÁ¤µÇ´Âµ¥ ÀÌ ÇÔ¼öµéÀº Á» ´õ ¼öÁ¤ÇÒ °ÍÀÌ ¸¹´Ù.

 

void CApiEditText::OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     int xInc;

     SCROLLINFO si;

     POINT pt;

 

    if (!IsWindowEnabled(hHorzScroll)) {

        return;

    }

     xInc=0;

     switch (code) {

          ....

     case SB_THUMBTRACK:

          si.cbSize=sizeof(SCROLLINFO);

          si.fMask=SIF_TRACKPOS;

        GetScrollInfo(hHorzScroll,SB_CTL,&si);

          xInc=si.nTrackPos-xPos;

          break;

     default:

          break;

     }

 

     xInc=max(-xPos, min(xInc, xMax-xPos));

     xPos=xPos+xInc;

    ScrollWindow(hWnd, -xInc, 0, &frt, &frt);

    SetScrollPos(hHorzScroll, SB_CTL, xPos, TRUE);

 

    GetXYFromOff(off,(int &)pt.x,(int &)pt.y);

    pt.x-=xPos;

 

     if (pt.x < MarginWidth) {

          if (bHideCaret==FALSE) {

              HideCaret(hWnd);

              bHideCaret=TRUE;

          }

     } else {

          ShowCaret(hWnd);

          bHideCaret=FALSE;

     }

     // ½ºÅ©·ÑµÈ¸¸Å­ ij·µÀÇ À§Ä¡µµ À̵¿ÇÑ´Ù.

    if (bHideCaret==FALSE) {

        SetCaret(FALSE,FALSE);

    }

}

 

void CApiEditText::OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     int yInc;

     SCROLLINFO si;

     int LinePerPage;

    RECT srt;

 

    if (!IsWindowEnabled(hVertScroll)) {

        return;

    }

     LinePerPage=(frt.bottom/LineHeight)*LineHeight;

     yInc=0;

     switch (code) {

          ....

     case SB_THUMBTRACK:

          si.cbSize=sizeof(SCROLLINFO);

          si.fMask=SIF_TRACKPOS;

        GetScrollInfo(hVertScroll,SB_CTL,&si);

          yInc=si.nTrackPos-yPos;

          break;

     default:

          break;

     }

 

     yInc=max(-yPos, min(yInc, yMax-yPos-LinePerPage));

     yInc=yInc-(yInc % LineHeight);

     yPos=yPos+yInc;

     // Æ÷¸ËÆà ¿µ¿ª°ú ¸¶Áø ¿µ¿ª¸¸ ½ºÅ©·ÑÇÑ´Ù.

    srt=frt;

    srt.left=0;

    ScrollWindow(hWnd, 0, -yInc, &srt,&srt);

    SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

    SetCaret(FALSE,FALSE);

}

 

½ºÅ©·Ñ ¹Ù°¡ »ç¿ë±ÝÁö »óÅÂÀ̸é ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ÇÊ¿ä¾ø´Ù. SetScrollPos ÇÔ¼ö¸¸ ºÎ¸£¸é ½ºÅ©·Ñ ¹Ù°¡ ´Ù½Ã È°¼ºÈ­µÇ¾î ¹ö¸®±â ¶§¹®¿¡ ÀÌ Á¶°Ç Á¡°ËÀº ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ¸¸¾à ±×·¸Áö ¾ÊÀ¸¸é ¼±ÅÃÁß¿¡ Ä¿¼­°¡ ÀÛ¾÷¿µ¿ª ¹ÛÀ¸·Î ¹þ¾î³ª±â¸¸ Çصµ Áï½Ã È°¼ºÈ­µÇ¾î ¹ö¸®´Âµ¥ À̶§ ½ºÅ©·Ñ ¹ÙÀÇ ¹üÀ§´Â 0À̹ǷΠ½ÇÁ¦·Î ½ºÅ©·ÑÇÒ ¼öµµ ¾ø´Âµ¥ ½ºÅ©·Ñ ¹Ù°¡ È°¼ºÈ­µÈ´Ù. ±×·¡¼­ ½ºÅ©·Ñ ¹Ù°¡ È°¼ºÈ­µÇ¾î ÀÖÀ» ¶§¸¸ ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ´Ù. UpdateScrollInfo¿¡¼­ È°¼ºÈ­½ÃÄÑ ÁÙ ¶§±îÁö ÀÌ µÎ ÇÔ¼ö´Â ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í ³·ÀáÀ» ÀÜ´Ù.

¼öÁ÷ ½ºÅ©·Ñ ½Ã(OnVScroll) ½ºÅ©·Ñ ¿µ¿ª°ú Ŭ¸®ÇÎ ¿µ¿ªÀ» Á¤È®ÇÏ°Ô °è»êÇÏ¿© ¼öÆò ½ºÅ©·Ñ ¹Ù°¡ ½ºÅ©·ÑµÇÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. ½ºÅ©·ÑÇÒ ¿µ¿ªÀº Æ÷¸ËÆà ¿µ¿ª¿¡¼­ ¸¶Áø ¿µ¿ªÀ» Æ÷ÇÔ½ÃŲ ¿µ¿ªÀÌ´Ù. Áï ÀÛ¾÷¿µ¿ª¿¡¼­ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÌ Â÷ÁöÇÏ°í ÀÖ´Â ¿µ¿ªÀ» Á¦¿ÜÇÏ°í ¸ðµÎ ½ºÅ©·ÑµÈ´Ù. ½ºÅ©·Ñ ¿µ¿ª srt´Â ´ÙÀ½°ú °°ÀÌ °è»êµÇ¸ç ±½Àº »ç°¢Çü¾ÈÀÌ ½ºÅ©·ÑµÉ ¿µ¿ªÀÌ´Ù.

Ç¥ÁØ ½ºÅ©·Ñ ¹Ù´Â ij·µ±îÁö °°ÀÌ ½ºÅ©·ÑÇÏÁö¸¸ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀº ij·µÀ» ½ºÅ©·Ñ ´ë»ó¿¡¼­ Á¦¿ÜÇϹǷΠ½ºÅ©·Ñ ÈÄ¿¡ SetCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij·µ À§Ä¡¸¦ ´Ù½Ã °è»êÇØ¾ß ÇÑ´Ù.

OnHScroll ÇÔ¼ö´Â ¿ø·¡ Ŭ¸®ÇÎ ¿µ¿ªÀ» »ç¿ëÇÏ°í ÀÖ¾ú´Âµ¥ Ãß°¡·Î ½ºÅ©·Ñ ¿µ¿ªµµ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. Æ÷¸ËÆà ¿µ¿ªÀ» ½ºÅ©·Ñ ¿µ¿ªÀ¸·Î ÁöÁ¤ÇÔÀ¸·Î½á ¼öÁ÷ ½ºÅ©·Ñ ¹Ù°¡ ½ºÅ©·ÑµÇÁö ¾Ê°Ô Çß´Ù. ¼öÆò ½ºÅ©·Ñ½Ã ij·µÀÌ ¸¶Áø¾ÈÀ¸·Î µé¾î°¡¸é ij·µÀ» ¼û±â´Â ±â´ÉÀÌ ÀÖ¾ú´Âµ¥ ÀÌ Äڵ嵵 Á¶±Ý ¼öÁ¤µÇ¾ú´Ù. ¼û±è 󸮸¦ À§ÇØ Ä³·µÀÇ ÁÂÇ¥°¡ ¸¶Áø ¾È¿¡ ÀÖ´ÂÁö ¾Æ´ÑÁö¸¦ Á¶»çÇØ¾ß Çϴµ¥ ½ºÅ©·Ñ¿¡ µû¶ó ij·µÀÌ À̵¿µÇÁö ¾ÊÀ¸¹Ç·Î ¼û°ÜÁ® ÀÖ´Â »óÅ¿¡¼­´Â GetCaretPos·Î Á¤È®ÇÑ À§Ä¡¸¦ Á¶»çÇÒ ¼ö ¾øÀ¸¸ç ±×·¡¼­ GetXYFromOff·Î ÁÂÇ¥¸¦ Á¶»çÇÑ ÈÄ ÇöÀç ½ºÅ©·Ñ °ªÀ» »©¼­ Á÷Á¢ À§Ä¡¸¦ ±¸Çß´Ù.

±×¿Ü Ç¥ÁØ ½ºÅ©·Ñ ¹Ù¸¦ ´Ù·ç´ø ¸ðµç ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. PgUp, PgDnÀ¸·Î ÆäÀÌÁö ´ÜÀ§·Î À̵¿ÇÒ ¶§, ÈÙ ¸¶¿ì½º·Î ½ºÅ©·ÑÇÒ ¶§, ±×¸®°í SetCaret¿¡ ÀÇÇØ Ä³·µÀÌ ÀÖ´Â °÷À¸·Î °­Á¦ ½ºÅ©·Ñ µÉ ¶§ ¼¼ ±ºµ¥°¡ ´õ ÀÖ´Ù. SB_HORZ, SB_VERT¸¦ ¸ðµÎ SB_CTL·Î º¯°æÇÏ°í ½ºÅ©·Ñ ¿µ¿ª¿¡¼­ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ¿µ¿ªÀ» »«´Ù.

 

void CApiEditText::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     ....

     case VK_PRIOR:

          ....

        SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

     case VK_NEXT:

          ....

        SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

 

void CApiEditText::OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

    RECT srt;

     ....

     LinePerPage=(frt.bottom/LineHeight)*LineHeight;

     yInc=LineHeight*nScroll;

     yInc=max(-yPos, min(yInc, yMax-yPos-LinePerPage));

     yInc=yInc-(yInc % LineHeight);

     yPos=yPos+yInc;

    srt=frt;

    srt.left=0;

    ScrollWindow(hWnd, 0, -yInc, &srt, &srt);

    if (IsWindowEnabled(hVertScroll)) {

        SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

    }

    SetCaret(FALSE,FALSE);

}

 

void CApiEditText::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)

{

     ....

          if (bScroll == TRUE) {

           if (IsWindowEnabled(hHorzScroll)) {

               SetScrollPos(hHorzScroll, SB_CTL, xPos, TRUE);

           }

           if (IsWindowEnabled(hVertScroll)) {

               SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

           }

              Invalidate(-1);

          }

     }

     ....

 

ÈÙ ¸¶¿ì½º·Î ½ºÅ©·Ñ ÇÒ ¶§µµ ½ºÅ©·Ñ ¿µ¿ª°ú Ŭ¸®ÇÎ ¿µ¿ªÀ» Àß °è»êÇØ¾ß Çϸç SetCaretÀº ¼öÆò ½ºÅ©·Ñ ¹Ù°¡ È°¼ºÈ­µÇ¾î ÀÖÀ» ¶§¸¸ À§Ä¡¸¦ °»½ÅÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ½ºÅ©·Ñ ¹Ù À§¿Í ¿·¿¡ Á¶±×¸¸ ¿©¹éÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.

½ºÅ©·Ñ ¹Ù°¡ ÄÁÆ®·Ñ·Î ¹Ù²î¾úÁö¸¸ ¼öÁ¤Àü°ú ¸¶Âù°¡Áö·Î ½ºÅ©·ÑµÉ °ÍÀÌ´Ù. Àú Á¶±×¸¸ ¿©¹éÀ» ¸¸µé±â À§ÇØ Ç¥ÁØ ½ºÅ©·Ñ ¹Ù ´ë½Å ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀ» »ç¿ëÇß´Ù.

³ª. »ç¿ë ±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù

¼öÆò ½ºÇø´ ¹Ú½º ¹èÄ¡¸¦ À§ÇØ ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ Ç×»ó º¸À̵µ·Ï Á¤Ã¥À» º¯°æÇßÀ¸¸ç ÀÚµ¿ °³Çà½Ã´Â ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ ¼û±âÁö ¾Ê°í »ç¿ë ±ÝÁö¸¸ ½ÃÄ×´Ù. ±×·¯³ª ÀÌ·¸°Ô µÇ¸é ¸î°¡Áö ¹®Á¦°¡ ¹ß»ýÇϴµ¥ »ç¿ë ±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù À§¿¡¼­ ¸¶¿ì½º Ä¿¼­°¡ IÀÚ ¸ð¾çÀÌ µÇ¸ç ÀÌ »óÅ¿¡¼­ ¸¶¿ì½º¸¦ Ŭ¸¯Çϸé Æ÷¸ËÆà ¿µ¿ªÀ» Ŭ¸¯ÇÑ °Íó·³ µ¿ÀÛÇÑ´Ù.

¿Ö ÀÌ·¸°Ô µÇ´Â°¡ ÇÏ¸é »ç¿ë ±ÝÁöµÈ Â÷Àϵå´Â Àڽſ¡°Ô Àü´ÞµÇ´Â ¸Þ½ÃÁö¸¦ Á÷Á¢ ó¸®ÇÏÁö ¾Ê°í ºÎ¸ð¿¡°Ô ´Ù½Ã º¸³»±â ¶§¹®ÀÌ´Ù. WM_LBUTTONDOWN, WM_SETCURSOR°¡ ½ºÅ©·Ñ ¹ÙÀÇ ºÎ¸ðÀÎ ApiEditText·Î Àü´ÞµÇ¸ç ºä´Â »ç¿ëÀÚ°¡ Æ÷¸ËÆà ¿µ¿ªÀ» ´©¸¥ °ÍÀ¸·Î ¾Ë°í À߸ø µ¿ÀÛÇÏ´Â °ÍÀÌ´Ù. ½ºÅ©·Ñ ¹Ù¸¦ ¾Æ¿¹ ¼û°Ü ¹ö¸°´Ù¸é ¹®Á¦°¡ ¾øÁö¸¸ ÀÌ·¸°Ô ÇÒ ¼ö ¾øÀ½Àº ¾Õ¿¡¼­ ÀÌ¹Ì ¼³¸íÇß¾ú´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ýµµ ¿©·¯ °¡Áö°¡ ÀÖ´Ù.

ù ¹ø° ¹æ¹ýÀº ½ºÅ©·Ñ ¹Ù¸¦ ºäÀÇ Â÷Àϵå·Î »ý¼ºÇÏÁö ¸»°í ÇÁ·¹ÀÓÀÇ Â÷Àϵå·Î »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÌ ºäÀÇ ÀÛ¾÷ ¿µ¿ª¿¡ ¹èÄ¡µÇ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ºä´Â ½ºÅ©·ÑÇÒ ¶§ Ŭ¸®ÇΠ󸮸¦ ÇÒ ÇÊ¿äµµ ¾ø°í »ç¿ë ±ÝÁöµÈ ÄÁÆ®·Ñ¿¡ ´ëÇØ ½Å°æ¾µ ÇÊ¿äµµ ¾ø´Ù. »Ó¸¸ ¾Æ´Ï¶ó ½ºÇø´ ¹Ú½º¸¦ ºÐÇÒ ÁÖüÀÎ ÇÁ·¹ÀÓÀÌ °¡Áö¹Ç·Î ºä´Â â ºÐÇÒ¿¡ ´ëÇÑ UI¸¦ Á¦°øÇÏÁö ¾Ê¾Æµµ µÇ´Â Ãß°¡ÀûÀÎ ÀÌÁ¡ÀÌ ÀÖ´Ù.

´ë½Å »ç¿ëÀÚÀÇ ½ºÅ©·Ñ 󸮸¦ ÇÁ·¹ÀÓÀÌ ´ë½Å ¹Þ¾Æ ºä¿¡°Ô Àü´ÞÇϵµ·Ï ±¸Á¶¸¦ Á¶±Ý ¹Ù²Ù¾î¾ß ÇÒ ÇÊ¿ä´Â ÀÖÁö¸¸ ¹æ½ÄÀ» Á¶±Ý ¹Ù²Ù´Â °ÍÀÏ »Ó ¹®Á¦°¡ µÉ Á¤µµ´Â ¾Æ´Ï´Ù. MFC°¡ ÀÌ ¹æ½Ä´ë·Î ºä¿Í ÇÁ·¹ÀÓÀ» °ü¸®ÇÑ´Ù. ±×·¯³ª ÀÌ ¹æ½ÄÀº ¾ÆÁÖ Ä¡¸íÀûÀÎ ¾àÁ¡ÀÌ Çϳª Àִµ¥ âÀÌ ºÐÇҵǾúÀ» ¶§ °¢ ºÐÇÒ ºä¿¡ ½ºÅ©·Ñ ¹Ù°¡ »ý¼ºµÇ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ºÐÇÒ ºä°¡ ¼­·Î ´Ù¸¥ ½ºÅ©·Ñ »óŸ¦ °¡Áú ¼ö ¾ø´Ù´Â Á¡ÀÌ´Ù. ´ÙÀ½Àº ºñÁÖ¾ó ½ºÆ©µð¿À 6.0ÀÇ ÆíÁý±â¸¦ ¼öÆòÀ¸·Î ºÐÇÒÇØ ³õÀº ¸ð½ÀÀÌ´Ù.

º¸´Ù½ÃÇÇ ºä´Â µÎ °³·Î ºÐÇҵǾúÁö¸¸ ¼öÁ÷ ½ºÅ©·Ñ ¹Ù´Â Çϳª¹Û¿¡ ¾ø´Ù. ±×·¡¼­ ÀÌ µÎ ºä´Â ¼öÁ÷À¸·Î ´Ù¸¥ À§Ä¡¸¦ º¸¿©ÁÖÁö ¸øÇÏ¸ç ¼öÆò ¹æÇâÀ¸·Î¸¸ ¼­·Î ´Ù¸¥ ½ºÅ©·Ñ »óŸ¦ °¡Áú ¼ö ÀÖ´Ù. ÀÌ·¸°Ô µÇ¸é ¼öÆò ºÐÇҷδ ¹®¼­ÀÇ ´Ù¸¥ ºÎºÐÀ» º¼ ¼ö ¾øÀ¸¸ç ºÐÇÒÀÇ Àǹ̰¡ ¾ø´Â °Í°ú ¸¶Âù°¡Áö´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À»Ó¸¸ ¾Æ´Ï¶ó MFC ÇÁ·¹ÀÓ¿öÅ©ÀÇ ÀÚµ¿È­µÈ ºÐÇÒ ±â´ÉÀ» »ç¿ëÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥µéÀº °øÅëÀûÀ¸·Î ÀÌ·± ÇÑ°èÁ¡À» °¡Áö°í ÀÖ´Ù. ApiEdit´Â ºÐÇÒµÈ ºä°¡ ¿ÏÀüÈ÷ µ¶¸³ÀûÀ¸·Î ¿òÁ÷ÀÏ ¼ö ÀÖµµ·Ï Çϱâ À§ÇØ ÀÌ ¹æ½ÄÀ» äÅÃÇÏÁö ¾Ê¾Ò´Ù.

µÎ ¹ø° ¹æ¹ýÀº ¼öÆò ½ºÅ©·Ñ ¹Ù¸¦ »ç¿ë ±ÝÁöÇÏÁö ¸»°í Ç×»ó º¸À̵µ·Ï Ç쵂 ¹üÀ§¸¦ 0À¸·Î ¸¸µé¾î ½ºÅ©·ÑÇÒ ¼ö ¾ø°Ô ÇÏ°í OnHScroll¿¡¼­ ½ºÅ©·Ñ ¿äûÀ» °ÅºÎÇϴ°ÍÀÌ´Ù. ÃæºÐÈ÷ °¡´ÉÇÑ ¹æ¹ýÀÌ°í ±â´É»óÀÇ ¹®Á¦´Â ¾øÁö¸¸ ½ºÅ©·Ñ ¹Ù°¡ ¸¶Ä¡ »ç¿ë °¡´ÉÇÑ °Íó·³ º¸¿© Á÷°üÀûÀÌÁö ¸øÇÏ´Ù´Â °ÍÀÌ ºÒ¸¸ÀÌ´Ù. ApiEdit´Â µÎ ¹æ¹ý ¸ðµÎ äÅÃÇÏÁö ¾ÊÀ¸¸ç ÇöÀç ±¸Á¶¸¦ °í¼öÇϸ鼭 ¹®Á¦¸¸ ÇØ°áÇÏ´Â Á¤¸é µ¹Æĸ¦ Çϱâ·Î Çß´Ù. SetCaret¿¡´Â ¼öÆò ½ºÅ©·Ñ ¹Ù°¡ »ç¿ë ±ÝÁöµÇ¾úÀ» ¶§ À§Ä¡ °»½ÅÀ» ÇÏÁö ¾Ê°Ô ÀÌ¹Ì Á¶Ä¡ÇßÀ¸¸ç ´ÙÀ½ µÎ ¸Þ½ÃÁö¿¡¼­¸¸ »ç¿ë ±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù¸¦ °ü¸®ÇÏ¸é µÈ´Ù.

 

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

{

    RECT crt;

 

    GetClientRect(hWnd,&crt);

     GetCursorPos(&pt);

     ScreenToClient(hWnd,&pt);

     if (pt.x != x || pt.y != y) {

          return;

     }

    // »ç¿ë±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù À§¿¡¼­ÀÇ Å¬¸¯Àº ¹«½ÃÇÑ´Ù.

    if (y > crt.bottom-SBW || x > crt.right-SBW) {

        return;

    }

     ....

 

BOOL CApiEditText::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)

{

    RECT crt;

 

    GetClientRect(hWnd,&crt);

          ....

        // »ç¿ë±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù À§¿¡¼­ÀÇ È­»ìÇ¥ Ä¿¼­¸¦ Ç¥½ÃÇÑ´Ù.

        if (pt.y > crt.bottom-SBW || pt.x > crt.right-SBW) {

           SetCursor(LoadCursor(NULL,IDC_ARROW));

           return TRUE;

        }

 

          pt.x += xPos;

          ....

 

½ºÅ©·Ñ ¹Ù°¡ »ç¿ë±ÝÁöµÇ¾î ÀÖÀ¸¸é ºÎ¸ðÀÎ ºä°¡ ´ë½Å ¸Þ½ÃÁö¸¦ ¹Þ´Âµ¥ À̶§ ¸¶¿ì½º¸¦ ´©¸¥ ¿µ¿ªÀÌ »ç¿ë±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ¿µ¿ªÀ̸é ÀÌ ¸Þ½ÃÁö¸¦ ¿ÏÀüÈ÷ ¹«½ÃÇÑ´Ù. ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ »ç¿ë ±ÝÁö ¿©ºÎ´Â º¼ ÇÊ¿ä¾ø°í ¸¶¿ì½º¸¦ ´©¸¥ ÁÂÇ¥¸¸ ºñ±³ÇØ º¸¸é ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ À§¿¡¼­ Ŭ¸¯Çß´ÂÁö ¾Ë ¼ö ÀÖ´Ù. »ç½Ç ½ºÅ©·Ñ ¹Ù°¡ »ç¿ë °¡´ÉÇÑ »óÅ¿¡¼­´Â ½ºÅ©·Ñ ¹Ù°¡ ¸Þ½ÃÁö¸¦ ¹ÞÀ¸¹Ç·Î ºäÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö°¡ È£ÃâµÇÁöµµ ¾Ê´Â´Ù.

OnSetCursor´Â ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ¿µ¿ª¿¡ Ä¿¼­°¡ ÀÖÀ» ¶§ È­»ìÇ¥ ¸ð¾çÀÇ Ä¿¼­¸¦ °­Á¦·Î º¸À̵µ·Ï Çß´Ù. ¸¶Âù°¡Áö·Î ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÌ »ç¿ë °¡´ÉÇÑ »óÅ¿¡¼­´Â ½ºÅ©·Ñ ¹Ù°¡ ½º½º·Î WM_SETCURSOR ¸Þ½ÃÁö¸¦ ó¸®ÇϹǷΠºäÀÇ ÀÌ ÇÔ¼ö°¡ È£ÃâµÇÁö ¾Ê´Â´Ù. Á¶±Ý ¾ïÁö½º·¯¿î ¸éÀÌ ÀÖ±â´Â ÇÏÁö¸¸ ¾î·°Å³ª ¹®Á¦´Â ÇØ°áµÇ¾ú´Ù.

´Ù. ½ºÇø´ ¹Ú½º

½ºÅ©·Ñ ¹Ù À§¿¡ ½ºÇø´ ¹Ú½º¸¦ À§ÇÑ ¿©¹éÀ» Èûµé°Ô ¸¸µé¾úÀ¸¹Ç·Î ÀÌÁ¦ ¿©±â¿¡ ½ºÇø´ ¹Ú½º¸¦ ¿¹»Ú°Ô ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. Á¶±×¸¸ ¹Ú½º ¸ð¾çÀÌ°í ±× ÀÚü°¡ ±â´ÉÀ» °®´Â °ÍÀº ¾Æ´ÏÁö¸¸ ÀÌ ºÎºÐÀ» µå·¡±×Çϸé âÀÌ ºÐÇҵȴٴ °ÍÀ» Á÷°üÀûÀ¸·Î ¼³¸íÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ºäÀÇ OnPaint¿¡¼­ ½ºÇø´ ¹Ú½º¸¦ Á÷Á¢ ±×¸°´Ù.

 

void CApiEditText::OnPaint(HWND hWnd)

{

     ....

     RECT crt,srt;

 

     hdc=BeginPaint(hWnd,&ps);

     GetClientRect(hWnd,&crt);

 

     ....

     // ½ºÇø´ ¹Ú½º¸¦ ±×¸°´Ù.

     if (bVertSplit) {

          SetRect(&srt,crt.right-SBW,crt.top,crt.right,crt.top+SPLITWIDTH);

          DrawFrameControl(hdc,&srt,DFC_BUTTON,DFCS_BUTTONPUSH);

     }

     if (bHorzSplit) {

          SetRect(&srt,crt.left,crt.bottom-SBW,crt.left+SPLITWIDTH,crt.bottom);

          DrawFrameControl(hdc,&srt,DFC_BUTTON,DFCS_BUTTONPUSH);

     }

     EndPaint(hWnd,&ps);

}

 

ÅؽºÆ®¿Í ¸¶ÁøÀ» ¸ðµÎ Ãâ·ÂÇÑ ÈÄ¿¡ ½ºÅ©·Ñ ¹Ù À§¿Í ¿ÞÂÊ ¿©¹éÀÇ ºó ÀÚ¸®¿¡ ½ºÇø´ ¹Ú½º¸¦ ±×·È´Ù. DrawFrameControl ÇÔ¼ö·Î ¹öÆ° ¸ð¾çÀ» Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù. ´Ü, bVertSplit, bHorzSplitÀÌ FALSEÀÏ ¶§´Â ÀÌ ¿©¹éÀÌ ¾Æ¿¹ ¾øÀ¸¹Ç·Î ½ºÇø´ ¹Ú½º¸¦ ±×¸± ÇÊ¿ä°¡ ¾ø´Ù. ÀÌ ¿µ¿ª¿¡ ¸¶¿ì½º Ä¿¼­°¡ À§Ä¡Çϸé Ä¿¼­ ¸ð¾çÀ» ¹Ù²Ù¾î â ºÐÇÒÀ» ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¸íÈ®ÇÏ°Ô º¸¿© ÁÖ±â À§ÇØ OnSetCursor¿¡¼­ Ä¿¼­ ¸ð¾çÀ» º¯°æÇÑ´Ù.

 

BOOL CApiEditText::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)

{

     POINT pt;

     RECT crt;

 

     GetClientRect(hWnd,&crt);

     GetCursorPos(&pt);

     ScreenToClient(hWnd,&pt);

 

     if (codeHitTest==HTCLIENT) {

        if (pt.x < MarginWidth && pt.y < crt.bottom-SBW) {

              SetCursor(CApiEdit::hCMargin);

              return TRUE;

          }

 

        // ¼öÁ÷ ½ºÇø´ ¹Ú½ºÀÇ Ä¿¼­

        if (bVertSplit && pt.x > crt.right-SBW && pt.y < SPLITWIDTH) {

           SetCursor(LoadCursor(NULL,IDC_SIZENS));

           return TRUE;

        }

 

        // ¼öÆò ½ºÅ¬¸´ ¹Ú½ºÀÇ Ä¿¼­

        if (bHorzSplit && pt.x < SPLITWIDTH && pt.y > crt.bottom-SBW) {

           SetCursor(LoadCursor(NULL,IDC_SIZEWE));

           return TRUE;

        }

 

          // »ç¿ë±ÝÁöµÈ ½ºÅ©·Ñ ¹Ù À§¿¡¼­ÀÇ È­»ìÇ¥ Ä¿¼­¸¦ Ç¥½ÃÇÑ´Ù.

          if (pt.y > crt.bottom-SBW || pt.x > crt.right-SBW) {

              SetCursor(LoadCursor(NULL,IDC_ARROW));

              return TRUE;

          }

          ....

 

È­¸é ºÐÇÒÀÌ °¡´ÉÇÑ »óÅÂÀÌ°í Ä¿¼­ À§Ä¡°¡ ½ºÇø´ ¹Ú½º À§¿¡ ÀÖÀ» ¶§ Àû´çÇÑ ¸ð¾çÀÇ Ä¿¼­·Î ¹Ù²Ù¾ú´Ù. ¼öÆò ½ºÅ©·Ñ ¹ÙÀÇ ³ôÀ̸¸Å­Àº ÀÌÁ¦ ´õ ÀÌ»ó ¸¶ÁøÀÌ ¾Æ´Ï¹Ç·Î ÀÌ ¿µ¿ª¿¡¼­´Â ¸¶Áø Ä¿¼­¸¦ º¸¿©ÁÖÁö ¾Ê´Â´Ù. ½ºÅå Ä¿¼­Áß¿¡ Å©±â º¯°æ Ä¿¼­°¡ ÀÖÀ¸¹Ç·Î º°µµÀÇ Ä¿¼­ ¸®¼Ò½º¸¦ ¸¸µé ÇÊ¿ä¾øÀÌ ½ºÅå Ä¿¼­¸¦ »ç¿ëÇÏ¿´´Ù.

 

½ºÇø´ ¹Ú½º°¡ ±×·ÁÁ³°í ±× À§¿¡¼­ Ä¿¼­ ¸ð¾çÀÌ º¯°æµÇ¹Ç·Î »ç¿ëÀÚµéÀº ¿©±â¸¦ µå·¡±×Çϸé âÀÌ ºÐÇÒµÉ °ÍÀ̶ó´Â °ÍÀ» ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¶ó. È­¸é ºÐÇÒ ¿äû

ºä¸¦ ºÐÇÒÇÏ´Â ÁÖü´Â ºä¸¦ °Å´À¸®°í ÀÖ´Â ÇÁ·¹ÀÓÀÌ´Ù. ÇÏÁö¸¸ »ç¿ëÀڷκÎÅÍ ºÐÇÒ ¸í·ÉÀ» ¹Þ´Â À¯Àú ÀÎÅÍÆäÀ̽ºÀÎ ½ºÇø´ ¹Ú½º´Â ºä°¡ °¡Áö¹Ç·Î ºä°¡ ºÐÇÒ ¸í·ÉÀ» ¹Þ¾Æ¼­ ÇÁ·¹ÀÓ¿¡°Ô ¿äûÇØ¾ß ÇÑ´Ù. ¼öÁ÷ ½ºÅ©·Ñ ¹ÙÀÇ À§, ¼öÆò ½ºÅ©·Ñ ¹ÙÀÇ ¿ÞÂÊ¿¡ ÀÖ´Â ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¸é ¾îµðÂë¿¡ ºÐÇÒµÉ °ÍÀ̶ó´Â °ÍÀ» Ç¥½ÃÇÏ´Â ¹ÝÀü ¸·´ë¸¦ º¸¿© ÁÖ°í ¸¶¿ì½º ¹öÆ°À» ³õÀ¸¸é ÇÁ·¹ÀÓ¿¡°Ô ºÐÇÒÀ» ¿äûÇÑ´Ù.

ºÐÇÒÀÇ ¹æÇâÀº ¼öÆò, ¼öÁ÷ µÎ °¡Áö°¡ ÀÖ´Ù. ¼öÁ÷ ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¸é ¼öÁ÷À¸·Î ºÐÇÒÇÏ°í ¼öÆò ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¸é ¼öÆòÀ¸·Î ºÐÇÒÇÑ´Ù. ¹æÇâ¿¡ µû¶ó ºÐÇÒ ¹æ¹ý ¹× ¹ÝÀü¸·´ë¸¦ ±×¸®´Â ¹æ¹ýÀÌ ´Ù¸£¹Ç·Î °¢ ºÐÇÒ ¹æÇâÀ» ApiEdit.h¿¡ ¿­°ÅÇüÀ¸·Î ¼±¾ðÇÑ´Ù. 1ÀÌ¸é ¼öÁ÷À¸·Î ºÐÇÒÇÏ´Â °ÍÀÌ°í 2¸é ¼öÆòÀ¸·Î ºÐÇÒÇÏ´Â °ÍÀÌ´Ù.

 

enum { AESPLIT_VERT=1, AESPLIT_HORZ };

#define VGAP 6

 

VGAPÀº ºä°£ÀÇ °£°Ý°ªÀε¥ 6À¸·Î Á¤ÀÇÇÑ´Ù. 6Çȼ¿ÀÌ¸é ±²ÀåÀÌ µÎ²¨¿ï °Í °°Áö¸¸ ¹Ù±ùÀÇ 2Çȼ¿Àº Àå½ÄÀ» À§ÇÑ ¼±ÀÌ ±×·ÁÁö±â ¶§¹®¿¡ ¸·»ó ±×·Á³õ°í º¸¸é Àû´çÇÑ µÎ²²·Î º¸ÀÏ °ÍÀÌ´Ù. ÇÁ·¹ÀÓÀº ºÐÇÒ ¿äûÁß¿¡ ºÐÇÒ À§Ä¡¸¦ Ç¥½ÃÇϱâ À§ÇØ ¹ÝÀü¸·´ë¸¦ ±×¸°´Ù. ÀÌ¹Ì 2°³ÀÇ ºä·Î ºÐÇÒµÈ »óÅ¿¡¼­ 4ºÐÇÒÇÒ ¶§´Â ºÐÇÒµÈ ºä À§ÂÊ¿¡ ¹ÝÀü¸·´ë°¡ ±×·ÁÁ®¾ß ÇϹǷΠ¹ÝÀü¸·´ë´Â ºä°¡ ¾Æ´Ñ ÇÁ·¹ÀÓÀÌ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.

ºä´Â ÀÚ½ÅÀÇ ÀÛ¾÷¿µ¿ªÀ» ¹ÝÀü½Ãų ¼ö´Â ÀÖÁö¸¸ ÇüÁ¦ÀÇ ÀÛ¾÷¿µ¿ª¿¡±îÁö ¼Õ´î ¼ö´Â ¾ø±â ¶§¹®ÀÌ´Ù. CApiEdit ÇÁ·¹ÀÓ¿¡ ´ÙÀ½ ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

// SplitType ¹æÇâÀÇ posÀ§Ä¡¿¡ ºÐÇÒ ¹ÝÀü ¸·´ë¸¦ ±×¸°´Ù.

void CApiEdit::DrawSplitBar(int SplitType,int pos)

{

     HDC hdc;

     RECT crt;

     DWORD dwStyle;

     HBRUSH hSplitBrush;

     HBRUSH OldBrush;

     static WORD SplitPattern[]={0x5555,0xaaaa,0x5555,0xaaaa,

          0x5555,0xaaaa,0x5555,0xaaaa};

     HBITMAP hPattern;

 

     // ¹ÝÀü ¸·´ë¸¦ ±×¸®±â À§ÇÑ È¸»ö ÆÐÅÏ ºê·¯½Ã

     hPattern=CreateBitmap(8,8,1,1,SplitPattern);

     hSplitBrush=CreatePatternBrush(hPattern);

     DeleteObject(hPattern);

 

     // WS_CLIPCHILDREN ½ºÅ¸ÀÏÀ» Àá½Ã ¾ø¾Ö°í ¹ÝÀü ¸·´ë¸¦ ±×¸°´Ù.

     GetClientRect(hWnd,&crt);

     dwStyle=GetWindowLong(hWnd,GWL_STYLE);

     SetWindowLong(hWnd,GWL_STYLE,dwStyle & ~WS_CLIPCHILDREN);

     hdc=GetDC(hWnd);

     OldBrush=(HBRUSH)SelectObject(hdc,hSplitBrush);

     if (SplitType==AESPLIT_VERT) {

          PatBlt(hdc,crt.left,crt.top+pos,crt.right,4,PATINVERT);

     } else {

          PatBlt(hdc,crt.left+pos,crt.top,4,crt.bottom,PATINVERT);

     }

 

     SelectObject(hdc,OldBrush);

     DeleteObject(hSplitBrush);

     ReleaseDC(hWnd,hdc);

     SetWindowLong(hWnd,GWL_STYLE,dwStyle);

}

 

Àμö·Î Àü´Þ¹ÞÀº SplitType ¹æÇâÀ¸·Î pos À§Ä¡¿¡ ¹ÝÀü ¸·´ë¸¦ ±×¸°´Ù. XOR·Î ±×¸®±â ¶§¹®¿¡ °°Àº À§Ä¡¿¡ ´ëÇØ ÀÌ ÇÔ¼ö¸¦ µÎ ¹ø È£ÃâÇϸé ÀÌ¹Ì ±×·ÁÁø ¹ÝÀü ¸·´ë°¡ Áö¿öÁø´Ù. ÇÁ·¹ÀÓÀº WS_CLIPCHILDREN ½ºÅ¸ÀÏÀ» °¡Áö°í Àִµ¥ ÀÌ ½ºÅ¸ÀÏÀ» Àá½Ã ÇØÁ¦ÇØ¾ß Â÷ÀϵåÀ§¿¡ ¹ÝÀü ¸·´ë¸¦ ±×¸± ¼ö ÀÖ´Ù.

ÀÌ ¹æ¹ýÀÌ ¸¶À½¿¡ µéÁö ¾Ê´Â´Ù¸é À©µµ¿ì DC¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ°í Àüü È­¸é DC¸¦ »ç¿ëÇÒ ¼öµµ Àִµ¥ ÀÌ °æ¿ì ¹ÝÀü ¸·´ë°¡ ±×·ÁÁú ÀÛ¾÷ ¿µ¿ª ÁÂÇ¥¸¦ Á¤È®ÇÏ°Ô °è»êÇØ¾ß ÇÑ´Ù. »ç¿ëÇÏ´Â DC¿¡ µû¶ó Ç×»ó À§(Always On Top) ¼Ó¼ºÀ» °¡Áö´Â À©µµ¿ì°¡ À§¿¡ ÀÖÀ» ¶§ ¹ÝÀü ¸·´ë°¡ ÀÌ À©µµ¿ì À§¿¡ ±×·ÁÁú °ÍÀΰ¡, ¹Ø¿¡ ±×·ÁÁú °ÍÀΰ¡ÀÇ Â÷ÀÌ°¡ ÀÖ´Ù. ¾Æ´Ï¸é hdc=GetDCEx( hWnd, NULL, DCX_PARENTCLIP);À¸·Î DC¸¦ ±¸ÇØ DC¿¡¸¸ Â÷ÀÏµå ¿µ¿ª Ŭ¸®ÇÎ ¼Ó¼ºÀ» Àá½Ã ¹«½ÃÇÒ ¼öµµ ÀÖ´Ù. ¾Æ¹¸µç ±×³É GetDC·Î DC¸¦ ¾ò¾î¼­´Â Â÷Àϵå À§ÂÊ¿¡ ¹ÝÀü ¸·´ë¸¦ ±×¸®Áö ¸øÇÑ´Ù.

¹ÝÀü ¸·´ë¸¦ ¿¹»Ú°Ô ±×¸®±â À§ÇØ È¸»öÀÇ ÆÐÅÏ ºê·¯½Ã¸¦ ¸Å¹ø »ý¼ºÇÏ¿© »ç¿ëÇÑ´Ù. ÀÌ ºê·¯½Ã¸¦ ½ºÅÂƽ ¸â¹ö·Î Æ÷ÇÔ½ÃÄÑ ³õ°í LoadAeResource ÇÔ¼ö¿¡¼­ ¹Ì¸® »ý¼ºÇØ ³õÀ» ¼öµµ ÀÖÀ¸³ª »ç¿ëÀÚÀÇ µå·¡±× µ¿ÀÛÀÌ ºü¸£Áö ¾ÊÀ¸¹Ç·Î ÇÔ¼ö³»¿¡¼­ ¸¸µé°í »èÁ¦Çß´Ù. ¹ÝÀü ¸·´ëÀÇ ÆøÀº 4Çȼ¿·Î °íÁ¤µÇ¾î Àִµ¥ ºä°£ÀÇ °£°ÝÀÎ VGAP(6Çȼ¿)À¸·Î ÇÏ´Â °Íµµ ÁÁÀ¸³ª ³Ê¹« µÎ²¨¿ì¸é ¿¹»ÚÁö ¾Ê´Ù.

ÇÁ·¹ÀÓÀº ºÐÇÒ Áß¿¡ ¹ÝÀü¸·´ë¸¦ ±×¸®°í ¸¶¿ì½º ¹öÆ°À» ³õÀ¸¸é ½ÇÁ¦ ºÐÇÒÀ» ÇÏÁö¸¸ ºÐÇÒÀÌ µÇ±â Àü±îÁöÀÇ ¸ðµç µ¿ÀÛÀº ºä°¡ Á÷Á¢ ÇØ¾ß ÇÑ´Ù. µå·¡±×¸¦ ½ÃÀÛÇÏ°í ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÁßÀÎ µ¿¾È ¹ÝÀü ¸·´ë¸¦ °°ÀÌ À̵¿½ÃÅ°´Â °ÍÀº ¸ðµÎ ºä°¡ ÇØ¾ß ÇÒ ÀÏÀÌ´Ù. µå·¡±× 󸮸¦ À§ÇØ ´ÙÀ½ µÎ °³ÀÇ ¸â¹ö º¯¼ö¿Í ¼¼ °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¼±¾ðÇÏ°í InitView¿¡¼­ ¸â¹ö º¯¼ö´Â ¸ðµÎ 0À¸·Î ÃʱâÈ­ÇÑ´Ù.

 

class CApiEditText : public CWindow

{

protected:

     ....

     int iDrag;

     int OldSplit;

 

public:

     ....

     virtual BOOL StartSplit(HWND hWnd,BOOL fDoubleClick,int x,int y);

     virtual BOOL Spliting(HWND hWnd,int x,int y);

     virtual BOOL EndSplit(HWND hWnd,int x,int y);

};

 

void CApiEditText::InitView()

{

     ....

     iDrag=0;

     OldSplit=0;

     Invalidate(-1);

}

 

iDrag´Â ºÐÇÒ ¹æÇâÀ̸ç OldSplitÀº ºÐÇÒÁß ÀÌÀü ¹ÝÀü ¸·´ëÀÇ À§Ä¡¸¦ ±â¾ïÇÑ´Ù. ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À¸·Î ½ºÇø´ ¹Ú½º¸¦ ´©¸£¸é ºÐÇÒÀ» ½ÃÀÛÇ쵂 OnLButtonDown¿¡¼­ Á÷Á¢ ÀÌ Ã³¸®¸¦ ÇÏÁö ¾Ê°í StartSplitÀ̶ó´Â º°µµÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ºÐÇÒ ½ÃÀÛ µ¿ÀÛÀ» º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇÏ´Â ÀÌÀ¯´Â ÀÌÈÄ ÀÛ¼ºµÇ´Â ¸ðµç ÆÄ»ý ºä¿¡¼­ µ¿ÀÏÇÑ Äڵ尡 ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´­·¶À» ¶§ÀÇ µ¿ÀÛÀº ºäÀÇ Å¸ÀÔ¿¡ µû¶ó ´Þ¶óÁö°ÚÁö¸¸ ºÐÇÒÀ» ½ÃÀÛÇÏ´Â ¹æ¹ýÀº ºäÀÇ Å¸ÀÔ¿¡ »ó°ü¾øÀÌ µ¿ÀÏÇѵ¥ ÀÌ Äڵ带 º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇØ ³õÀ¸¸é ÆÄ»ý Ŭ·¡½º¿¡¼­ È£ÃâÇØ ¾µ ¼ö ÀÖ´Ù. ±â¹Ý Ŭ·¡½ºÀÇ ÇÔ¼ö´Â º°´Ù¸¥ ÀçÁ¤ÀǸ¦ ÇÏÁö ¾ÊÀ¸¸é ÆÄ»ý Ŭ·¡½º·Î ±×´ë·Î »ó¼ÓµÈ´Ù.

 

BOOL CApiEditText::StartSplit(HWND hWnd,BOOL fDoubleClick,int x,int y)

{

     RECT crt;

 

     GetClientRect(hWnd,&crt);

     if (bVertSplit && x > crt.right-SBW && y < SPLITWIDTH) {

          iDrag=AESPLIT_VERT;

     }

     if (bHorzSplit && x < SPLITWIDTH && y > crt.bottom-SBW) {

          iDrag=AESPLIT_HORZ;

     }

     if (iDrag) {

          SetCapture(hWnd);

          bCapture=TRUE;

          OldSplit=0;

          pFrame->DrawSplitBar(iDrag,OldSplit);

          return TRUE;

     }

     return FALSE;

}

 

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

{

     ....

     if (pt.x != x || pt.y != y) {

          return;

     }

    // ½ºÇø´ ¹Ú½º À§¸é â ºÐÇÒÀ» ½ÃÀÛÇÑ´Ù.

    if (StartSplit(hWnd,fDoubleClick,x,y)) {

        return;

    }

     ....

 

½ºÇø´ ¹Ú½º À§¿¡¼­ ¸¶¿ì½º¸¦ ´­·¶´ÂÁö Á¡°ËÇØ º¸µÇ ¾î¶² ½ºÇø´ ¹Ú½ºÀÎÁö¿¡ µû¶ó iDrag¿¡ ¹æÇâÀ» ´ëÀÔÇÑ´Ù. ¸¸¾à ½ºÇø´ ¹Ú½º°¡ ¾Æ´Ñ ´Ù¸¥ °÷À» ´­·¶´Ù¸é iDrag´Â 0ÀÇ °ªÀ» °¡Áö¸ç ÀÛ¾÷ ¿µ¿ª¿¡¼­ÀÇ ÀÔ·ÂÀ¸·Î Çؼ®µÈ´Ù. iDrag°¡ 0ÀÌ ¾Æ´Ï¸é Áï, ¾î´À ¹æÇâÀ¸·ÎµçÁö ½ºÇø´ ¹Ú½º¸¦ ´­·¶À¸¸é Ä¿¼­¸¦ ĸóÇÏ°í OldSplit¿¡ 0À» ´ëÀÔÇÏ¿© Á¦ÀÏ À§(¶Ç´Â Á¦ÀÏ ¿ÞÂÊ)¿¡¼­ºÎÅÍ ºÐÇÒÀÌ ½ÃÀ۵ǾúÀ½À» ±â¾ïÇØ ³õ´Â´Ù. ºÐÇÒ ¸í·É ÀÔ·ÂÀÌ ½ÃÀ۵ǾúÀ¸¹Ç·Î ÇÁ·¹ÀÓÀÇ DrawSplitBar ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÃÖÃÊ À§Ä¡¿¡ ¹ÝÀü ¸·´ë¸¦ Ãâ·ÂÇÏ¿´´Ù.

Æ÷¸ËÆà ¿µ¿ª¿¡¼­ ¸¶¿ì½º¸¦ ´©¸¥ °ÍÀÌ ¾Æ´Ï¹Ç·Î ´õ ÀÌ»óÀÇ Ã³¸®(ij·µ À̵¿, ¼±Åà ½ÃÀÛ)´Â ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç returnÇÑ´Ù. ÀÌÈÄÀÇ Ã³¸®´Â OnMouseMove¿¡¼­ ´ã´çÇÑ´Ù. iDrag°¡ 0ÀÌ ¾Æ´Ñ »óÅ¿¡¼­ ¸¶¿ì½º¸¦ À̵¿ÇÏ¸é ¹ÝÀü¸·´ë¸¦ °°ÀÌ À̵¿½ÃŲ´Ù. ÀÌ µ¿ÀÛµµ ºäÀÇ Å¸ÀÔ°ú »ó°ü¾øÀÌ µ¿ÀÏÇϹǷΠÀçÈ°¿ëÀ» À§ÇØ SplitingÀ̶ó´Â º°µµÀÇ ÇÔ¼ö¿¡ Äڵ带 ÀÛ¼ºÇß´Ù.

 

BOOL CApiEditText::Spliting(HWND hWnd,int x,int y)

{

     int tx,ty;

     RECT FrameRect;

 

     GetClientRect(pFrame->hWnd,&FrameRect);

     if (iDrag == AESPLIT_VERT) {

          ty=min(max(y,FrameRect.top),FrameRect.bottom-VGAP);

          if (OldSplit != ty) {

              pFrame->DrawSplitBar(iDrag,OldSplit);

              OldSplit=ty;

              pFrame->DrawSplitBar(iDrag,OldSplit);

          }

          return TRUE;

     }

     if (iDrag ==AESPLIT_HORZ) {

          tx=min(max(x,FrameRect.left),FrameRect.right-VGAP);

          if (OldSplit != tx) {

              pFrame->DrawSplitBar(iDrag,OldSplit);

              OldSplit=tx;

              pFrame->DrawSplitBar(iDrag,OldSplit);

          }

          return TRUE;

     }

     return FALSE;

}

 

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

{

     if (bCapture == FALSE) {

          return;

     }

     // â ºÐÇÒÁßÀÌ¸é ºÐÇÒÀ» ó¸®ÇÑ´Ù.

    if (Spliting(hWnd,x,y)) {

        return;

    }

     ....

 

¹ÝÀü ¸·´ëÀÇ ÇöÀç À§Ä¡ÀÎ OldSplit ÁÂÇ¥¿¡ DrawSplitBar·Î ´Ù½Ã ¹ÝÀü ¸·´ë¸¦ ±×·Á ¿ø·¡ ±×·ÁÁ® ÀÖ´ø ¹ÝÀü ¸·´ë´Â Áö¿î´Ù. DrawSplitBar ÇÔ¼ö´Â XOR ¹æ½ÄÀ¸·Î ¹ÝÀü ¸·´ë¸¦ ±×¸®±â ¶§¹®¿¡ °°Àº À§Ä¡¿¡ µÎ ¹ø Ãâ·ÂÇϸé Áö¿ì´Â °ÍÀÌ´Ù. ±×¸®°í OldSplitÀ» ÇöÀç Ä¿¼­ ÁÂÇ¥·Î ´ëÀÔÇÑ ÈÄ ´Ù½Ã ¹ÝÀü ¸·´ë¸¦ ±×¸°´Ù. ´Ü ÇöÀç Ä¿¼­ À§Ä¡´Â ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª ¾ÈÂÊÀ¸·Î Á¦ÇÑÇÏ¿© ¹ÝÀü ¸·´ë°¡ ÇÁ·¹ÀÓ ¹Ù±ùÀ» ¹þ¾î³ªÁö´Â ¾Êµµ·Ï ÇÏ¿´´Ù. ÀÌ·± ½ÄÀ¸·Î ¹ÝÀü ¸·´ë´Â ¸¶¿ì½º Ä¿¼­¸¦ Á¹Á¹ µû¶ó´Ù´Ï¸ç ¸¶¿ì½º ¹öÆ°À» ³õÀ» ¶§ ÇÁ·¹ÀÓ¿¡°Ô ºÐÇÒÀ» ¿äûÇÑ´Ù.

 

BOOL CApiEditText::EndSplit(HWND hWnd,int x,int y)

{

     int Ratio;

     RECT crt;

 

     GetClientRect(hWnd,&crt);

     if (iDrag) {

          pFrame->DrawSplitBar(iDrag,OldSplit);

          if (iDrag==AESPLIT_VERT) {

              Ratio=y*10000/(crt.bottom-crt.top);

          } else {

              Ratio=x*10000/(crt.right-crt.left);

          }

          if (Ratio > 500 && Ratio < 9500) {

              pFrame->SplitView(iDrag,Ratio);

          }

          iDrag=0;

          return TRUE;

     }

     return FALSE;

}

 

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

{

     ....

     // â ºÐÇÒÁßÀ̾úÀ¸¸é ºÐÇÒÀ» Á¾·áÇÑ´Ù.

    if (EndSplit(hWnd,x,y)) {

        return;

    }

 

     bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);

     ....

 

DrawSplitBar ÇÔ¼ö¸¦ ´Ù½Ã È£ÃâÇÏ¿© OldSplit¿¡ Ãâ·ÂµÇ¾î ÀÖ´Â ¹ÝÀü ¸·´ë´Â ÀÏ´Ü Áö¿î´Ù. ºÐÇÒ ¹æÇâ¿¡ µû¶ó ºÐÇÒ ºñÀ²À» °áÁ¤Çϴµ¥ ÀÛ¾÷ ¿µ¿ªÀÇ ³ôÀÌ(¶Ç´Â Æø)¿¡ ´ëÇØ ¸¶¿ì½º Ä¿¼­°¡ ¾îµðÂë ¿Í Àִ°¡·Î ºñÀ²À» °è»êÇÑ´Ù. ºñÀ²¿¡ 10000À» °öÇØ ¸¸ºÐÀ²À» ±¸Çߴµ¥ ¼Ò¼öÁ¡ ÀÌÇÏ µÎÀÚ¸®±îÁö À¯È¿ÇÑ ¹éºÐÀ²À̶ó°í »ý°¢Çصµ ¹«¹æÇÏ´Ù. ½Ç¼ö´Â ´À¸®±â ¶§¹®¿¡ Àû´çÇÑ ¼öÁØÀÇ Á¤¼ö°ªÀ» »ç¿ëÇÑ´Ù. ºÐÇÒ »óŸ¦ ºñÀ²·Î °ü¸®Çϱ⠶§¹®¿¡ ºÐÇÒµÈ »óÅ¿¡¼­ À©µµ¿ì Å©±â¸¦ º¯°æÇÒ ¶§ ºÐÇÒâÀÇ Å©±â°¡ À¯ÁöµÇÁö ¾Ê°í ºñÀ²¸¸ À¯ÁöµÈ´Ù.

ºÐÇÒ ºñÀ²ÀÌ ³Ê¹« À۰ųª Å©¸é ºÐÇÒÀº Ãë¼ÒµÈ´Ù. ÃÖ¼ÒÇÑ 5%~95% ¹üÀ§¿¡ ÀÖÀ» ¶§¸¸ âÀ» ºÐÇÒÇϴµ¥ ÀÌ´Â ºÐÇÒÀ» Ãë¼ÒÇÒ ¼ö ÀÖ´Â ÀåÄ¡ÀÌ´Ù. ½Ç¼ö·Î ½ºÇø´ ¹Ú½º¸¦ µå·¡±×Ç߰ųª ¾Æ´Ï¸é ÀÌ¹Ì ºÐÇÒµÈ Ã¢À» Ãë¼ÒÇÒ ¶§ ¹ÝÀü¸·´ë¸¦ µå·¡±×ÇÏ¿© À§ÂÊÀ̳ª ¾Æ·¡ÂÊÀ¸·Î µå·¡±×ÇØ ¹ö¸®¸é ºÐÇÒÀ» Ãë¼ÒÇÑ´Ù. ±×·¡¼­ º°µµÀÇ ºÐÇÒ Ãë¼Ò À¯Àú ÀÎÅÍÆäÀ̽º´Â Á¦°øµÇÁö ¾Ê´Â´Ù. ºÐÇÒ ºñÀ²ÀÌ ÀûÁ¤ ¹üÀ§¿¡ ÀÖÀ» ¶§´Â ÇÁ·¹ÀÓÀÇ SplitView ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºÐÇÒÀ» ¿äûÇÑ´Ù. °á±¹ ºä°¡ ÇÏ´Â ÀÏÀº ½ÇÁ¦·Î ºä¸¦ ºÐÇÒÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀڷκÎÅÍ ºÐÇÒ ¸í·ÉÀ» ¹Þ¾Æ¼­ ÇÁ·¹ÀÓ¿¡°Ô Àü´ÞÇÏ´Â °Í »ÓÀÌ´Ù.

¸¶. ÆíÁýâ ºÐÇÒ

ÇÁ·¹ÀÓÀº ºäÀÇ ºÐÇÒÀº ¹°·ÐÀÌ°í ºÐÇÒ Ãë¼Ò, ºÐÇÒ ºñÀ² Á¶Á¤, ºÐÇÒ ÈÄ °¢ ºäÀÇ ºÐÇÒ °¡´É¼º °ü¸®, ºÐÇÒµÈ ºäÀÇ ¹èÄ¡ µî ¿©·¯ °¡Áö ÀÏÀ» ÇÑ´Ù. CApiEdit ÇÁ·¹ÀÓ¿¡ âºÐÇÒ °ü·Ã ¸â¹ö º¯¼ö¿Í ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

class CApiEdit : public CWindow

{

private:

     ....

     int iDrag;

     POINT SplitPt;

     int OldSplitX,OldSplitY;

     DWORD SplitFlag;

 

public:

     ....

     int VertRatio;

     int HorzRatio;

     ....

     void SplitView(int SplitType, int Ratio);

     BOOL IsInDBCS(int nPos);

     void CloneView(CApiEditText *pDest, CApiEditText *pSrc,int SplitType);

     void AdjustSplitable();

     void UnSplitView(int SplitType);

     void ChangeActiveView(CApiEditText *pAe,int Who);

     void UpdateViews(CApiEditText *pView,int nPos,int nCount);

     void EnableSplit(DWORD Flag);

 

ºÐÇÒ »óÅ´ ÇÁ·¹ÀÓÀÇ »óÅÂ(=ÄÁÆ®·ÑÀÇ »óÅÂ)À̱⠶§¹®¿¡ º°µµÀÇ ¸â¹ö º¯¼ö¿¡ ÀúÀåÇØ¾ß ÇÑ´Ù. VertRatio, HorzRatio´Â ¼öÁ÷, ¼öÆò ºÐÇÒ ºñÀ²ÀÌ¸ç ¸¸ºÐÀ²Àε¥ ÀÌ °ªÀÌ 0ÀÌ¸é ºÐÇҵǾî ÀÖÁö ¾ÊÀº °ÍÀÌ°í 5000À̸é Àý¹ÝÀ¸·Î ºÐÇҵǾî ÀÖ´Â »óÅÂÀÌ´Ù. ÇÁ·¹ÀÓÀÇ ºÐÇÒ »óÅ´ ÆíÁý Á¤º¸ ÀúÀå¿¡¼­ ÂüÁ¶Çϱ⠶§¹®¿¡ public ¿µ¿ª¿¡ ¼±¾ðÇß´Ù. iDrag¿Í OldSplitX, OldSplitY´Â ºäÀÇ °æ¿ì¿Í µ¿ÀÏÇ쵂 µÎ ¹æÇâÀ¸·Î µ¿½Ã¿¡ µå·¡±×ÇÒ ¼ö Àֱ⠶§¹®¿¡ Old°ªÀÌ µÎ °³ ÇÊ¿äÇÏ´Ù´Â Á¡¸¸ ´Ù¸£´Ù. SplitFlag´Â ºÐÇÒ °¡´ÉÇÑ ¹æÇâÀ» Áö½ÃÇÏ´Â ÄÁÆ®·Ñ Àü¿ª ¼³Á¤ °ªÀÌ´Ù. »ý¼ºÀÚ¿¡¼­ ÀÌ º¯¼öµéÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

CApiEdit::CApiEdit()

{

     ....

     VertRatio=0;

     HorzRatio=0;

     iDrag=0;

     SplitFlag=AESPLIT_VERT | AESPLIT_HORZ;

}

 

½ÇÁ¦·Î ÄÁÆ®·ÑÀÇ ÀÛ¾÷ ¿µ¿ªÀ» ºÐÇÒÇÏ´Â ÇÔ¼ö´Â SplitViewÀÌ¸ç ºäÀÇ OnLButtonUp¿¡¼­ È£ÃâÇÑ´Ù. Àμö·Î ºÐÇÒ ¹æÇâ°ú ºÐÇÒ ºñÀ²ÀÌ Àü´ÞµÇ´Âµ¥ ÀÌ´Â ÃÖÃÊ »ç¿ëÀÚ°¡ ¾î¶² ½ºÇø´ ¹Ú½º¸¦ µå·¡±×Çß´ÂÁö¿Í ¾îµðÂë¿¡¼­ ¸¶¿ì½º ¹öÆ°À» ³õ¾Ò´ÂÁö¿¡ µû¶ó ´Þ¶óÁú °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ¼öÁ÷ ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¿© Àý¹Ý À§Ä¡¿¡¼­ ¹öÆ°À» ³õ¾Ò´Ù¸é SplitTypeÀº AESPLIT_VERT°¡ µÇ¸ç Ratio´Â 5000ÀÌ µÉ °ÍÀÌ´Ù.

 

// SplitType ¹æÇâÀ¸·Î Ratio ºñÀ²¸¸Å­ âÀ» ºÐÇÒÇÑ´Ù.

void CApiEdit::SplitView(int SplitType, int Ratio)

{

     // ¼öÁ÷ ºÐÇÒ

     if (SplitType == AESPLIT_VERT) {

          // ºÐÇÒµÇÁö ¾Ê¾ÒÀ¸¸é 2ºÐÇÒÇÑ´Ù.

          if (arView[1]==NULL) {

              arView[1]=CreateView(arView[0]->ViewType);

              CloneView(arView[1],arView[0],SplitType);

          // 2ºÐÇÒÀ̸é 4ºÐÇÒÇÑ´Ù.

          } else {

              arView[2]=CreateView(arView[0]->ViewType);

              CloneView(arView[2],arView[0],SplitType);

              arView[3]=CreateView(arView[1]->ViewType);

              CloneView(arView[3],arView[1],SplitType);

          }

          VertRatio=Ratio;

     // ¼öÆò ºÐÇÒ

     } else {

          if (arView[1]==NULL) {

              arView[1]=CreateView(arView[0]->ViewType);

              CloneView(arView[1],arView[0],SplitType);

          } else {

              arView[2]=arView[1];

              arView[1]=CreateView(arView[0]->ViewType);

              CloneView(arView[1],arView[0],SplitType);

              arView[3]=CreateView(arView[2]->ViewType);

              CloneView(arView[3],arView[2],SplitType);

          }

          HorzRatio=Ratio;

     }

     SendMessage(hWnd,WM_SIZE,0,0);

     InvalidateRect(hWnd,NULL,TRUE);

     AdjustSplitable();

}

 

ÀÌ ÇÔ¼ö°¡ ÇÁ·¹ÀÓÀ» ¾î¶»°Ô ºÐÇÒÇÒ °ÍÀΰ¡´Â ÇöÀç ºÐÇÒ »óÅ°¡ ¾î¶²°¡¿¡ µû¶ó ´Þ¶óÁö¸ç ÇöÀç ºÐÇÒ »óÅ´ arView[1]À» ÀÐ¾î º¸¸é ¾Ë ¼ö ÀÖ´Ù. arView[1]ÀÌ NULLÀÌ¸é ºÐÇҵǾî ÀÖÁö ¾ÊÀº °ÍÀÌ°í NULLÀÌ ¾Æ´Ï¸é 2°³·Î ÀÌ¹Ì ºÐÇҵǾî ÀÖ´Â °ÍÀÌ´Ù. ºÐÇҵǾî ÀÖÁö ¾ÊÀº »óÅ¿¡¼­ ºÐÇÒ ¸í·ÉÀ» ¹Þ¾ÒÀ¸¸é ¹æÇâ¿¡ µû¶ó ºä Çϳª¸¦ ´õ »ý¼ºÇÏ¸é µÇ°í ÀÌ¹Ì ºÐÇҵǾî ÀÖ´Ù¸é µÎ °³ÀÇ ºä¸¦ »õ·Î ¸¸µé¾î¾ß ÇÑ´Ù.

ºÐÇҵǾî ÀÖ´Â »óÅ¿¡¼­ ¼öÁ÷ ºÐÇÒ ¸í·ÉÀ» ¹Þ¾Ò´Ù¸é ±âÁ¸ ºÐÇÒÀº ¼öÆòÀ̶ó´Â °ÍÀ» ½±°Ô À¯ÃßÇÒ ¼ö ÀÖ´Ù. ApiEdit´Â ÃÖ´ë 4ºÐÇÒ±îÁö¸¸ °¡´ÉÇÏ¸ç ¼öÆò ºÐÇÒµÈ »óÅ¿¡¼­ ´Ù½Ã ¼öÆò ºÐÇÒ ¸í·ÉÀº ¿Ã ¼ö°¡ ¾ø°í ¸¶Âù°¡Áö·Î ¼öÁ÷ ºÐÇÒµÈ »óÅ¿¡¼­´Â ´Ù½Ã ¼öÁ÷À¸·Î ºÐÇÒÇÏÁö ¸øÇϱ⠶§¹®ÀÌ´Ù. 4ºÐÇÒ µÈ »óÅ¿¡¼­´Â ¾î¶² ºÐÇÒ ¸í·Éµµ ¿ÀÁö ¸øÇÑ´Ù. SplitViewÀÇ ºÐÇÒ ÄÚµå´Â ´ÙÀ½ ±×¸²Ã³·³ µ¿ÀÛÇÑ´Ù.

ºÐÇÒµÇÁö ¾ÊÀº »óÅ¿¡¼­ ¼öÁ÷À¸·Î ºÐÇÒÇÏ´Â Äڵ带 ºÐ¼®ÇØ º¸ÀÚ. CreateView·Î ±âÁ¸ 0¹ø ºä¿Í °°Àº ŸÀÔÀÇ ºä¸¦ »ý¼ºÇÏ¿© arView[1]¿¡ ±× Æ÷ÀÎÅ͸¦ ´ëÀÔÇÑ´Ù. ±×¸®°í 0¹ø ºäÀÇ ¼Ó¼ºÀ» 1¹ø ºä·Î º¹»çÇÏ°í VertRatio¿¡ ºÐÇÒ ºñÀ²À» ´ëÀÔÇÏ¸é µÈ´Ù. ¼Ó¼ºÀ» º¹Á¦ÇÒ ¶§´Â CloneView ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ Àá½Ã ÈÄ ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ÀÌ·¸°Ô ºä¸¦ »ý¼ºÇØ ³õ±â¸¸ ÇÏ¸é ºä¸¦ ¹èÄ¡ÇÏ´Â ÀÏÀº OnSize¿¡¼­ ÇÏ¸ç ±×¸²ÀÇ ¿À¸¥ÂÊ À§¿Í °°Àº »óÅ°¡ µÈ´Ù. ¼öÆòÀ¸·Î 2ºÐÇÒÇÒ¶§µµ µ¿ÀÏÇÏ´Ù.

´ÙÀ½Àº ¼öÆò 2ºÐÇÒ(±×¸² ¿ÞÂÊ ¾Æ·¡) »óÅ¿¡¼­ 4ºÐÇÒÇÏ´Â Äڵ带 º¸ÀÚ. 0¹ø ºä¸¦ º¹»çÇÏ¿© 2¹ø ºä¸¦ ¸¸µé°í 1¹ø ºä¸¦ º¹»çÇÏ¿© 3¹ø ºä¸¦ ¸¸µé¸é µÈ´Ù. ¹Ù·Î À§¿¡ ÀÖ´Â ºä¸¦ º¹»çÇÏ¿© ¾Æ·¡ÂÊ¿¡ »õ ºä¸¦ ¸¸µé¸é µÈ´Ù. ¼öÁ÷ 2ºÐÇÒ »óÅ¿¡¼­ 4ºÐÇÒÇÒ ¶§´Â Á¶±Ý º¹ÀâÇѵ¥ ºäÀÇ ¼ø¼­¸¦ ¾à°£ Á¶Á¤ÇØ¾ß ÇÑ´Ù.

0¹ø°ú 1¹ø ºä°¡ ¾Æ·¡ À§·Î ¹èÄ¡µÇ¾î Àִµ¥ 0¹øÀ» ¿ÞÂÊÀ¸·Î º¹Á¦Çؼ­ 2¹øÀ» ¸¸µé°í 1¹øÀ» º¹Á¦Çؼ­ 3¹øÀ» ¸¸µé¸é ¾Æ·¡ ±×¸²Ã³·³ µÇ¾î ¹ö¸®´Âµ¥ ÀÌ·¸°Ô ÇÏ¸é ¾ÈµÈ´Ù. arView[1]À» ±×´ë·Î ´ëÀÔÇÏ¿© arView[2]¿¡ ´ëÇǽÃÄÑ ³õ°í 0¹øÀ» º¹Á¦Çؼ­ 1¹øÀ» ´Ù½Ã ¸¸µé°í ´ëÇÇµÈ 2¹øÀ» º¹Á¦Çؼ­ 3¹øÀ» ¸¸µé¾î¾ß ÇÑ´Ù. arView ¹è¿­¿¡ ±â¾ïµÈ °ªÀº ºäÀÇ Æ÷ÀÎÅÍÀ̹ǷΠƯº°ÇÑ Ã³¸®¾øÀÌ Æ÷ÀÎÅ͸¦ ¹Ù·Î ´ëÀÔÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

ÀÌ·¸°Ô ÇØ¾ß ºäÀÇ ¹øÈ£°¡ Ç×»ó Á¿¡¼­ ¿ì·Î, À§¿¡¼­ ¾Æ·¡·Î È帣µµ·Ï À¯ÁöµÇ´Âµ¥ ºäÀÇ ¼ø¼­¿¡ ´ëÇØ ÀÏÁ¾ÀÇ Á¤±ÔÈ­(Normalize)¸¦ ÇÏ´Â °ÍÀÌ´Ù. ºäÀÇ ¼ø¼­¸¦ ÀÏÁ¤ÇÏ°Ô À¯ÁöÇØ¾ß ºä°£ÀÇ Æ÷Ä¿½º ÀüȯÀÌ ÀÚ¿¬½º·´°í ºä¸¦ Ãë±ÞÇÏ´Â ¸ðµç ÇÔ¼öµéÀÇ µ¿ÀÛÀÌ °£´ÜÇØÁø´Ù. ´ÙÀ½ ÇÔ¼ö´Â ºÐÇÒ ÈÄ ºäÀÇ ½ºÇø´ ¹Ú½º¸¦ °ü¸®Çϸç SplitView ÇÔ¼ö´Â ºä¸¦ ºÐÇÒÇÑ Á÷ÈÄ¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

// ºÐÇÒµÈ ºäÀÇ ½ºÇø´ ¹Ú½º¸¦ °ü¸®ÇÑ´Ù.

void CApiEdit::AdjustSplitable()

{

     int i;

 

     if (arView[1]==NULL) {

          arView[0]->SetHorzSplit(TRUE);

          arView[0]->SetVertSplit(TRUE);

     } else if (arView[2]==NULL) {

          if (VertRatio) {

              arView[0]->SetHorzSplit(TRUE);

              arView[0]->SetVertSplit(FALSE);

              arView[1]->SetHorzSplit(TRUE);

              arView[1]->SetVertSplit(FALSE);

          } else {

              arView[0]->SetHorzSplit(FALSE);

               arView[0]->SetVertSplit(TRUE);

              arView[1]->SetHorzSplit(FALSE);

              arView[1]->SetVertSplit(TRUE);

          }

     } else {

          for (i=0;i<4;i++) {

              arView[i]->SetHorzSplit(FALSE);

              arView[i]->SetVertSplit(FALSE);

          }

     }

}

 

ÄÚµå´Â »ó½ÄÀûÀ¸·Î ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ºÐÇҵǾî ÀÖÁö ¾ÊÀ¸¸é ºä´Â ¾ç¹æÇâ ¸ðµÎ ºÐÇÒ °¡´ÉÇÏÁö¸¸ ºÐÇҵǾî ÀÖÀ¸¸é ÀÌ¹Ì ºÐÇÒµÈ ¹æÇâÀ¸·Î´Â ºÐÇÒÀ» ±ÝÁöÇÑ´Ù. ¿¹¸¦ µé¾î ¼öÆòÀ¸·Î ºÐÇҵǾî ÀÖ´Ù¸é ÀÌ ºä´Â ´õ ÀÌ»ó ¼öÆòÀ¸·Î ºÐÇÒÇÒ ¼ö ¾øÀ¸¸ç ¸¶Âù°¡Áö·Î ¼öÁ÷À¸·Î ºÐÇҵǾî ÀÖ´Ù¸é ¼öÁ÷ ºÐÇÒÀÌ ±ÝÁöµÈ´Ù. 4ºÐÇҵǾî ÀÖ´Â »óȲÀÌ¸é ¾çÂÊ ¸ðµÎ ºÐÇÒ ±ÝÁöµÈ´Ù. °¢ ºäÀÇ ºÐÇÒ °¡´É¼ºÀº SetHorzSplit, SetVertSplit ÇÔ¼ö·Î Á¦¾îÇÒ ¼ö ÀÖ´Ù. ºä´Â ÀÌ ÇÔ¼ö°¡ È£ÃâµÇ¾úÀ» ¶§ Àμö°ª¿¡ µû¶ó ½ºÅ©·Ñ ¹Ù À§³ª ¿ÞÂÊÀÇ ½ºÇø´ ¹Ú½º¸¦ º¸¿© Áְųª ¼û±èÀ¸·Î½á ºÐÇÒ °¡´É¼ºÀ» ÅëÁ¦ÇÑ´Ù. ½ºÇø´ ¹Ú½º°¡ ¾øÀ¸¸é ÃÖÃÊ ºÐÇÒ ½ÃÀÛÀ» ÇÒ ¼ö ¾øÀ¸¹Ç·Î ÇØ´ç ¹æÇâÀ¸·Î´Â ºÐÇÒÇÒ ¼ö ¾ø´Ù.

ºÐÇÒµÈ ¹æÇâÀ¸·Î ´Ù½Ã ºÐÇÒÀ» Çã¿ëÇÏÁö ¾Ê±â ¶§¹®¿¡ ÃÖ´ë 4ºÐÇÒ¹Û¿¡ Áö¿øÀ» ÇÏÁö ¸øÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à 9ºÐÇÒÀ̳ª ±× ÀÌ»óµµ °¡´ÉÇÏ°Ô ÇÏ°í ½Í´Ù¸é ÀÌ ÇÔ¼ö°¡ Á» ´õ º¹ÀâÇØÁú °ÍÀÌ°í ±×¿Ü ºä¸¦ °ü¸®ÇÏ´Â ¸ðµç ÇÔ¼öÀÇ ³í¸®°¡ ÈξÀ ´õ Á¤±³ÇØÁ®¾ß ÇÒ °ÍÀÌ´Ù. ÇÁ·¹ÀÓ/ºä·Î °´Ã¼°¡ ³ª´©¾îÁ® ÀÖ´Â ±¸Á¶¿¡¼­ 4ºÐÇÒ ÀÌ»ó±îÁö Áö¿øÇÏ°íÀÚ ÇÑ´Ù¸é ±»ÀÌ ¸øÇÒ °Íµµ ¾øÁö¸¸ º¹Àâµµ¿¡ ºñÇØ ½Ç¿ë¼ºÀÌ Å©°Ô ¶³¾îÁö¹Ç·Î ApiEdit´Â ±× ÀÌ»óÀÇ ºÐÇÒÀº Áö¿øÇÏÁö ¾Ê´Â´Ù. Äڵ尡 º¹ÀâÇØÁö´Â °Íµµ ¹®Á¦°¡ µÇÁö¸¸ ¸·»ó 9ºÐÇÒ ¶Ç´Â 16ºÐÇÒÀ» Áö¿øÇÑ´Ù°í ÇßÀ» ¶§ ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇÏ´Â »ç¶÷µµ ¾îÁö°£È÷ Çò°¥·Á¼­ Á¤½ÅÀÌ ¾øÀ» °ÍÀÌ´Ù.

¹Ù. ºäÀÇ º¹Á¦

»õ·Î ¸¸µé¾îÁø ºä´Â ±âÁ¸ ºäÀÇ ¼Ó¼º Áß ÀϺθ¦ º¹Á¦ÇØ¾ß ÇÑ´Ù. °¡·É ±âÁ¸ ºä°¡ ÀÚµ¿ °³Çà »óÅ¿´´Ù¸é ºÐÇÒµÇ¾î »õ·Î ¸¸µé¾îÁö´Â ºäµµ ÀÚµ¿ °³Çà »óÅ·Π»ý¼ºµÇ´Â °ÍÀÌ ÁÁ°í ÁÙ°£À̳ª ±Û²Ã, º¸±â »óÅÂ, »ö»ó µîµµ °¡±ÞÀûÀ̸é ÀÏÄ¡½ÃÅ°´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ÀÌ·± ºäÀÇ º¹Á¦ ÀÛ¾÷Àº CloneView¶ó´Â ÇÔ¼ö°¡ ´ã´çÇϴµ¥ ÇÔ¼ö À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ ¶È°°Àº ¼Ó¼ºÀ» °¡Áö´Â ºä¸¦ ¸¸µç´Ù.

SplitView ÇÔ¼ö´Â CreateView·Î »õ·Î¿î ºä¸¦ ¸¸µé¸é¼­ µ¿½Ã¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºäÀÇ ¼Ó¼ºÀ» ¶È°°ÀÌ º¹Á¦ÇÏ¿© ½ÖµÕÀÌ µ¿»ýÀ» ¸¸µç´Ù. ÄÚµå´Â ´ÙÀ½°ú °°À¸¸ç ´Ù¼Ò ±æÀÌ°¡ ±ä ÆíÀε¥ ¸ðµç ¼Ó¼ºÀ» ÇѲ¨¹ø¿¡ ´ëÀÔÇÒ ¼ö´Â ¾ø°í ¼±º°ÀûÀ¸·Î º¹Á¦¸¦ ÇØ¾ß Çϴµ¥´Ù º¹Á¦ ½Ã°£À» ª°Ô Çϱâ À§ÇØ º¹Á¦ ¼ø¼­¿¡µµ ½Å°æÀ» ½á¾ß Çϱ⠶§¹®ÀÌ´Ù.

 

// nPos°¡ DBCS ¹®ÀÚÀÇ µÞ¹ÙÀÌÆ®ÀÎÁö¸¦ Á¡°ËÇÑ´Ù.

BOOL CApiEdit::IsInDBCS(int nPos)

{

     int toff;

 

     toff=max(0,nPos-32);

     for (;toff < nPos;) {

          if (IsDBCS(toff)) {

              toff+=2;

          } else {

              toff++;

          }

     }

     return (toff!=nPos);

}

 

// ºä¸¦ º¹Á¦ÇÑ´Ù.

void CApiEdit::CloneView(CApiEditText *pDest, CApiEditText *pSrc,int SplitType)

{

     LOGFONT logfont;

     int ViewFirstLine, ViewFirstOff,pr,pc;

 

     // ±Û²Ã °ü·Ã ¼Ó¼º º¹»ç

     pDest->LineRatio=pSrc->LineRatio;

     pDest->SetWrap(pSrc->nWrap);

     pDest->bNoFirstSpace=pSrc->bNoFirstSpace;

     pDest->TabWidth=pSrc->TabWidth;

     pDest->RightWrap=pSrc->RightWrap;

     pSrc->GetFont(&logfont);

     pDest->SetFont(&logfont);

 

     // º¸À̱⠰ü·Ã ¼Ó¼º º¹»ç

     pDest->MarginWidth=pSrc->MarginWidth;

     pDest->bShowLineNum=pSrc->bShowLineNum;

     pDest->bShowTab=pSrc->bShowTab;

     pDest->bShowEnter=pSrc->bShowEnter;

     pDest->bShowSpace=pSrc->bShowSpace;

     pDest->ShowTabType=pSrc->ShowTabType;

     pDest->ShowEnterType=pSrc->ShowEnterType;

     pDest->ShowSpaceType=pSrc->ShowSpaceType;

     pDest->ColMark=pSrc->ColMark;

 

     // ºÐ¼®±â ÁöÁ¤

     pDest->SetParser((int)pSrc->GetParser()->GetInfo(0));

     Option.SetStyleColor(pDest->GetParser());

 

     // ÆíÁý À§Ä¡ º¹»ç. Çí»ç ºä¿¡¼­ ÅؽºÆ® ºä·Î º¹»çÇÒ ¶§´Â DBCS °æ°è¿¡ °ÉÄ¡Áö ¾Êµµ·Ï Á¶Á¤ÇÑ´Ù.

     if (pSrc->ViewType==HEXA_VIEW && pDest->ViewType==TEXT_VIEW && IsInDBCS(pSrc->off)) {

          pDest->off=GetPrevOff(pSrc->off);

     } else {

          pDest->off=pSrc->off;

     }

 

     // ºÏ¸¶Å©´Â °°Àº ŸÀÔÀÇ ºä³¢¸®¸¸ º¹»çÇÑ´Ù. SplitTypeÀÌ 3ÀÎ °æ¿ì´Â ºäÀÇ Å¸ÀÔÀÌ º¯°æµÉ ¶§ÀÌ´Ù.

     if (SplitType != 3) {

          memcpy(pDest->arMark,pSrc->arMark,sizeof(int)*MAXBOOKMARK);

     }

 

     // ¼öÁ÷ ½ºÅ©·Ñ À§Ä¡ º¹»ç

     if (SplitType==AESPLIT_VERT) {

          pDest->yPos=pSrc->yPos;

     } else if (SplitType==AESPLIT_HORZ) {

          if (pDest->nWrap==0 || pSrc->ViewType!=TEXT_VIEW) {

              pDest->yPos=pSrc->yPos;

          } else {

              ViewFirstLine=pSrc->yPos/pSrc->LineHeight;

              ViewFirstOff=pSrc->pLine[ViewFirstLine].Start;

              pSrc->GetParaFromOff(ViewFirstOff,pr,pc);

              ViewFirstLine=pDest->GetParaFirstLine(pr);

              pDest->yPos=ViewFirstLine*pDest->LineHeight;

          }

     }

}

 

¾î¶² ¸â¹ö¸¦ º¹Á¦ÇÏ°í ¾î¶² ¸â¹ö´Â º¹Á¦ÇÏÁö ¸»¾Æ¾ß Çϴ°¡´Â »ó½ÄÀûÀÎ ¼öÁØ¿¡¼­ ½±°Ô ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀÏ´Ü Àý´ë·Î º¹Á¦Çؼ­´Â ¾ÈµÇ´Â ¸â¹ö°¡ Àִµ¥ hWnd À©µµ¿ì ÇÚµéÀº ºä¸¶´Ù °íÀ¯ÇØ¾ß ÇϹǷΠº¹Á¦ ´ë»óÀÌ ¾Æ´Ï´Ù. ¶ÇÇÑ pLine Á¤·Ä Á¤º¸µµ ºäÀÇ ½ÇÁ¦ Æø¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î º¹Á¦Çؼ­´Â ¾ÈµÇ¸ç ºä¸¦ ¸¸µç ÈÄ¿¡ ´Ù½Ã Á¤·ÄÇÏ¿© »õ·Î ¸¸µé¾î¾ß ÇÑ´Ù. ±Û²Ã¿¡ ´ëÇÑ Á¤º¸´Â º¹Á¦ÀÇ ´ë»óÀÌÁö¸¸ ±Û²ÃÀÇ Æ¯¼º°ªÀÎ FontHeight, FontWidth µîÀº º¹Á¦ÇÒ ÇÊ¿ä°¡ ¾ø´Â °ªÀÌ´Ù. ¶ÇÇÑ LineRatio·ÎºÎÅÍ ±¸ÇØÁö´Â LineHeight, TabWidth·ÎºÎÅÍ ±¸ÇØÁö´Â TabSize µîµµ º¹Á¦ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ±Û²ÃÀÇ Æø¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö´Â arChWidth, arHanWidthµµ SetFont¿¡¼­ °è»êµÇ¹Ç·Î º¹Á¦ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

¼±Åà ¿µ¿ªÀ» °¡¸®Å°´Â SelStart¿Í SelEnd´Â º¹Á¦¸¦ ÇÒ ¼öµµ ÀÖ°í ÇÏÁö ¾ÊÀ» ¼öµµ Àִµ¥ ÀÌ °ªÀ» ±×´ë·Î º¹Á¦ÇÏ¸é »õ·Î »ý¼ºµÈ ºäµµ ±âÁ¸ ºä¿Í µ¿ÀÏÇÑ ¼±Åà ¿µ¿ªÀ» °¡Áú °ÍÀÌ´Ù. ApiEdit´Â Á¤Ã¥»ó ¼±Åà ¿µ¿ªÀº º¹Á¦ÇÏÁö ¾Ê±â·Î °áÁ¤ÇßÀ¸¹Ç·Î ÀÌ µÎ º¯¼ö´Â º¹Á¦ ´ë»ó¿¡¼­ Á¦¿ÜµÈ´Ù. ±×¿Ü ³ª¸ÓÁö ÁÙ°£, ÅÇÆø, ÀÚµ¿ °³Çà ¹æ½Ä, ÀÚµ¿ °³Çà ¿­, ±Û²Ã µîÀº ¸ðµÎ º¹Á¦Ç쵂 Set ÇÔ¼ö¸¦ ÀÏÀÏÀÌ È£ÃâÇÒ ÇÊ¿ä´Â ¾ø°í º¯¼ö¿¡ Á÷Á¢ ´ëÀÔÇÑ ÈÄ SetFont¸¸ È£ÃâÇÏ¸é µÈ´Ù. SetFont ÇÔ¼ö´Â ´ëÀÔµÈ °ªÀ» ±Ù°Å·Î ÆÄ»ý°ªÀ» °è»êÇØ ³»¸ç Àüü Á¤·ÄÇÏ¿© pLine±îÁö »ý¼ºÇÑ´Ù.

Ãâ·Â¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â °ªµéÀº ´Ü¼øÈ÷ º¹»çÇϱ⸸ ÇÏ¸é µÈ´Ù. ¸¶Áø ÆøÀ̳ª °¢Á¾ º¸±â ¿É¼Ç°ªµéÀº OnPaint°¡ È£ÃâµÇ±â Àü¿¡´Â »ç¿ëµÇÁö ¾ÊÀ¸¹Ç·Î CloneView¿¡¼­ º¹»ç¸¸ ÇØ ³õÀ¸¸é ºä°¡ È­¸é¿¡ º¸À̱â Àü¿¡ Àû¿ëµÈ´Ù. ÀÌ °ªµéÀº Á¤·Ä »óÅ¿¡ ÀüÇô ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê±â ¶§¹®¿¡ SetFont ÈÄ¿¡ ´ëÀÔ¸¸ ÇÏ¸é µÈ´Ù.

º¹»ç ¹æ¹ýÀÌ Á» Ư¼öÇÑ °Íµµ Àִµ¥ ºÐ¼®±â´Â °´Ã¼À̱⠶§¹®¿¡ ±× Æ÷ÀÎÅ͸¦ º¹»çÇÏ´Â °ÍÀº Àǹ̰¡ ¾ø°í ±âÁ¸ ºäÀÇ ºÐ¼®±â ID¸¦ Á¶»çÇÑ ÈÄ »õ ºä¿¡µµ µ¿ÀÏÇÑ IDÀÇ ºÐ¼®±â¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¡¾ß »õ·Î »ý¼ºµÇ´Â ºäµµ ÀڽŸ¸ÀÇ °íÀ¯ÇÑ ºÐ¼®±â °´Ã¼¸¦ °¡Áú ¼ö ÀÖ´Ù. ¶ÇÇÑ ºÐ¼®±â´Â »ý¼ºµÉ ¶§¸¶´Ù °¢ ±¸¹®¿¡ Àû¿ëµÇ´Â »ö»óÀ» ¿É¼ÇÀ¸·ÎºÎÅÍ º¹»ç¹Þ¾Æ¾ß ÇϹǷΠSetStyleColor ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ±×·¡¼­ ¿É¼Ç¿¡¼­ º¯°æÇÑ ±¸¹® ºÐ¼® »ö»óÀÌ ºÐÇÒµÈ Ã¢¿¡µµ Àû¿ëµÈ´Ù.

ÇöÀç ÆíÁý À§Ä¡¸¦ °¡¸®Å°´Â off´Â ´ë°³ÀÇ °æ¿ì ´Ü¼ø º¹»ç°¡ °¡´ÉÇÏ´Ù. ±×·¯³ª ¾ÆÁÖ Æ¯¼öÇÑ °æ¿ì´Â ¾à°£ÀÇ Á¶ÀÛÀÌ ÇÊ¿äÇѵ¥ Çí»ç ºä¿¡¼­ ÇѱÛÀÇ °æ°è¸¦ °¡¸®Å°°í ÀÖÀ» ¶§´Â ÇѱÛÀÇ ½ÃÀÛ À§Ä¡¸¦ °¡¸®Å°µµ·Ï off¸¦ Á¶Á¤ÇØ¾ß ÇÑ´Ù. ±ÔÄ¢»ó off°¡ DBCSÀÇ °æ°è¿¡ ¿Ã ¼ö ¾øÀ¸¸ç À̸¦ ¹æÄ¡ÇÏ¸é ¿ÀÇÁ¼ÂÀ» °ü¸®ÇÏ´Â ÇÔ¼öµéÀÌ Á¤½ÅÀ» ¸øÂ÷¸°´Ù. DBCSÀÇ °æ°è¿¡ ÀÖ´ÂÁö´Â IsInDBCS ÇÔ¼ö°¡ ÆǺ°ÇÏ¸ç °æ°è¿¡ ÀÖÀ» °æ¿ì ¹Ù·Î ¾Õ ¹®ÀÚ¸¦ ãÀ½À¸·Î½á DBCS ¼±µÎ¿¡ off¸¦ ¸ÂÃá´Ù.

IsInDBCS ÇÔ¼ö´Â ¾ÕÂÊ 32¹ÙÀÌÆ®·Î À̵¿ÇÑ ÈÄ ¿©±â¼­ºÎÅÍ ¼¼¾î ¿ÀµÇ ´Ü À½¼ö ¿ÀÇÁ¼ÂÀ¸·Î´Â À̵¿ÇÏÁö ¾Ê´Â´Ù. ¾îµð±îÁö³ª È®·üÀûÀÎ °è»ê¿¡ ÀÇÁöÇÏ´Â ¹æ½ÄÀε¥ Á¤È®ÇÑ ¹æ¹ýÀº ¾Æ´ÏÁö¸¸ Ʋ¸°´Ù°í Çصµ Å©°Ô ¹®Á¦µÇÁö´Â ¾ÊÀ¸¹Ç·Î ÀÏ´Ü °£´ÜÇÑ ¹æ¹ýÀ» ¾²±â·Î ÇÏÀÚ. 32¹ÙÀÌÆ® ¾ÕÂÊ¿¡¼­ºÎÅÍ °è»êÇØ ¿À¸é Ʋ¸± È®·üÀÌ °ÅÀÇ ¾øÁö¸¸ Â÷ÈÄ¿¡ Á» ´õ °³¼±ÇÒ ¿©Áö°¡ ÀÖ´Ù. FindParaStart ÇÔ¼ö·Î ¹®´Ü ¼±µÎ¸¦ ãÀ» ¼öµµ ÀÖÁö¸¸ ÀÌÁø Æ÷¸Ë¿¡´Â °³Çà Äڵ尡 ¾øÀ¸¹Ç·Î ³Ê¹« ´À¸®´Ù´Â ´ÜÁ¡ÀÌ ÀÖ¾î ¾µ ¼ö°¡ ¾ø´Ù.

ºÏ¸¶Å©´Â °°Àº ŸÀÔÀÇ ºä³¢¸®¸¸ º¹Á¦ÇÒ ¼ö ÀÖ´Ù. Áï ÅؽºÆ® ºä¿¡¼­ ÅؽºÆ® ºä¸¦ º¹Á¦ÇÒ ¶§³ª Çí»ç ºä¿¡¼­ Çí»ç ºä¸¦ º¹Á¦ÇÒ ¶§¸¸ ºÏ¸¶Å©°¡ ȣȯµÈ´Ù. ÅؽºÆ® ºä´Â ¹®´Ü¿¡ ´ëÇØ ºÏ¸¶Å©¸¦ ÇÏÁö¸¸ Çí»ç ºä´Â ÁÙ¿¡ ´ëÇØ ºÏ¸¶Å©¸¦ Çϱ⠶§¹®¿¡ »óÈ£ ºÏ¸¶Å© Æ÷¸ËÀÌ È£È¯µÇÁö ¾Ê´Â´Ù. ¼öÆòÀ¸·Î³ª ¼öÁ÷À¸·Î³ª âÀÌ ºÐÇÒµÇ¾î º¹Á¦ÇÒ ¶§´Â µÎ ºäÀÇ Å¸ÀÔÀÌ °°À¸¹Ç·Î ºÏ¸¶Å©¸¦ º¹»çÇÑ´Ù. ÇÏÁö¸¸ ºäÀÇ Å¸ÀÔÀÌ º¯°æµÇ´Â Ư¼öÇÑ °æ¿ì(SplitTypeÀÌ 3)´Â º¹»çÇÏÁö ¾Ê´Â´Ù.

ºäÀÇ ¼Ó¼º Áß °¡Àå Ưº°ÇÏ°Ô °ü¸®µÇ´Â ´ë»óÀº ¼öÁ÷ ½ºÅ©·Ñ À§Ä¡¸¦ °¡¸®Å°´Â yPosÀε¥ ÀÌ °ªÀ» º¹»çÇÒ °ÍÀΰ¡ ¾Æ´Ñ°¡´Â ºÐÇÒ ¹æÇâ¿¡ µû¶ó ´Þ¶óÁø´Ù. ÀÏ´Ü ¼öÁ÷ ºÐÇÒÀ̸é yPos´Â º° Á¦ÇѾøÀÌ º¹»çÇÒ ¼ö ÀÖ´Ù. ±âÁ¸ ºä°¡ 10¹ø° ÁÙÀ» º¸¿©ÁÖ°í ÀÖ´Ù¸é ºÐÇÒµÈ ºäµµ 10¹ø° ÁÙÀ» º¸¿© ÁÖ¸é µÈ´Ù. ¼öÆò ºÐÇÒÀÏ ¶§µµ ÀÚµ¿ °³Çà »óÅ°¡ ¾Æ´Ï°Å³ª Çí»ç ºäó·³ ÀÚµ¿ °³ÇàÀÌ Àǹ̰¡ ¾ø´Â ºäÀÌ¸é ¸¶Âù°¡Áö·Î yPos¸¦ º¹»çÇÒ ¼ö ÀÖ´Ù.

°¡Àå °ñÄ¡¾ÆÇ °æ¿ì´Â ÀÚµ¿ °³Çà »óÅÂÀÇ ºä¸¦ ¼öÆòÀ¸·Î ºÐÇÒÇÒ ¶§Àε¥ À̶§´Â yPos¸¦ º¹»çÇÏ´Â °ÍÀÌ ¾Æ¹« Àǹ̰¡ ¾ø´Ù. ¿Ö³ÄÇϸé ÀÚµ¿ °³Çà »óÅ¿¡¼­´Â ºäÀÇ Æø¿¡ µû¶ó Á¤·Ä »óÅ°¡ ´Þ¶óÁö¹Ç·Î yPos¸¦ º¹»çÇÑ´Ù°í Çؼ­ ±âÁ¸ ºä¿Í µ¿ÀÏÇÑ °÷À» °¡¸®Å³ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ ±âÁ¸ ºäÀÇ Ã¹¹ø° ¹®´Ü ¹øÈ£¸¦ Á¶»çÇØ µÎ°í ºÐÇÒµÈ ºäµµ ÀÌ ¹®´ÜÀ» °¡¸®Å°µµ·Ï ÇØ¾ß ÇÑ´Ù. ´Ü, Çí»ç ºä¿¡¼­´Â ¹®´ÜÀÇ °³³äµµ ¾ø°í ÀÚµ¿ °³ÇàÀ̶ó´Â »óŵµ ¾øÀ¸¹Ç·Î ÀÌ ¼­ºñ½º´Â ÅؽºÆ® ºäÀÏ ¶§¸¸ °¡´ÉÇÏ´Ù.

¼öÆò, ¼öÁ÷ µÑ ´Ù ¾Æ´Ò ¶§´Â yPos¸¦ ÀüÇô °Çµå¸®Áö ¾ÊÀ¸¹Ç·Î »õ·Î¿î ºäÀÇ yPos´Â 0À¸·Î ÃʱâÈ­µÉ °ÍÀÌ´Ù. CloneView´Â SplitView¿¡¼­»Ó¸¸ ¾Æ´Ï¶ó ºä ŸÀÔÀ» ÀüȯÇÒ ¶§µµ È£ÃâµÇ´Âµ¥ À̶§´Â SplitTypeÀÌ 0ÀÌ µÈ´Ù.

»ç. ºäÀÇ ¹èÄ¡

SplitView ÇÔ¼ö´Â »õ·Î ºä¸¦ »ý¼ºÇÑ ÈÄ ºÐÇÒ ºñÀ²¿¡ µû¶ó HorzRatio, VertRatio º¯¼ö¸¸ Á¶Á¤ÇÏ°í »õ·Î ¸¸µé¾îÁø ºä¸¦ ¹èÄ¡ÇÏ´Â ÀÛ¾÷Àº OnSize¿¡¼­ ÇÑ´Ù. ÇÁ·¹ÀÓÀÇ OnSizeÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.

 

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

{

     RECT crt;

     int width,height;

 

     if (state == SIZE_MINIMIZED) {

          return;

     }

 

     GetClientRect(hWnd,&crt);

     // ºÐÇÒµÇÁö ¾ÊÀº °æ¿ì

     if (arView[1]==NULL) {

          MoveWindow(arView[0]->hWnd,0,0,crt.right,crt.bottom,TRUE);

     // 2ºÐÇÒµÈ °æ¿ì

     } else if (arView[2]==NULL) {

          if (VertRatio) {

              height=(crt.bottom-VGAP)*VertRatio/10000;

              MoveWindow(arView[0]->hWnd,0,0,crt.right,height,TRUE);

              MoveWindow(arView[1]->hWnd,0,height+VGAP,crt.right,crt.bottom-height-VGAP,TRUE);

          } else {

              width=(crt.right-VGAP)*HorzRatio/10000;

               MoveWindow(arView[0]->hWnd,0,0,width,crt.bottom,TRUE);

              MoveWindow(arView[1]->hWnd,width+VGAP,0,crt.right-width-VGAP,crt.bottom,TRUE);

          }

     // 4ºÐÇÒµÈ °æ¿ì

     } else {

          height=(crt.bottom-VGAP)*VertRatio/10000;

          width=(crt.right-VGAP)*HorzRatio/10000;

          MoveWindow(arView[0]->hWnd,0,0,width,height,TRUE);

          MoveWindow(arView[1]->hWnd,width+VGAP,0,crt.right-width-VGAP,height,TRUE);

          MoveWindow(arView[2]->hWnd,0,height+VGAP,width,crt.bottom-height-VGAP,TRUE);

          MoveWindow(arView[3]->hWnd,width+VGAP,height+VGAP,crt.right-width-VGAP,

              crt.bottom-height-VGAP,TRUE);

     }

}

 

ºÐÇÒ °³¼ö¿¡ µû¶ó ºä¸¦ ÀûÀýÈ÷ ¹èÄ¡Çϴµ¥ ºäÀÇ °³¼ö´Â arView ¹è¿­°ªÀ» Á¡°ËÇØ º¸¸é ½±°Ô ¾Ë ¼ö ÀÖ´Ù. arView[1]ÀÌ NULLÀ̸é arView[0]¿¡ ÇϳªÀÇ ºä¸¸ ÀÖ´Ù´Â ¶æÀ̹ǷΠÀ̶§´Â ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª Àüü¸¦ ºä·Î °¡µæ ä¿ì¸é µÈ´Ù. arView[1]ÀÌ NULLÀÌ ¾Æ´Ï¶ó¸é ÃÖ¼ÒÇÑ µÑ ÀÌ»óÀ¸·Î ºÐÇҵǾî ÀÖ´Ù´Â ¶æÀε¥ À̶§ arView[2]¸¦ º¸¸é 2ºÐÇÒ »óÅÂÀÎÁö 4ºÐÇÒ »óÅÂÀÎÁö ¾Ë ¼ö ÀÖ´Ù. 4ºÐÇÒ »óÅÂÀ̸é 4°³ÀÇ ºä¸¦ HorzRatio, VertRatio ºñÀ²¿¡ µû¶ó ¹èÄ¡ÇÑ´Ù. 2ºÐÇÒ »óÅÂÀÌ¸é ºÐÇÒ ¹æÇâ¿¡ µû¶ó 2°³ÀÇ ºä¸¦ Á¿ì·Î ¶Ç´Â »óÇÏ·Î ¹èÄ¡ÇÑ´Ù.

ºÐÇÒ ºñÀ²°ú ÇöÀç ºÐÇÒ »óÅ¿¡ µû¶ó ºä¸¦ Àû´çÇÑ À§Ä¡¿¡ ¹èÄ¡Çϱ⸸ ÇÏ¸é µÈ´Ù. ÇÁ·¹ÀÓÀÌ º¹¼ö °³ÀÇ ºä·Î ºÐÇҵǸé ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª Æ´ »çÀÌ·Î VGAP ¸¸Å­ÀÇ ºó ¿©¹éÀÌ µå·¯³ª´Âµ¥ OnPaint¿¡¼­ ÀÌ ¿©¹éÀ» Á÷Á¢ ±×¸°´Ù. ÇÁ·¹ÀÓÀº ´ëºÎºÐÀÇ °æ¿ì ºä¿¡ ÀÇÇØ °¡·ÁÁ® ÀÖ°í ºÐÇҵǾî ÀÖÀ» ¶§¸¸ ÀÛ¾÷¿µ¿ªÀÇ ÀϺΰ¡ º¸À̴µ¥ ÇÁ·¹ÀÓÀÇ OnPaint´Â À̶§ ºä »çÀÌ·Î º¸ÀÌ´Â ¿©¹éÀ» ±×¸®±â À§ÇØ Á¸ÀçÇÑ´Ù.

 

void CApiEdit::OnPaint(HWND hWnd)

{

     HDC hdc;

     PAINTSTRUCT ps;

     HPEN hHilight,hShadow,OldPen;

     HBRUSH hFace;

     RECT crt,rt;

     int width,height;

 

     hdc=BeginPaint(hWnd,&ps);

     if (VertRatio || HorzRatio) {

          hHilight=CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DHILIGHT));

          hShadow=CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DSHADOW));

          hFace=CreateSolidBrush(GetSysColor(COLOR_3DFACE));

          GetClientRect(hWnd,&crt);

 

          // ¼öÁ÷ ½ºÇø´ ¹Ù¸¦ ±×¸°´Ù.

          if (VertRatio) {

              height=(crt.bottom-VGAP)*VertRatio/10000;

              SetRect(&rt,crt.left,height,crt.right,height+VGAP);

              FillRect(hdc,&rt,hFace);

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

              MoveToEx(hdc,rt.left,rt.top+1,NULL);

              LineTo(hdc,rt.right,rt.top+1);

              SelectObject(hdc,hShadow);

              MoveToEx(hdc,rt.left,rt.bottom-1,NULL);

              LineTo(hdc,rt.right,rt.bottom-1);

          }

 

          // ¼öÆò ½ºÇø´ ¹Ù¸¦ ±×¸°´Ù.

          if (HorzRatio) {

              width=(crt.right-VGAP)*HorzRatio/10000;

              SetRect(&rt,width,crt.top,width+VGAP,crt.bottom);

              FillRect(hdc,&rt,hFace);

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

              MoveToEx(hdc,rt.left+1,rt.top,NULL);

              LineTo(hdc,rt.left+1,rt.bottom);

              SelectObject(hdc,hShadow);

              MoveToEx(hdc,rt.right-1,rt.top,NULL);

              LineTo(hdc,rt.right-1,rt.bottom);

          }

 

          if (VertRatio && HorzRatio) {

              SetRect(&rt,crt.left,height+2,crt.right,height+VGAP-1);

              FillRect(hdc,&rt,hFace);

          }

 

          SelectObject(hdc,OldPen);

          DeleteObject(hHilight);

          DeleteObject(hShadow);

          DeleteObject(hFace);

     }

     EndPaint(hWnd,&ps);

}

 

ÀÔüÀûÀÎ ¸ð¾çÀ» ±×¸®´Ù º¸´Ï GDI ¿ÀºêÁ§Æ®°¡ ¸¹ÀÌ ÇÊ¿äÇÏ°í ±×·¡¼­ Äڵ尡 Á» ±æ¾îÁ³´Âµ¥ ´Ü¼øÇÑ Ãâ·Â¹®ÀÏ »ÓÀÌ´Ù. OnPaint¿¡¼­ Á÷Á¢ ½ºÇø´ ¹Ù¸¦ ±×¸®´Â ´ë½Å ºä¿¡ WS_EX_CLIENTEDGE È®Àå ½ºÅ¸ÀÏÀ» Á־ ºñ½ÁÇÑ ¸ð¾çÀ» ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ½ºÇø´ ¹Ù´Â ȸ»öÀ¸·Î ä»öÇØ¾ß Çϴµ¥ ±×·¯±â À§Çؼ­´Â ÇÁ·¹ÀÓÀÌ ¹è°æ ºê·¯½Ã¸¦ °¡Á®¾ß ÇÏ°í ±×·¯ÀÚ¸é ±ô¹ÚÀÓ Çö»óÀÌ ³ªÅ¸³ª°Ô µÈ´Ù. ±×·¡¼­ OnPaint¿¡¼­ ½ºÇø´ ¹Ù¸¦ Á÷Á¢ ±×·È´Ù.

ºäÀÇ Æ´ »çÀÌ·Î Á¶±Ý¾¿ µå·¯³ª º¸ÀÌ´Â ÀÌ ¿©¹éÀº ´Ü¼øÇÑ Àå½ÄÀÌ ¾Æ´Ï¶ó ºäÀÇ ºÐÇÒ ºñÀ²À» Á¶Á¤ÇÏ´Â ÀÏÁ¾ÀÇ À¯Àú ÀÎÅÍÆäÀ̽ºÀÌ´Ù. ½ºÇø´ ¹Ú½º·Î ÀÏ´Ü ºÐÇÒÇÑ ÈÄ ºñÀ²À» Á¶Á¤ÇÒ ¶§´Â ÇÁ·¹ÀÓÀÇ ½ºÇø´ ¹Ù¸¦ µå·¡±×ÇØ¾ß ÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¿© ºÐÇÒÇÒ ¼ö ÀÖ´Ù.

±×·¯³ª ¾ÆÁ÷ ºÐÇÒ¸¸ ÇÒ ¼ö ÀÖÀ» »ÓÀÌÁö ½ºÇø´ ¹Ù¸¦ µå·¡±×ÇÏ¿© ºÐÇÒ ºñÀ²À» Á¶Á¤Çϰųª ºÐÇÒÀ» Ãë¼ÒÇÏÁö´Â ¸øÇÑ´Ù. ÀÌ·± ºÐÇÒ °ü¸®´Â ¹Ù·Î ´ÙÀ½ Àý¿¡¼­ °è¼Ó ÇÑ´Ù.