´Ù. »óŶõ ³ª´©±â

»óŶõ¿¡ º¸¿©ÁÙ Á¤º¸ÀÇ Á¾·ù°¡ ¸¹À¸¸é ¸î °³ÀÇ Ä­À¸·Î ³ª´« ÈÄ °¢ Ä­¿¡ ¼­·Î ´Ù¸¥ ¿©·¯ °³ÀÇ Á¤º¸¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. À̶§ »óŶõÀÇ ºÐÇÒµÈ °¢ Ä­À» ÆÄÆ®¶ó°í ÇÏ¸ç ¿øÇÏ´Â ¼ö¸¸Å­ ¿øÇÏ´Â ÆøÀ¸·Î ³ª´­ ¼ö ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö´Â »óŶõÀ» ¿©·¯ ÆÄÆ®·Î ºÐÇÒÇÑ´Ù.

 

void SetStatusPart()

{

     int SBPart[6];

     RECT crt;

     HWND hActive;

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

 

     GetClientRect(g_hFrameWnd,&crt);

     if (g_ChildNum) {

          SBPart[0]=max(200,crt.right-430);

          SBPart[1]=SBPart[0]+70;

          SBPart[2]=SBPart[1]+130;

          SBPart[3]=SBPart[2]+80;

          SBPart[4]=SBPart[3]+70;

          SBPart[5]=SBPart[4]+80;

 

          SendMessage(hStatus, SB_SETPARTS, 6, (LPARAM)SBPart);

     } else {

          SBPart[0]=crt.right;

          SendMessage(hStatus, SB_SETPARTS, 1, (LPARAM)SBPart);

     }

}

 

È°¼º Â÷Àϵ尡 ÀÖÀ¸¸é 6°³ÀÇ ÆÄÆ®¸¦ ³ª´©¾î °¢ ÆÄÆ®¿¡ ¹®¼­¿¡ ´ëÇÑ ¿©·¯ °¡Áö Á¤º¸¸¦ º¸¿©ÁÖµµ·Ï ÇÑ´Ù. °¢ ÆÄÆ®´Â º¸¿©ÁÙ Á¤º¸ÀÇ ±æÀÌ¿¡ µû¶ó Àû´çÇÑ ±æÀ̸¦ °®µµ·Ï ÇßÀ¸¸ç ù ¹ø° ÆÄÆ®´Â ÃÖ¼ÒÇÑ 200Çȼ¿ÀÇ ÆøÀ» °¡Áöµµ·Ï ÇÏ¿´´Ù. È°¼ºÃ¢ÀÌ ¾øÀ¸¸é º¸¿©ÁÙ Á¤º¸°¡ ¾øÀ¸¹Ç·Î ÇÑ °³ÀÇ ÆÄÆ®¸¸ ³ª´«´Ù. ÀÌ ÇÔ¼ö´Â DGChildProc¿¡¼­ ù Â÷Àϵ带 »ý¼ºÇÒ ¶§³ª ¶Ç´Â ¸¶Áö¸· Â÷Àϵ带 Æı«ÇÒ ¶§ È£ÃâµÈ´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     SInfo *pSi;

     int idx;

 

     switch(iMessage) {

     case WM_CREATE:

          g_ChildNum++;

          if (g_ChildNum == 1) {

              SendMessage(g_hMDIClient,WM_MDISETMENU,(WPARAM)hMenu1,

                   (LPARAM)GetSubMenu(hMenu1,5));

              Mru.ChangeMenu(GetSubMenu(GetSubMenu(hMenu1,0),8));

              DrawMenuBar(g_hFrameWnd);

           if (Option.bShowStatus) {

               SetStatusPart();

           }

          }

          ....

     case WM_DESTROY:

          pSi=(SInfo *)GetWindowLong(hWnd,0);

          delete pSi;

          g_ChildNum--;

          if (g_ChildNum==0) {

              SendMessage(g_hMDIClient,WM_MDISETMENU,(WPARAM)hMenu2,NULL);

              Mru.ChangeMenu(GetSubMenu(GetSubMenu(hMenu2,0),3));

              DrawMenuBar(g_hFrameWnd);

           if (Option.bShowStatus) {

               SetStatusPart();

           }

          }

          ....

 

¹°·Ð »óŶõÀÌ º¸ÀÌ´Â »óÅÂÀÏ ¶§¸¸ SetStatusPart¸¦ È£ÃâÇÏ¸ç »óŶõÀÌ º¸ÀÌÁö ¾Ê´Â´Ù¸é ±»ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù. È°¼ºÃ¢ÀÇ À¯¹«¿¡ µû¶ó »óŶõÀÇ ÆÄÆ® ±¸¼ºÀÌ ´Þ¶óÁú °ÍÀÌ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ Å©±â°¡ º¯°æµÇ¸é °¢ ÆÄÆ®ÀÇ Å©±âµµ °°ÀÌ Á¶Á¤µÇ¾î¾ß ÇϹǷΠRelayout ÇÔ¼ö¿¡¼­µµ ÆÄÆ®ÀÇ Å©±â¸¦ ÀçÁ¶Á¤ÇØ¾ß ÇÑ´Ù.

 

void Relayout()

{

     ....

     if (Option.bShowStatus) {

          SendMessage(hStatus,WM_SIZE,0,0);

          ShowWindow(hStatus,SW_SHOW);

        SetStatusPart();

     } else {

          ShowWindow(hStatus,SW_HIDE);

     }

 

´ÙÀ½ ÇÔ¼ö´Â ÀÌ·¸°Ô ³ª´©¾îÁø °¢ ÆÄÆ®¿¡ Á¶»çµÈ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. 0¹ø ÆÄÆ®´Â Ưº°È÷ Ãâ·ÂÇÒ ¹®ÀÚ¿­À» µû·Î Àμö·Î Àü´Þ¹ÞÀ» ¼ö ÀÖ´Ù. ¸¸¾à Ưº°ÇÑ ¹®ÀÚ¿­ÀÌ Àü´ÞµÇÁö ¾ÊÀ¸¸é µðÆúÆ® ¹®ÀÚ¿­ÀÎ ¡®´ç±Ù ÆíÁý±âÀÔ´Ï´Ù¡¯°¡ ´ë½Å Ãâ·ÂµÈ´Ù.

 

void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)

{

     TCHAR Text[128];

     HWND hActive;

     SInfo *pSi;

     int byte;

 

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive==NULL) {

          return;

     }

     pSi=(SInfo *)GetWindowLong(hActive,0);

 

     if (mask & 1) {

          if (Mes==NULL) {

              SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"´ç±Ù ÆíÁý±âÀÔ´Ï´Ù");

          } else {

              SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Mes);

          }

     }

 

     if (mask & 2) {

          wsprintf(Text, "%dÁÙ %dÄ­",pSi->Ae.GetInfoFromOff(2)+1,pSi->Ae.GetInfoFromOff(4)+1);

          SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)Text);

     }

 

     if (mask & 4) {

          byte=pSi->Ae.GetTextLength();

          if (byte < 10240) {

              wsprintf(Text, "ÃÑ %dÁÙ %d ¹ÙÀÌÆ®",pSi->Ae.GetDocInfo(0)+1,byte);

          } else {

              wsprintf(Text, "ÃÑ %dÁÙ %d K¹ÙÀÌÆ®",pSi->Ae.GetDocInfo(0)+1,byte/1024);

          }

          SendMessage(hStatus, SB_SETTEXT, 2, (LPARAM)Text);

     }

 

     if (mask & 8) {

          if (pSi->Ae.GetModified()) {

              lstrcpy(Text,"ÆíÁýµÇ¾úÀ½");

          } else {

              lstrcpy(Text,"¹ÌÆíÁý");

          }

          SendMessage(hStatus, SB_SETTEXT, 3, (LPARAM)Text);

     }

    

     if (mask & 0x10) {

          lstrcpy(Text,"PC Æ÷¸Ë");

          SendMessage(hStatus, SB_SETTEXT, 4, (LPARAM)Text);

     }

 

     if (mask & 0x20) {

          if (pSi->Ae.GetInsMode()) {

              lstrcpy(Text,"°ãħ¸ðµå");

          } else {

              lstrcpy(Text,"»ðÀÔ¸ðµå");

          }

          SendMessage(hStatus, SB_SETTEXT, 5, (LPARAM)Text);

     }

}

 

Àμö mask´Â ¾î¶² ÆÄÆ®¿¡ Á¤º¸¸¦ Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤Çϴµ¥ ÇÏÀ§ ºñÆ®ºÎÅÍ °¢ ÆÄÆ®¿¡ ´ëÀÀµÈ´Ù. 0¹ø ºñÆ®°¡ 1À̸é ÆÄÆ® 0¿¡ ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇ¸ç 1¹ø ºñÆ®°¡ 1À̸é ÆÄÆ® 1¿¡ Á¤º¸°¡ Ãâ·ÂµÈ´Ù. ¸ðµç ÆÄÆ®¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÏ·Á¸é 0xffff¸¦ ¸¶½ºÅ©·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ´ç±ÙÀº »óŶõ¿¡ Ãâ·ÂÇÒ Á¤º¸ Á¶»ç¸¦ À§ÇØ ApiEditÀÇ °¢Á¾ ÇÔ¼ö¸¦ ÀûÀýÈ÷ È£ÃâÇÑ´Ù. °¢ ÆÄÆ®¿¡ ¾î¶² Á¤º¸µéÀÌ ¾î¶»°Ô Ãâ·ÂµÇ´ÂÁö º¸ÀÚ.

ÆÄÆ®0Àº Àμö·Î Àü´ÞµÈ Mes ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇ´Âµ¥ ÇöÀç »óÅ¿¡ ´ëÇÑ µµ¿ò¸»À̳ª ÀÛ¾÷ °á°ú¸¦ Ãâ·ÂÇÒ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ÆÄÆ®1Àº ÇöÀç ij·µ À§Ä¡¸¦ º¸¿©Áִµ¥ ApiEdit°¡ Á¶»çÇÏ´Â ¸ðµç Á¤º¸´Â Zero BaseÀÌ°í »ç¿ëÀÚ¿¡°Ô º¸¿©Áö´Â ¼ýÀÚ´Â One BaseÀ̹ǷΠÁ¶»çµÈ À§Ä¡°ª¿¡ 1À» ´õÇØ¾ß ÇÑ´Ù.

ÆÄÆ® 2¿¡´Â ¹®¼­ÀÇ Å©±â¸¦ ÁÙ´ÜÀ§¿Í ¹ÙÀÌÆ® ´ÜÀ§·Î º¸¿©Áִµ¥ ¹®¼­ Å©±â°¡ 10240¹ÙÀÌÆ®¸¦ ³ÑÀ» °æ¿ì ų·Î ¹ÙÀÌÆ® ´ÜÀ§·Î º¸¿©ÁÖµµ·Ï Çß´Ù. ÆÄÆ® 3¿¡´Â ¹®¼­ÀÇ ÆíÁý ¿©ºÎ¸¦, ÆÄÆ® 4¿¡´Â ¹®¼­ÀÇ Æ÷¸ËÀ» º¸¿©ÁÖ°í ÆÄÆ® 5¿¡´Â µ¤¾î¾²±â ¸ðµåÀÇ ÇöÀç »óŸ¦ º¸¿©ÁØ´Ù.

»óŶõÀÇ Á¤º¸°¡ º¯°æµÉ ¶§´Â È£½ºÆ®°¡ ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§Àε¥ Àü´Þ¹ÞÀº ÅëÁö ¸Þ½ÃÁöÀÇ Á¾·ù¿¡ µû¶ó ¼öÁ¤ÇØ¾ß ÇÒ Á¤º¸ÀÇ Á¾·ù(¸¶½ºÅ©)°¡ ´Ù¸£´Ù. ¿¹¸¦ µé¾î AEN_MOVE ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§´Â 1¹ø ÆÄÆ®ÀÇ Ä³·µ À§Ä¡¸¸ °»½ÅÇÏ¸é µÇ¹Ç·Î ¸¶½ºÅ©·Î 0x2¸¦ Àü´ÞÇÏ¿© ²À ÇÊ¿äÇÑ Á¤º¸¸¸ °»½ÅÇϵµ·Ï Çß´Ù. È°¼º Â÷Àϵ尡 º¯°æµÉ ¶§´Â ¸ðµç Á¤º¸°¡ ÇѲ¨¹ø¿¡ º¯°æµÇ¹Ç·Î ¸¶½ºÅ©·Î 0xffff¸¦ Àü´ÞÇÏ¿© ¸ðµç ÆÄÆ®ÀÇ ÅؽºÆ®¸¦ °»½ÅÇϵµ·Ï ÇÑ´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

    case WM_COMMAND:

        switch (LOWORD(wParam)) {

        case 1:

           switch (HIWORD(wParam)) {

           case AEN_MOVE:

               SetStatusText(0x2);

               break;

           case AEN_CHANGE:

               SetStatusText(0x1c);

               break;

           case AEN_INSMODE:

               SetStatusText(0x20);

               break;

           case AEN_CHGMODI:

               SetStatusText(0x8);

               break;

           }

           break;

        }

        return 0;

     case WM_SIZE:

          pSi=(SInfo *)GetWindowLong(hWnd,0);

          MoveWindow(pSi->Ae.hWnd,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);

          break;

     case WM_SETFOCUS:

          pSi=(SInfo *)GetWindowLong(hWnd,0);

          SetFocus(pSi->Ae.hWnd);

        SetStatusText(0xffff);

          return 0;

 

»óŶõ¿¡ Á¤º¸°¡ ¾î¶»°Ô Á¶»çµÇ°í Ãâ·ÂµÇ´ÂÁö ¾î·ÆÁö ¾Ê°Ô ºÐ¼®µÉ °ÍÀÌ´Ù. ÀÌ ½ÃÁ¡¿¡¼­ °£´ÜÇÑ ÄûÁ Çϳª Ç®¾î º¸ÀÚ. SetStatusText ÇÔ¼ö¿¡¼­ hActive°¡ NULLÀÎ °ÍÀº ¿Ö Á¡°ËÇØ¾ß ÇÒ±î? ÀÌ ÇÔ¼ö´Â DGChildProc¿¡¼­¸¸ È£ÃâÇϴµ¥ DGChildProcÀÌ ½ÇÇàÁßÀ̶ó´Â °ÍÀº ÀÌ¹Ì hActive°¡ ÀÖ´Ù´Â ¶æÀ̹ǷΠ±»ÀÌ È°¼ºÃ¢ÀÌ ÀÖ´ÂÁö¸¦ Á¡°ËÇÒ ÇÊ¿ä´Â ¾øÁö ¾Ê°Ú´Â°¡?

±×·² °Í °°Áö¸¸ ¾ÆÁÖ Æ¯¼öÇÑ °æ¿ì Áï, Â÷Àϵ尡 »ý¼ºµÇ´Â ½ÃÁ¡¿¡¼­ ÅëÁö ¸Þ½ÃÁö°¡ Àü´ÞµÉ ¶§°¡ ¹®Á¦°¡ µÈ´Ù. ¾ÆÁ÷ È°¼ºÃ¢ÀÌ ´ú ¸¸µé¾îÁø »óÅ¿¡¼­ ÀÌ ÇÔ¼ö°¡ È£ÃâµÉ ¼öµµ Àִµ¥ ±×´ë·Î µÎ¸é Á״´Ù. SetStatusText ÇÔ¼ö¿¡¼­ hActive¸¦ Á¡°ËÇÏ´Â ¸ñÀûÀº ÀÌ Ã¢ÀÌ ¿ÏÀüÈ÷ ´Ù ¸¸µé¾îÁø °ÍÀÎÁö¸¦ Á¡°ËÇÏ´Â °ÍÀÌ´Ù.