´Ù. â Å©±â Á¶Àý

Â÷ÀϵåÀÇ º¸ÀÓ/¼û±è »óÅ»Ӹ¸ ¾Æ´Ï¶ó °¢ À©µµ¿ìÀÇ Å©±â°¡ ¾ó¸¶³ª µÇ´Â°¡µµ Áß¿äÇÑ Â÷ÀÏµå ¹èÄ¡»óÅÂÁß ÇϳªÀÌ´Ù. Å©±â Á¶Á¤ÀÌ °¡´ÉÇÑ °ªÀº °Ë»ö°á°úâÀÇ ³ôÀÌ¿Í ÆÄÀÏâÀÇ ÆøÀÌ Àִµ¥ ÀÌ µÎ °ªÀº Á¤¼öÀ̱⠶§¹®¿¡ ¸Þ´º·Î´Â ÀԷ¹ޱ⠾î·Æ´Ù. Â÷ÀϵåÀÇ Å©±â¸¦ º¯°æÇÏ´Â °¡Àå Á÷°üÀûÀÎ ¹æ¹ýÀº ¸¶¿ì½º·Î Â÷ÀϵåÀÇ °æ°è¸¦ µå·¡±×ÇÏ´Â °ÍÀÌ´Ù.

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À¸·Î ¸¸µé°í Ä¿¼­ÀÇ Ä¸Ã³¸¦ Ç®¾î ÁÖ¸é Â÷ÀÏµå ¹èÄ¡°¡ ³¡³­´Ù.