¾ÕÀå¿¡¼ Èûµé°Ô °´Ã¼¸¦ ºÐÇÒÇØ ³õ¾ÒÀ¸´Ï ÀÌÁ¦ °´Ã¼µéÀ» Àß ¿ä¸®Çؼ ÆíÁýâÀ» ºÐÇÒÇØ º¸ÀÚ. ÀÌ ½Ç½ÀÀ» ¸¶Ä¡°í ³ª¸é ÇÑ ÆÄÀÏÀÇ µÎ °÷À» µ¿½Ã¿¡ º¸¸é¼ ÆíÁýÇÒ ¼ö ÀÖ´Ù. ´Ã ±×·¡¿ÔµíÀÌ 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¿¡¼ ½ºÇø´ ¹Ù¸¦ Á÷Á¢ ±×·È´Ù.
ºäÀÇ Æ´ »çÀÌ·Î Á¶±Ý¾¿ µå·¯³ª º¸ÀÌ´Â ÀÌ ¿©¹éÀº ´Ü¼øÇÑ Àå½ÄÀÌ ¾Æ´Ï¶ó ºäÀÇ ºÐÇÒ ºñÀ²À» Á¶Á¤ÇÏ´Â ÀÏÁ¾ÀÇ À¯Àú ÀÎÅÍÆäÀ̽ºÀÌ´Ù. ½ºÇø´ ¹Ú½º·Î ÀÏ´Ü ºÐÇÒÇÑ ÈÄ ºñÀ²À» Á¶Á¤ÇÒ ¶§´Â ÇÁ·¹ÀÓÀÇ ½ºÇø´ ¹Ù¸¦ µå·¡±×ÇØ¾ß ÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ½ºÇø´ ¹Ú½º¸¦ µå·¡±×ÇÏ¿© ºÐÇÒÇÒ ¼ö ÀÖ´Ù.
±×·¯³ª ¾ÆÁ÷ ºÐÇÒ¸¸ ÇÒ ¼ö ÀÖÀ» »ÓÀÌÁö ½ºÇø´ ¹Ù¸¦ µå·¡±×ÇÏ¿© ºÐÇÒ ºñÀ²À» Á¶Á¤Çϰųª ºÐÇÒÀ» Ãë¼ÒÇÏÁö´Â ¸øÇÑ´Ù. ÀÌ·± ºÐÇÒ °ü¸®´Â ¹Ù·Î ´ÙÀ½ Àý¿¡¼ °è¼Ó ÇÑ´Ù.