°¡. ÅëÁö ¸Þ½ÃÁö

»óŶõ¿¡´Â ÆíÁý¿¡ µµ¿òÀÌ µÉ¸¸ÇÑ ¿©·¯ °¡Áö Á¤º¸µéÀÌ Ãâ·ÂµÈ´Ù. °£´ÜÇÑ µµ¿ò¸», ÇöÀç ÆíÁýÇÏ°í ÀÖ´Â À§Ä¡, ÆíÁýÇÏ°í ÀÖ´Â ÆÄÀÏ¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸, ÀÛ¾÷ °á°ú µîÀÌ »óŶõ¿¡ Ç¥½ÃµÇ¸ç »ç¿ëÀÚµéÀº Ç×»ó ÀÌ Á¤º¸¸¦ ÂüÁ¶ÇÑ´Ù. »óŶõ¿¡ Ç¥½ÃµÇ´Â Á¤º¸´Â º¸Åë ÆÄÀÏÀÇ »óŸ¦ ³ªÅ¸³»±â ¶§¹®¿¡ ApiEdit ÄÁÆ®·ÑÀÇ »óŸ¦ ³ªÅ¸³»´Â °æ¿ì°¡ ¸¹´Ù.

»óŶõÀÌ ÄÁÆ®·ÑÀÇ »óŸ¦ Ãâ·ÂÇÏ´Â ¹æ¹ý¿¡´Â µÎ °¡Áö°¡ Àִµ¥ ù ¹ø°´Â ÁÖ±âÀûÀ¸·Î ApiEdit¿¡°Ô »óŸ¦ Áú¹®ÇÏ´Â °ÍÀÌ°í µÎ ¹ø°´Â ApiEdit°¡ »óÅ°¡ ¹Ù²ð ¶§ È£½ºÆ®¿¡°Ô º¯È­ »ç½ÇÀ» ¾Ë·Á ÁÖ´Â ¹æ¹ýÀÌ´Ù. ù ¹ø° ¹æ¹ýÀº ¹ÝÀÀ¼ºµµ ÁÁÁö ¾ÊÀ» »Ó´õ·¯ ½ÇÇà¼Óµµ¸¦ °¨¼Ò½ÃÅ°±â ¶§¹®¿¡ ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. ¿©±â¼­´Â µÎ ¹ø° ¹æ¹ýÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.

È£½ºÆ®°¡ »óŶõ¿¡ Á¤È®ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϱâ À§Çؼ­´Â ÄÁÆ®·ÑÀÇ º¯È­ ½ÃÁ¡À» ¾Ë¾Æ¾ß Çϴµ¥ ÀÌ·± ¿ëµµ·Î´Â Åë»ó ÅëÁö ¸Þ½ÃÁö(Notification Message)°¡ »ç¿ëµÈ´Ù. ÄÁÆ®·ÑÀº Àڽſ¡°Ô º¯È­°¡ ÀÖÀ» ¶§ ºÎ¸ð À©µµ¿ì¿¡°Ô ¹Ì¸® ¾à¼ÓµÈ ¸Þ½ÃÁö¸¦ º¸³»¸ç ÀÌ ¸Þ½ÃÁö¸¦ ÅëÇØ È£½ºÆ®´Â ÄÁÆ®·Ñ¿¡ º¯È­°¡ »ý°åÀ½À» ¾Ë°Ô µÈ´Ù. Ç¥ÁØ ÄÁÆ®·ÑÀÎ ¿¡µðÆ®´Â ÀÚ½ÅÀÌ ÆíÁýµÇ¸é EN_CHANGE ¸Þ½ÃÁö¸¦ º¸³»¸ç ÄÞº¸¹Ú½º´Â ¼±ÅÃÀÌ º¯°æµÇ¸é CBN_SELCHANGE ÅëÁö ¸Þ½ÃÁö¸¦ º¸³½´Ù.

ApiEditµµ ÄÁÆ®·ÑÀ̹ǷΠÀÚ½ÅÀÇ º¯È­¸¦ ºÎ¸ð À©µµ¿ì¿¡°Ô ÅëÁö ¸Þ½ÃÁö·Î ¾Ë¸®µµ·Ï Çغ¸ÀÚ. ÅëÁö ¸Þ½ÃÁö·Î »ç¿ëÇÒ ¸Þ½ÃÁö ID¸¦ ApiEdit.h¿¡ ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.

 

#define AEN_CHANGE 1

#define AEN_MOVE 2

#define AEN_INSMODE 3

#define AEN_CHGMODI 4

 

4°³ÀÇ ÅëÁö ¸Þ½ÃÁö°¡ ÀÏ´Ü Á¤ÀǵǾú´Âµ¥ ÀÌ °³¼ö´Â ÇÊ¿ä¿¡ µû¶ó ´õ ´Ã¾î³¯ ¼öµµ ÀÖ´Ù. ÅëÁö ¸Þ½ÃÁöÀÇ ID´Â Åë»ó ÄÁÆ®·ÑÀÇ À̸§°ú NÀ» Á¢µÎ·Î »ç¿ëÇϹǷΠAEN Á¢µÎ¸¦ ºÙ¿©ÁÖ¾ú´Ù. °¢ ÅëÁö ¸Þ½ÃÁöÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.

 

ÅëÁö ¸Þ½ÃÁö

ÀǹÌ

AEN_CHANGE

¹®¼­°¡ º¯°æµÇ¾ú´Ù.

AEN_MOVE

ij·µÀÌ À̵¿µÇ¾ú´Ù.

AEN_INSMODE

µ¤¾î¾²±â ¸ðµå°¡ º¯°æµÇ¾ú´Ù.

AEN_CHGMODI

¹®¼­ÀÇ º¯°æ ¿©ºÎ°¡ ¹Ù²î¾ú´Ù.

 

ApiEdit´Â ÀÌ·± º¯È­°¡ ¹ß»ýÇßÀ» ¶§ ºÎ¸ð À©µµ¿ì¿¡°Ô ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¾ß ÇÑ´Ù. Ç¥ÁØ ÄÁÆ®·ÑÀÇ ÅëÁö ¸Þ½ÃÁö´Â WM_COMMAND·Î Àü´ÞµÇ¸ç wParamÀÇ ÇÏÀ§ ¿öµå¿¡ À©µµ¿ìÀÇ ID¸¦, »óÀ§ ¿öµå¿¡ ÅëÁö Äڵ带, lParam¿¡ À©µµ¿ìÀÇ ÇÚµéÀ» Àü´ÞÇϹǷΠApiEditµµ ±×·¸°Ô Çϵµ·Ï ÇÏÀÚ. ´ÙÀ½ ÇÔ¼ö´Â ºÎ¸ð À©µµ¿ì¿¡°Ô WM_COMMAND ¸Þ½ÃÁö¸¦ º¸³»µÇ wParam, lParam¿¡ À©µµ¿ì ID¿Í ÅëÁö Äڵ带 Àü´ÞÇÑ´Ù.

 

void CApiEdit::SendNotify(int code)

{

     SendMessage(GetParent(hWnd),WM_COMMAND,

          MAKEWPARAM(GetWindowLong(hWnd,GWL_ID),code),(LPARAM)hWnd);

}

 

WM_COMMANDÀÇ wParam, lParamÀº ÀÌ¹Ì ¿ëµµ°¡ È®Á¤µÇ¾ú±â ¶§¹®¿¡ ¿©ºÐÀÇ Á¤º¸¸¦ ½ÇÀ» °ø°£Àº ¾ø´Ù. ´Ü¼øÈ÷ »ç°ÇÀÌ ¹ß»ýÇßÀ½À» ¾Ë¸± »ÓÀÌ´Ù. ApiEdit´Â °¢°¢ÀÇ º¯È­°¡ ¹ß»ýÇÒ ¶§ SendNotify ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºÎ¸ð À©µµ¿ì¿¡°Ô ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¾ß ÇÑ´Ù.

¹®¼­°¡ º¯°æµÇ¾ú´Ù´Â ÀǹÌÀÇ AEN_CHANGE ÅëÁö ¸Þ½ÃÁö´Â µÎ ±ºµ¥¿¡¼­ ¹ß»ýÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö¿¡¼­ ÀÌ ¸Þ½ÃÁö¸¦ ºÎ¸ð À©µµ¿ì¿¡°Ô º¸³½´Ù.

 

void CApiEdit::Insert(int nPos, TCHAR *str, BOOL bRec/*=TRUE*/)

{

     ....

    SendNotify(AEN_CHANGE);

}

 

void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

     ....

    SendNotify(AEN_CHANGE);

}

 

ij·µÀÌ À̵¿µÇ´Â AEN_MOVE¸Þ½ÃÁö´Â °¢Á¾ Å°¿¡¼­ ¼ö½Ã·Î ¹ß»ýÇÏÁö¸¸ ij·µÀÌ À̵¿µÉ ¶§´Â Ç×»ó SetCaretÀÌ È£ÃâµÇ¹Ç·Î ÀÌ ÇÔ¼ö¿¡¼­¸¸ ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»ÁÖ¸é µÈ´Ù. ´Ü, ij·µÀÇ À§Ä¡°¡ Á¤¸»·Î ¹Ù²î¾úÀ» ¶§¸¸ ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¾ß ÇÑ´Ù. Æ÷Ä¿½ºÀÇ º¯°æ µîÀº ij·µÀ» Ç¥½ÃÇϰųª ¼û±â±â´Â ÇÏÁö¸¸ ÆíÁý À§Ä¡°¡ ¹Ù²ï °ÍÀº ¾Æ´Ï¹Ç·Î ÅëÁö ¸Þ½ÃÁö¸¦ º¸³¾ ÇÊ¿ä°¡ ¾ø´Ù.

 

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

{

     ....

     if (bScrollToCaret)

        SendNotify(AEN_MOVE);

     ....

}

 

µ¤¾î¾²±â ¸ðµå°¡ º¯°æµÉ ¶§ÀÎ AEN_INSMODE´Â OnKey¿¡¼­ VK_INSERTÅ°°¡ <Shift>³ª <Ctrl>Å°¿Í Á¶ÇÕµÇÁö ¾Ê°í ´Üµ¶À¸·Î ´­·¯Áú ¶§ º¸³»Áø´Ù. Áï, bOvr º¯¼ö¿¡ º¯È­°¡ ÀÖÀ» ¶§¸¶´Ù ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¸é µÈ´Ù.

 

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

{

     ....

     case VK_INSERT:

          if (bShift) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_PASTE,0),0);

          } else if (bControl) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_COPY,0),0);

          } else {

              bOvr = !bOvr;

           SendNotify(AEN_INSMODE);

              SetCaret();

          }

 

bOvr º¯¼ö¸¦ ¸ÕÀú º¯°æÇÑ ÈÄ AEN_INSMODE ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé AEN_INSMODE ÅëÁö ¸Þ½ÃÁö´Â µ¤¾î¾²±â ¸ðµå°¡ ¹Ù²î¾ú´Ù´Â °ÍÀ» È£½ºÆ®¿¡°Ô ¾Ë·Á Áֱ⸸ ÇÒ »Ó ¾î¶»°Ô ¹Ù²î¾ú´Ù´Â °ÍÀº ¾Ë·ÁÁÖÁö ¸øÇϱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ È£½ºÆ®´Â Åë»ó ÀÌ ¸Þ½ÃÁö¸¦ ¹ÞÀÚ ¸¶ÀÚ ÇöÀçÀÇ µ¤¾î¾²±â ¸ðµå¸¦ Á¶»çÇϴµ¥ À̶§ Á¤È®ÇÑ »óŸ¦ Á¶»çÇϱâ À§Çؼ­´Â bOvrÀÌ ¸ÕÀú º¯°æµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. AEN_INSMODE´Â ¡®µ¤¾î¾²±â ¸ðµå°¡ º¯°æµÇ¾ú´Ù¡¯´Â ÅëÁö ¸Þ½ÃÁöÀε¥ ¸¸¾à bOvrÀ» º¯°æÇϱâ Àü¿¡ ÀÌ ¸Þ½ÃÁö¸¦ º¸³½´Ù¸é ÀÌ´Â ¡®µ¤¾î¾²±â ¸ðµå°¡ °ð º¯°æµÉ °ÍÀÌ´Ù¡¯·Î Àǹ̰¡ ¹Ù²î°Ô µÈ´Ù.

AEN_CHGMODI ¸Þ½ÃÁö´Â bModified°¡ º¯°æµÉ ¶§ º¸³»Áø´Ù. ÀÌ ¸Þ½ÃÁö´Â ¹®¼­°¡ º¯°æµÇ¾úÀ» ¶§ º¸³»Áö´Â AEN_CHANGE¿Í´Â ¾à°£ ´Ù¸£´Ù. ¹®¼­°¡ º¯°æµÇ´õ¶óµµ ½ÇÇàÃë¼Ò¿¡ ÀÇÇØ bModified´Â ´Ù½Ã FALSE°¡ µÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù. SetModified ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEdit::SetModified(BOOL aModi)

{

    if (bModified != aModi) {

        bModified=aModi;

        SendNotify(AEN_CHGMODI);

    }

     if (aModi==FALSE) {

          SaveModified();

     }

}

 

bModified¿Í »õ·Î ´ëÀ﵃ aModi°ªÀÌ ½ÇÁ¦·Î ´Ù¸¦ ¶§¸¸ ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»µµ·Ï ÇÏ¿´´Ù. SetModified ÇÔ¼ö´Â ¹®¼­°¡ Á¶±ÝÀÌ¶óµµ ÆíÁýµÇ¸é Ç×»ó È£ÃâµÇ´Âµ¥ ±×¶§¸¶´Ù AEN_CHGMODI ÅëÁö ¸Þ½ÃÁö¸¦ º¸³¾ ÇÊ¿ä´Â ¾ø´Ù. AEN_CHGMODI ÅëÁö ¸Þ½ÃÁö´Â ¹®¼­ÀÇ º¯°æ»óÅ°¡ ½ÇÁ¦·Î ¹Ù²î¾ú´Ù´Â ¶æÀÌÁö bModified¿¡ °ªÀÌ ´ëÀԵǾú´Ù´Â ¶æÀÌ ¾Æ´Ï´Ù. ÀÌ ¸Þ½ÃÁöµµ ¸¶Âù°¡Áö·Î bModified°ªÀ» ¸ÕÀú º¯°æÇÑ ÈÄ ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¾ß ÇÑ´Ù.

Âü°í·Î InitDoc ÇÔ¼ö´Â SetModified¸¦ È£ÃâÇÏÁö ¾Ê°í ¹Ù·Î bModified¸¦ FALSE·Î ´ëÀÔÇÏ¿© ÃʱâÈ­ÇÑ´Ù. ±× ÀÌÀ¯´Â ÃʱâÈ­Áß¿¡´Â ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»Áö ¾Êµµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. ¸¸¾à InitDoc¿¡¼­µµ SetModified¸¦ È£ÃâÇÑ´Ù¸é ÃʱâÈ­Áß¿¡ AEN_CHGMODI°¡ ³¯¶ó°¡°í ±×·¯¸é DangeunÀº ¾ÆÁ÷ ÃʱâÈ­µµ ´úµÈ ApiEdit ÄÁÆ®·Ñ¿¡°Ô Á¤º¸¸¦ ¿ä±¸ÇÏ°Ô µÇ´Âµ¥ ÀÌ´Â Ä¡¸íÀûÀÎ ¿¡·¯ÀÇ ¿øÀÎÀÌ µÈ´Ù.