Â÷ÀϵåÀÇ º¸ÀÓ/¼û±è »óÅ»Ӹ¸ ¾Æ´Ï¶ó °¢ À©µµ¿ìÀÇ Å©±â°¡ ¾ó¸¶³ª µÇ´Â°¡µµ Áß¿äÇÑ Â÷ÀÏµå ¹èÄ¡»óÅÂÁß ÇϳªÀÌ´Ù. Å©±â Á¶Á¤ÀÌ °¡´ÉÇÑ °ªÀº °Ë»ö°á°úâÀÇ ³ôÀÌ¿Í ÆÄÀÏâÀÇ ÆøÀÌ Àִµ¥ ÀÌ µÎ °ªÀº Á¤¼öÀ̱⠶§¹®¿¡ ¸Þ´º·Î´Â ÀԷ¹ޱ⠾î·Æ´Ù. Â÷ÀϵåÀÇ Å©±â¸¦ º¯°æÇÏ´Â °¡Àå Á÷°üÀûÀÎ ¹æ¹ýÀº ¸¶¿ì½º·Î Â÷ÀϵåÀÇ °æ°è¸¦ µå·¡±×ÇÏ´Â °ÍÀÌ´Ù.
GetChildSize ÇÔ¼ö´Â Â÷ÀϵåÀÇ Å©±â¸¦ °è»êÇÒ ¶§ GAP¸¸Å °£°ÝÀ» ¶ç¿ì°í Relayout ÇÔ¼ö´Â ÀÌ °£°ÝÀ» À¯ÁöÇÑ Ã¤·Î Â÷Àϵ带 ¹èÄ¡ÇÑ´Ù. ÀÌ °£°ÝÀº Â÷Àϵå·Î µ¤ÀÌÁö ¾ÊÀº ¼ø¼öÇÏ°Ô ºñ¿öÁø ºÎºÐÀ̸ç ÀÌ ¿©¹é¿¡´Â ¸ÞÀÎ À©µµ¿ìÀÇ ÀÛ¾÷¿µ¿ªÀÌ ±×´ë·Î µå·¯³ª°Ô µÈ´Ù. µû¶ó¼ ÀÌ ¿©¹éÀ» µå·¡±×ÇÏ¿© Â÷ÀϵåÀÇ Å©±â¸¦ Á¶Á¤ÇÏ´Â ÀÛ¾÷Àº ¸ÞÀÎ À©µµ¿ì°¡ ÇÒ ÀÏÀÌ´Ù. ¿Ö³ÄÇϸé ÀÌ ¿µ¿ª¿¡¼ÀÇ ¸¶¿ì½º ¸Þ½ÃÁö°¡ ¸ÞÀÎ À©µµ¿ì·Î Àü´ÞµÇ±â ¶§¹®ÀÌ´Ù.
iDrag, DragOriginal Àü¿ªº¯¼öµéÀÌ Â÷Àϵå Å©±â Á¶Àý¿¡ »ç¿ëµÇ´Âµ¥ iDrag´Â ¾î´À ¹æÇâÀ¸·Î µå·¡±×¸¦ ÇÏ°í ÀÖ´ÂÁö¸¦ ±â¾ïÇϸç DragOriginalÀº µå·¡±×¸¦ Çϱâ ÀüÀÇ Â÷Àϵå Å©±â°ªÀ» ÀúÀåÇÑ´Ù. ÀÌ µÎ º¯¼ö´Â ½ÇÇàÁß¿¡ »ç¿ëµÇ´Â °ÍµéÀ̹ǷΠµû·Î ÃʱâÈÇÒ ÇÊ¿ä°¡ ¾ø´Ù. »ç½Ç µÑ ´Ù Àü¿ªº¯¼öÀ̹ǷΠ0À¸·Î ÀÚµ¿ ÃʱâȵȴÙ. Å©±â Á¶Àý¿¡ »ç¿ëÇÒ Ä¿¼ ¸®¼Ò½º µÎ °³µµ ¸¸µé¾îÁ® ÀÖ´Ù.
Çϳª´Â ¼öÆòÀ¸·Î Å©±â¸¦ Á¶Á¤ÇÒ ¶§ÀÇ Ä¿¼ÀÌ¸ç ³ª¸ÓÁö Çϳª´Â ¼öÁ÷À¸·Î Å©±â¸¦ Á¶Á¤ÇÒ ¶§ÀÇ Ä¿¼ÀÌ´Ù. »ç¿ëÀÚµéÀº ÀÌ Ä¿¼°¡ ³ªÅ¸³¯ ¶§ µå·¡±×°¡ °¡´ÉÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ ¸®¼Ò½º¸¦ OnCreate¿¡¼ Àоî¿Â´Ù.
int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
hCurHorz=LoadCursor(g_hInst,MAKEINTRESOURCE(IDC_SIZEHORZ));
hCurVert=LoadCursor(g_hInst,MAKEINTRESOURCE(IDC_SIZEVERT));
°æ°è¼± µå·¡±×¸¦ Áö¿øÇÏ·Á¸é Ä¿¼ °ü·Ã ¸Þ½ÃÁö¿Í ¸¶¿ì½º °ü·Ã ¸Þ½ÃÁö ¼¼ °³¸¦ ó¸®ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇϵµ·Ï ÇÏÀÚ.
BOOL OnSetCursor(HWND hWnd,WPARAM wParam,LPARAM lParam);
void OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
void OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam);
void OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam);
void OnNotify(HWND hWnd,WPARAM wParam,LPARAM lParam);
OnNotify´Â â Å©±â Á¶Àý°ú´Â »ó°üÀÌ ¾øÁö¸¸ Àá½Ã ÈÄ ÅøÆÁ Ãâ·Â¿¡ »ç¿ëµÇ¹Ç·Î °°ÀÌ Ãß°¡Çϵµ·Ï ÇÏÀÚ. DGWndProc¿¡¼ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÀÌ ÇÔ¼öµéÀ» È£ÃâÇÑ´Ù.
LRESULT CALLBACK DGWndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
....
case WM_SETCURSOR:if (OnSetCursor(hWnd,wParam,lParam)) return 0;break;
case WM_LBUTTONDOWN:OnLButtonDown(hWnd,wParam,lParam);return 0;
case WM_MOUSEMOVE:OnMouseMove(hWnd,wParam,lParam);return 0;
case WM_LBUTTONUP:OnLButtonUp(hWnd,wParam,lParam);return 0;
case WM_NOTIFY:OnNotify(hWnd,wParam,lParam);return 0;
}
return(DefFrameProc(hWnd,g_hMDIClient,iMessage,wParam,lParam));
}
OnSetCursor ÇÔ¼ö¿¡¼´Â Â÷ÀϵåÀÇ °æ°è¼±¿¡ Ä¿¼°¡ ÀÖÀ» ¶§ ÀÌ ºÎºÐ¿¡¼ µå·¡±×°¡ °¡´ÉÇÔÀ» Ç¥½ÃÇϱâ À§ÇØ Ä¿¼¸¦ ¹Ù²Ù¾î ÁØ´Ù. ±× ¿ÜÀÇ °æ¿ì´Â DefFrameProcÀ¸·Î ÀÌ ¸Þ½ÃÁö¸¦ º¸³»¾ß Çϸç À̶§´Â FALSE¸¦ ¸®ÅÏÇÑ´Ù.
BOOL OnSetCursor(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
POINT pt;
RECT crt;
int t,s,f,o,w;
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w);
GetCursorPos(&pt);
ScreenToClient(hWnd,&pt);
if (LOWORD(lParam)==HTCLIENT) {
if (Option.bShowFileWnd &&
pt.x >= w && pt.x <= w+GAP &&
pt.y > t+f && pt.y < crt.bottom-(o+s)) {
SetCursor(hCurHorz);
return TRUE;
}
if (Option.bShowOutput &&
pt.y >= crt.bottom-(o+s+GAP)
&& pt.y <= crt.bottom-(o+s)) {
SetCursor(hCurVert);
return TRUE;
}
}
return FALSE;
}
GetChildSize ÇÔ¼ö·Î °¢ Â÷ÀϵåÀÇ Å©±â¸¦ ±¸ÇÏ°í ¸¶¿ì½º Ä¿¼ÀÇ ÁÂÇ¥¸¦ ÀÛ¾÷¿µ¿ª ÁÂÇ¥·Î ¹Ù²Ù¾î ³õÀ¸¸é ÀÌ °ªµéÀ» ºñ±³ÇÏ¿© Ä¿¼°¡ Áö±Ý ¾îµðÂë ÀÖ´ÂÁö¸¦ ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. Ä¿¼ÀÇ ¼öÆòÁÂÇ¥°¡ ÆÄÀÏâÀÇ Æø~GAP»çÀÌ¿¡ ÀÖ°í ¼öÁ÷ÁÂÇ¥´Â ÆÄÀÏâÀÇ ¿µ¿ª¿¡ ÀÖÀ» ¶§ ¼öÆòÀ¸·Î Å©±â Á¶Á¤ÀÌ °¡´ÉÇÏ´Ù. ¿©±â¼ ¸¶¿ì½º ¹öÆ°À» ´©¸£¸é ¼öÆòÀ¸·Î Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖÀ½À» ¾Ë·ÁÁÖ±â À§ÇØ ¼öÆò Á¶Á¤ Ä¿¼·Î º¯°æÇÏ¿´´Ù.
Ãâ·ÂâÀÇ ³ôÀÌ¿Í GAP »çÀÌ¿¡ Ä¿¼°¡ ÀÖÀ¸¸é ¼öÁ÷À¸·Î Å©±â Á¶Á¤ÀÌ °¡´ÉÇϸç Ä¿¼¸¦ ¼öÁ÷ Á¶Á¤ Ä¿¼·Î º¯°æÇÑ´Ù. OnSetCursor¿¡¼´Â Ä¿¼ÀÇ À§Ä¡¿¡ µû¶ó Ä¿¼¸ð¾ç¸¸ º¯°æÇÑ´Ù. µå·¡±×¸¦ ½ÃÀÛÇÒ ½ÃÁ¡Àº ÀÌ »óÅ¿¡¼ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¶§ÀÌ´Ù. OnLButtonDown ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
POINT pt;
RECT crt;
int t,s,f,o,w;
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w);
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
iDrag=0;
if (Option.bShowFileWnd &&
pt.x >= w && pt.x <= w+GAP &&
pt.y > t+f && pt.y < crt.bottom-(o+s)) {
iDrag=1;
DragOriginal=Option.FileWndWidth;
}
if (Option.bShowOutput &&
pt.y >= crt.bottom-(o+s+GAP)
&& pt.y <= crt.bottom-(o+s)) {
iDrag=2;
DragOriginal=o;
}
if (iDrag) {
SetCapture(hWnd);
}
}
µå·¡±×¸¦ ½ÃÀÛÇÒ ¶§µµ OnSetCursor¿Í µ¿ÀÏÇÑ Á¶°Ç Á¡°ËÀ» ÇÑ ¹ø ´õ ÇÏ¿© °ú¿¬ µå·¡±×¸¦ ½ÃÀÛÇØ¾ß ÇÒ ½ÃÁ¡ÀÎÁö¸¦ Á¶»çÇÑ´Ù. ÆÄÀÏâÀÇ Å©±â¸¦ Á¶ÀýÇÒ ¶§´Â iDrag¿¡ 1À», °Ë»ö°á°úâÀÇ Å©±â¸¦ Á¶ÀýÇÒ ¶§´Â iDrag¿¡ 2¸¦ ´ëÀÔÇÏ¿´´Ù. ±× ¿ÜÀÇ °æ¿ì´Â Å©±â¸¦ º¯°æÇÒ ¼ö ¾ø´Â ¿µ¿ªÀ̹ǷΠiDrag´Â 0ÀÌ´Ù. iDrag´Â ¾îµð¸¦ µå·¡±×ÇÏ°í ÀÖ´Â ÁßÀÎÁö¸¦ ³ªÅ¸³»´Âµ¥ ¸¸¾à µå·¡±× ´ë»óÀÌ ´õ ´Ã¾î³´Ù¸é iDragÀÇ °ª Á¾·ù¸¦ ´Ã¸®¸é µÈ´Ù. µå·¡±×°¡ ½ÃÀ۵Ǹé Ä¿¼¸¦ ĸóÇÏ¿© ¸ÞÀÎ À©µµ¿ì°¡ ¸¶¿ì½º ¸Þ½ÃÁö¸¦ °è¼Ó ¹ÞÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù.
iDragOriginal º¯¼ö´Â µå·¡±×¸¦ ½ÃÀÛÇϱâ ÀüÀÇ Â÷Àϵå Å©±â°ªÀ» ÀúÀåÇϴµ¥ ÀÌ °ªÀº µå·¡±×¿¡ ÀÇÇØ Â÷Àϵ尡 ¼û°ÜÁú ¶§ ¿ø·¡ ÆøÀ» ÀúÀåÇϱâ À§ÇØ »ç¿ëµÈ´Ù. OnLButtonDown¿¡¼´Â iDrag¿¡ 1À̳ª 2¸¦ ´ëÀÔÇÏ¿© µå·¡±×¸¦ ½ÃÀÛÇϱ⸸ Çϸç ÀÌ »óÅ¿¡¼ ¸¶¿ì½º°¡ À̵¿µÇ¸é Â÷ÀϵåÀÇ Å©±â°¡ ¸¶¿ì½º°¡ À̵¿µÈ ¸¸Å Á¶Á¤µÈ´Ù. OnMouseMove¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.
void OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT crt;
int Value;
int t,s,f,o,w;
if (iDrag==0) {
return;
}
GetClientRect(g_hFrameWnd,&crt);
GetChildSize(t,s,f,o,w);
if (iDrag==1) {
Value=(int)(short)LOWORD(lParam);
Option.FileWndWidth=min(max(5,Value),crt.right-10);
Relayout();
}
if (iDrag==2) {
Value=crt.bottom-(int)(short)HIWORD(lParam)-s;
Option.OutputHeight=min(max(5,Value),
crt.bottom-(t+f+s)-10);
Relayout();
}
}
Option.FileWndWidth¿Í Option.OutputHeight°¡ Á¶Á¤ ´ë»ó º¯¼öÀ̸ç iDrag°ª¿¡ µû¶ó ¾î¶² º¯¼ö°ªÀ» Á¶Á¤ÇÒ °ÍÀΰ¡°¡ °áÁ¤µÈ´Ù. ÃÖÃÊ µå·¡±×¸¦ ½ÃÀÛÇÑ ÁöÁ¡ºÎÅÍ ¸¶¿ì½º°¡ À̵¿ÇÑ ¸¸Å ÀÌ º¯¼ö°ªµéÀ» Áõ°¨½ÃÄÑ ÁÖ°í Relayout ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. º¯°æµÈ À©µµ¿ì Å©±â¸¦ ¹Ý¿µÇÏ¿© ¸ðµç Â÷ÀϵåÀÇ Å©±â°¡ ÀçÁ¶Á¤µÉ °ÍÀÌ´Ù.
À̶§ µÎ À©µµ¿ì°¡ °¡Áú ¼ö ÀÖ´Â ÃÖ¼Ò°ª°ú ÃÖ´ë°ªÀÌ Àִµ¥ ÃÖ¼Ò°ªÀº µÑ ´Ù 5·Î µÇ¾î ÀÖ´Ù. ÆÄÀÏâÀÇ ÆøÀº ÃÖ´ë ÀÛ¾÷¿µ¿ªÆø¿¡¼ 10À» »« °Í ÀÌ»ó µÉ ¼ö ¾øµµ·Ï ÇÏ¿´À¸¸ç °Ë»ö°á°úâÀº Åø¹Ù, »óŶõ, ÆÄÀÏÅÇÀÇ ³ôÀ̸¦ ´Ù ´õÇÑ °Í¿¡¼ 10À» »« °Íº¸´Ù ÀÛ¾Æ¾ß ÇÑ´Ù. »ó½ÄÀûÀ¸·Î »ý°¢ÇØ ºÁµµ Â÷ÀϵåÀÇ ÆøÀÌ ¸ÞÀÎ À©µµ¿ìÀÇ Æøº¸´Ù ´õ ³ÐÀ» ¼ö´Â ¾øÀ¸¸ç ³»¿ëÀÌ ¾Èº¸ÀÏ Á¤µµ·Î ÀÛ¾ÆÁ®¼µµ ¾ÈµÈ´Ù.
OnMouseMove¿¡¼ Ä¿¼°¡ ¿òÁ÷ÀÏ ¶§¸¶´Ù Relayout ÇÔ¼ö¸¦ È£ÃâÇϹǷΠ¸¶¿ì½º À̵¿ Áï½Ã Â÷ÀϵåÀÇ ¹èÄ¡°¡ ½Ç½Ã°£À¸·Î Á¶Á¤µÈ´Ù. ¸¶¿ì½º ¹öÆ°À» ³õÀ¸¸é µå·¡±×¸¦ ³¡³»µÇ ¸î °¡Áö ¿¹¿Ü 󸮸¦ ÇÑ´Ù.
void OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (iDrag==1) {
if (Option.FileWndWidth == 5) {
Option.FileWndWidth=DragOriginal;
SendMessage(g_hFrameWnd,WM_COMMAND,MAKEWPARAM(IDM_VIEW_FILE,0),0);
}
}
if (iDrag==2) {
if (Option.OutputHeight == 5) {
Option.OutputHeight=DragOriginal;
SendMessage(g_hFrameWnd,WM_COMMAND,MAKEWPARAM(IDM_VIEW_OUTPUT,0),0);
}
}
iDrag=0;
ReleaseCapture();
}
µÎ Â÷Àϵ尡 ÃÖ¼Ò Å©±âÀÎ 5Çȼ¿À̸é Å©±â¸¦ Á¶Á¤ÇÏ´Â ´ë½Å ¾Æ¿¹ Â÷Àϵ带 ¼û±âµµ·Ï ÇÏ¿´´Ù. Â÷ÀϵåÀÇ °æ°è¸¦ µå·¡±×ÇÏ¿© ¾ÆÁÖ ÀÛ°Ô ¸¸µé¸é ¾Æ¿¹ ¼û±â¶ó´Â ¶æÀ¸·Î Çؼ®ÇÏ´Â °ÍÀÌ´Ù. À̶§ °¢ À©µµ¿ìÀÇ Å©±â°ªÀº µå·¡±×¸¦ ½ÃÀÛÇÒ ¶§ÀÇ °ªÀ» ±×´ë·Î À¯ÁöÇϵµ·Ï ÇÔÀ¸·Î½á Â÷Àϵ带 ´Ù½Ã º¸À̵µ·Ï ÇßÀ» ¶§´Â Å©±â Á¶Á¤ ÀüÀÇ »óÅ·Πµ¹¾Æ¿Ã ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. ¸ðµç ¹èÄ¡°¡ ³¡³ ÈÄ iDrag´Â 0À¸·Î ¸¸µé°í Ä¿¼ÀÇ Ä¸Ã³¸¦ Ç®¾î ÁÖ¸é Â÷ÀÏµå ¹èÄ¡°¡ ³¡³´Ù.