³ª. À̵¿ ¹× »ðÀÔ

´ÙÀ½Àº ij·µ À§Ä¡¸¦ Ä¿¼­À̵¿Å°·Î ¿òÁ÷¿© º¸°í Áß°£¿¡ ¹®ÀÚ¿­À» »ðÀÔÇϰųª »èÁ¦ÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾îº¸ÀÚ. ¾ÆÁ÷ ¿©·¯ ÁÙÀº Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î Á¿ìÀ̵¿¸¸ °¡´ÉÇÏÁö¸¸ Àû¾îµµ ÇÑ ÁÙ ¹üÀ§¿¡¼­´Â ¹®ÀÚ¿­ ÆíÁýÀÌ °¡´ÉÇÏ´Ù.

 

 Ime2 ÇÁ·ÎÁ§Æ®¸¦ º¹»çÇÏ¿© Ime3 ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÏ°í lpszClass¸¸ Ime3À¸·Î ¼öÁ¤Çϵµ·Ï ÇÏÀÚ. ¾ÕÀ¸·Îµµ »çº»Àº °è¼Ó ÀÌ·± ½ÄÀ¸·Î ÀÛ¼ºÇÏ¸é µÈ´Ù.

 ÆíÁýÀ» Çϱâ À§Çؼ­´Â ¸ÕÀú ¾ÕµÚ·Î À̵¿ÇØ¾ß Çϴµ¥ ÀüÈÄ À̵¿À̶õ °ð ÇöÀç ÆíÁý À§Ä¡ÀÎ offº¯¼ö¸¦ ÀÌÀü, ÀÌÈÄ ¹®ÀÚ À§Ä¡·Î ¹Ù²Û´Ù´Â ¶æÀÌ´Ù. ´ÙÀ½ ¼¼ ÇÔ¼ö´Â ¾ÕµÚÀÇ ¹®ÀÚ À§Ä¡¸¦ ã¾ÆÁØ´Ù.

 

inline BOOL IsDBCS(int nPos)

{

     return (IsDBCSLeadByte(buf[nPos]));

}

 

int GetPrevOff(int nPos)

{

     int n, size;

 

     if (nPos==0) {

          return 0;

     }

 

     for (n=0;;) {

          if (IsDBCS(n)) {

               size=2;

          } else {

               size=1;

          }

          n+=size;

          if (n >= nPos)

               break;

     }

     return n-size;

}

 

int GetNextOff(int nPos)

{

     if (IsDBCS(nPos)) {

          return nPos+2;

     } else {

          return nPos+1;

     }

}

 

¸ÕÀú ´ÙÀ½ ¹®ÀÚ¸¦ ã¾ÆÁÖ´Â GetNextOff ÇÔ¼ö¸¦ º¸ÀÚ. ÀÌ ÇÔ¼ö´Â nPos À§Ä¡ÀÇ ¹®ÀÚ°¡ ÇѱÛÀ̸é 2¹ÙÀÌÆ® ´ÙÀ½ À§Ä¡¸¦ ã°í ±×·¸Áö ¾ÊÀ¸¸é 1¹ÙÀÌÆ® ´ÙÀ½ÀÇ À§Ä¡¸¦ ã´Â´Ù. ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ°¡ ÇѱÛÀÎÁö ¾Æ´ÑÁö´Â IsDBCS ÇÔ¼ö¸¦ È£ÃâÇغ¸¸é ½±°Ô ¾Ë ¼ö Àִµ¥ ÀÌ ÇÔ¼ö´Â IsDBCSLeadByte API ÇÔ¼ö¸¦ È£ÃâÇÏ¿© 2¹ÙÀÌÆ® ¹®ÀÚÀÎÁö Á¶»çÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â IsDBCS ÇÔ¼ö°¡ ÀÌ·¸°Ô °£´ÜÇÏÁö¸¸ ´ÙÀ½ ¿¹Á¦¿¡¼­´Â Á¶°ÇÀÌ Á» ´õ Ãß°¡µÉ °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÀÚÁÖ È£ÃâµÇ¹Ç·Î inlineÀ¸·Î ¼±¾ðÇÏ¿© È£Ãâ¼Óµµ¸¦ ³ôÀ̵µ·Ï ÇÏ¿´´Ù. GetNextOff ÇÔ¼ö°¡ ã¾Æ ÁÖ´Â ´ÙÀ½ ¹øÁö·Î À̵¿ÇÏ¸é ¿À¸¥ÂÊÀ¸·Î ÇÑ Ä­ À̵¿ÇÏ°Ô µÈ´Ù.

´ÙÀ½ ¹®ÀÚ·Î À̵¿ÇÏ´Â °ÍÀº ¾ÆÁÖ °£´ÜÇÏÁö¸¸ ÀÌÀü ¹®ÀÚ·ÎÀÇ À̵¿Àº ±×¸® ½±Áö ¾Ê´Ù. Á¤È®ÇÑ À§Ä¡¸¦ ã±â À§ÇØ ¹öÆÛÀÇ ¼±µÎ¿¡¼­ºÎÅÍ ¹®ÀÚ ¼ö¸¦ ¼¼¾î ¿Í¾ß ÇÑ´Ù. ÇѱÛÀ̸é 2¹®ÀÚ¸¦ °Ç³Ê¶Ù°í ¿µ¹®À̸é 1¹®ÀÚ¸¦ °Ç³Ê¶Ù¸é¼­ ÇöÀç À§Ä¡¿¡ µµ´ÞÇßÀ» ¶§ ¹Ù·Î ÀÌÀü ¹®ÀÚ À§Ä¡¸¦ ÃëÇÏ¸é µÈ´Ù. DBCS ¹®ÀÚ¼ÂÀº ¹®ÀÚ ±æÀÌ°¡ °íÁ¤ÀûÀÌÁö ¾Ê±â ¶§¹®¿¡ ÀÌ·± ½ÄÀ¸·Î ÀÌÀü ¹®ÀÚ¸¦ ãÀ» ¼ö¹Û¿¡ ¾ø´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.

ÀÌ ¹æ¹ý´ë·Î¶ó¸é ¹®¼­ÀÇ ±æÀÌ°¡ ±æ¾îÁú¼ö·Ï ÀÌÀü ¹®ÀÚÀÇ À§Ä¡¸¦ ã´Âµ¥ ½Ã°£ÀÌ ¸¹ÀÌ °É¸®°Ô µÈ´Ù. ÀÌ ¿¹Á¦´Â ¾ÆÁÖ °£´ÜÇϹǷΠ¹öÆÛÀÇ Ã³À½ºÎÅÍ °Ë»öÀ» ÇÏ´Â ºñÈ¿À²ÀûÀÎ Äڵ带 ¾²°í Àִµ¥ ¹°·Ð Á¶±Ý¸¸ ´õ ½Å°æÀ» ¾²¸é ÈξÀ ´õ È¿À²ÀûÀÎ Äڵ带 ¸¸µé ¼ö ÀÖ´Ù. ¿©·¯ ÁÙ ÀԷµµ ¾ÈµÇ´Â »óȲÀ̹ǷΠÇöÀç´Â GetPrevOff ÇÔ¼öÀÇ ÄÚµå·Î ¸¸Á·Çϵµ·Ï ÇÏÀÚ.

 ÆíÁý À§Ä¡¸¦ º¯°æÇÏ´Â ½ÃÁ¡Àº »ç¿ëÀÚ°¡ Ä¿¼­À̵¿Å°¸¦ ´©¸¦ ¶§À̹ǷΠŰº¸µå ¸Þ½ÃÁö¿¡¼­ À§Ä¡¸¦ º¯°æÇÏ¸é µÈ´Ù. WM_KEYDOWN ¸Þ½ÃÁö ó¸® ·çƾÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ¿´´Ù.

 

     case WM_KEYDOWN:

          switch (wParam)

          {

          case VK_LEFT:

               if (off > 0) {

                   off=GetPrevOff(off);

                   SetCaret();

               }

               return 0;

          case VK_RIGHT:

               if (off < (int)strlen(buf)) {

                   off=GetNextOff(off);

                   SetCaret();

               }

               return 0;

          case VK_HOME:

               off=0;

               SetCaret();

               return 0;

          case VK_END:

               off=lstrlen(buf);

               SetCaret();

               return 0;

          }

          break;

 

¿À¸¥ÂÊÀ¸·Î À̵¿ÇÒ ¶§´Â GetNextOff ÇÔ¼ö¸¦ ºÎ¸£µÇ ´Ü ¹®¼­ ³¡¿¡¼­´Â ´õ ÀÌ»ó ¿À¸¥ÂÊÀÌ ¾øÀ¸¹Ç·Î À̵¿ÇÒ ¼ö ¾ø´Ù. off¿¡ ¿À¸¥ÂÊ ´ÙÀ½ À§Ä¡¸¦ ´ëÀÔÇÏ°í SetCaret ÇÔ¼ö¸¦ È£ÃâÇϸé Ä¿¼­°¡ º¯°æµÈ off À§Ä¡·Î À̵¿ÇÒ °ÍÀÌ´Ù. ¿ÞÂÊÀ¸·ÎÀÇ À̵¿Àº GetPrevOff ÇÔ¼ö·Î ÀÌÀü ¹®ÀÚÀÇ À§Ä¡¸¦ ã¾Æ º¯°æÇ쵂 ÁÙÀÇ Ã³À½¿¡ ¿Í ÀÖÀ¸¸é À̵¿ÇÒ ¼ö ¾ø´Ù. ÁÙÀÇ Ã³À½°ú ³¡À¸·Î À̵¿ÇÏ´Â Home, End´Â µû·Î ¼³¸íÀÌ ÇÊ¿ä¾øÀ» Á¤µµ·Î ½±´Ù. ÁÙÀÇ Ã³À½Àº ¿ÀÇÁ¼ÂÀÌ 0ÀÌ°í ÁÙÀÇ ³¡Àº ¹®ÀÚ¿­ÀÇ ±æÀÌ À§Ä¡ÀÌ´Ù.

 ¿©±â±îÁö ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇغ¸¸é Ä¿¼­°¡ Àß À̵¿Çϱâ´Â Çϴµ¥ ¹®ÀÚ¸¦ ÀÔ·ÂÇÒ ¶§ ÇöÀç À§Ä¡¿¡ »ó°ü¾øÀÌ ¹«Á¶°Ç µÚ·Î °¡¼­ ºÙ´Â´Ù. ¿Ö³ÄÇϸé WM_CHAR, WM_IME_COMPOSITION ¸Þ½ÃÁö¿¡¼­ ÇöÀç À§Ä¡¿¡ »ðÀÔÇÏÁö ¾Ê°í ¹«Á¶°Ç µÚ¿¡ ºÙÀ̵µ·Ï Äڵ尡 ÀÛ¼ºµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ ÀÌ ÇÔ¼öµéÀÌ ÇöÀç À§Ä¡ÀÎ off¸¦ ÂüÁ¶ÇÏ¿© ÀÌ À§Ä¡¿¡ ¹®ÀÚ¸¦ »ðÀÔÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

ÀÌ ¿¹Á¦ºÎÅʹ ij·µÀÇ À§Ä¡¸¦ ¿Å±æ ¼ö Àֱ⠶§¹®¿¡ lstrcat ÇÔ¼ö·Î ¹öÆÛ ³¡¿¡ ¹®ÀÚ¸¦ ´Ü¼øÈ÷ Ãß°¡Çؼ­´Â ¾ÈµÇ¸ç ÇöÀç À§Ä¡ ÀÌÈÄÀÇ ¹®ÀÚ¸¦ µÚ·Î º¹»çÇØ¾ß ÇÑ´Ù. »èÁ¦µµ ¸¶Âù°¡Áö·Î ¹öÆÛ ³¡ÀÇ µÎ ¹ÙÀÌÆ®¸¦ À߶󳻴 Á¤µµ·Î´Â ¾ÈµÇ¸ç ÇöÀç À§Ä¡ ÀÌÈÄÀÇ ¹®ÀÚ¸¦ ¾ÕÂÊÀ¸·Î º¹»çÇØ¾ß ÇÑ´Ù.

±×´ÙÁö º¹ÀâÇÑ µ¿ÀÛÀº ¾Æ´ÏÁö¸¸ ÀÌ·± ÀÛ¾÷À» WndProc¿¡¼­ Á÷Á¢ ÇÏ´Â °ÍÀº ¹ø°Å·Ó´Ù. ¶ÇÇÑ ¾ÕÀ¸·Î ±â´ÉÀ» °è¼Ó È®ÀåÇÏ·Á¸é ¹®ÀÚ¿­, »ðÀÔ »èÁ¦´Â ¿©·¯ ±ºµ¥¼­ ÇÊ¿äÇϹǷΠ¾Æ¿¹ ÇÔ¼ö¸¦ ¸¸µé¾î ³õµµ·Ï ÇÏÀÚ.

 

void Insert(int nPos, TCHAR *str)

{

     int len;

     int movelen;

 

     len=lstrlen(str);

     if (len==0) return;

     movelen=lstrlen(buf+nPos)+1;

     memmove(buf+nPos+len,buf+nPos,movelen);

     memcpy(buf+nPos,str,len);

}

 

void Delete(int nPos, int nCount)

{

     int movelen;

 

     if (nCount == 0) return;

     if (lstrlen(buf) < nPos+nCount) return;

 

     movelen=lstrlen(buf+nPos+nCount)+1;

     memmove(buf+nPos, buf+nPos+nCount, movelen);

}

 

ÀÌ µÎ ÇÔ¼ö´Â IME¿Í´Â ÀüÇô »ó°üÀÌ ¾ø´Â ÀϹÝÀûÀÎ ¹®ÀÚ¿­Ã³¸® ÇÔ¼öÀÌ´Ù. Insert ÇÔ¼ö´Â nPos À§Ä¡¿¡ str ¹®ÀÚ¿­À» »ðÀÔÇÑ´Ù. »ðÀÔÇÏ´Â ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇѵ¥ ABCDEFGH ¹®ÀÚ¿­ÀÇ ¿ÀÇÁ¼Â 4¿¡ XYZ ¹®ÀÚ¿­À» »ðÀÔÇÑ´Ù°í Çغ¸ÀÚ.

»ðÀ﵃ À§Ä¡ÀÇ µÚÂÊ¿¡ ÀÖ´Â ¹®ÀÚ¸¦ »ðÀÔ ¹®ÀÚ¿­ ±æÀ̸¸Å­ µÚ·Î À̵¿½ÃŲ´Ù. À̶§ À̵¿½Ãų ±æÀÌ movelenÀº nPos À§Ä¡ ÀÌÈÄÀÇ ¹®ÀÚ¿­ ±æÀÌ¿¡ ³Î Á¾·á¹®ÀÚ ±æÀ̸¦ ´õÇÑ ¸¸Å­À̸ç À̵¿µÉ »õ À§Ä¡´Â »ðÀÔ À§Ä¡¿¡¼­ »ðÀÔ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ´õÇÑ °÷ÀÌ´Ù. EFGH\0 ¹®ÀÚ¿­ÀÇ ±æÀÌ 5¸¸Å­À» ¿ÀÇÁ¼Â 7(4+3)·Î À̵¿½ÃÅ°¸é ¿ÀÇÁ¼Â 4ÀÌÈĺÎÅÍ 3¹ÙÀÌÆ®¸¸Å­ °ø°£ÀÌ »ý±ä´Ù. ÀÌ °ø°£¿¡ »õ·Î »ðÀÔÇÒ ¹®ÀÚ¿­ XYZ¸¦ ³¢¿ö³ÖÀ¸¸é ¹®ÀÚ¿­ »ðÀÔÀÌ ¹«»çÈ÷ ¿Ï·áµÈ´Ù.

¹®ÀÚ¿­À» À̵¿½Ãų ¶§ NULL Á¾·á¹®ÀÚµµ °°ÀÌ Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù´Â Á¡¸¸ ÁÖÀÇÇÏ¸é ±×¸® ¾î·ÆÁö ¾Ê´Ù. ¸¸¾à »ðÀÔÇÒ ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ 0ÀÌ¸é »ðÀÔÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í ±×³É ¸®ÅÏÇÏ¸é µÈ´Ù. ¹®ÀÚ¿­À» »èÁ¦ÇÏ´Â Delete ÇÔ¼öµµ ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù. »èÁ¦ÇÒ ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ 0À̰ųª »èÁ¦ÇÒ À§Ä¡°¡ ¹öÆÛÀÇ ±æÀ̺¸´Ù ´õ Å©¸é ¿¡·¯À̹ǷΠ±×³É ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é »èÁ¦ÇÒ ¹®ÀÚ¿­ µÚÂÊ ¹®ÀÚ¿­À» nPos À§Ä¡·Î ¿Å±â±â¸¸ ÇÏ¸é µÈ´Ù. À̶§µµ ¹°·Ð ³Î Á¾·á¹®ÀÚ¸¦ °°ÀÌ Æ÷ÇÔ½ÃÄÑ À̵¿ÇØ¾ß ÇÑ´Ù.

 WM_CHAR, WM_IME_COMPOSITIONÀ» ¼öÁ¤ÇÏ¿© off À§Ä¡¿¡ ¹®ÀÚ¿­À» »ðÀÔ, »èÁ¦Çϵµ·Ï ¼öÁ¤ÇÏ¿´´Ù.

 

     case WM_CHAR:

          szChar[0]=(BYTE)wParam;

          szChar[1]=0;

          for (i=0;i<LOWORD(lParam);i++) {

            Insert(off,szChar);

               off+=lstrlen(szChar);

          }

          bComp=FALSE;

          InvalidateRect(hWnd,NULL,TRUE);

          SetCaret();

          return 0;

     case WM_IME_COMPOSITION:

          if (lParam & GCS_COMPSTR) {

               hImc=ImmGetContext(hWnd);

               len=ImmGetCompositionString(hImc,GCS_COMPSTR,NULL,0);

               szComp=(TCHAR *)malloc(len+1);

               ImmGetCompositionString(hImc,GCS_COMPSTR,szComp,len);

               szComp[len]=0;

               if (bComp) {

                   off-=2;

               Delete(off,2);

               }

               if (len == 0) {

                   bComp=FALSE;

               } else {

                   bComp=TRUE;

               }

            Insert(off,szComp);

               off+=len;

               ImmReleaseContext(hWnd,hImc);

               free(szComp);

               InvalidateRect(hWnd,NULL,TRUE);

               SetCaret();

               }

          break;

     case WM_IME_CHAR:

          if (IsDBCSLeadByte((BYTE)(wParam >> 8))) {

               szChar[0]=HIBYTE(LOWORD(wParam));

               szChar[1]=LOBYTE(LOWORD(wParam));

               szChar[2]=0;

          } else {

               szChar[0]=(BYTE)wParam;

               szChar[1]=0;

          }

          if (bComp) {

               off-=2;

            Delete(off,2);

          }

        Insert(off,szChar);

          off+=lstrlen(szChar);

          bComp=FALSE;

          InvalidateRect(hWnd,NULL,TRUE);

          SetCaret();

          return 0;

 

lstrcat ´ë½Å Insert ÇÔ¼ö·Î off À§Ä¡¿¡ ¹®ÀÚ¸¦ »ðÀÔÇϵµ·Ï ÇßÀ¸¸ç buf¸¦ Á÷Á¢ Á¶ÀÛÇÏ´Â ´ë½Å Delete ÇÔ¼ö·Î ÁöÁ¤ÇÑ ¹ÙÀÌÆ®¸¸Å­ »èÁ¦Çϵµ·Ï ÇÏ¿´´Ù. À̵¿ ÈÄ ¹®ÀÚ¿­ »ðÀÔÀÌ °¡´ÉÇØÁ³´Ù. ij·µÀ» ¹®ÀÚ¿­ÀÇ Áß°£ÂëÀ¸·Î À̵¿ÇÑ ÈÄ ¹®ÀÚ¸¦ ÀÔ·ÂÇϸé ÇöÀç À§Ä¡¿¡ ¹®ÀÚ°¡ Àß »ðÀԵȴÙ.

 ´ÙÀ½Àº »èÁ¦µµ °¡´ÉÇϵµ·Ï Çغ¸ÀÚ. »èÁ¦´Â <BS>¿Í <Del>Å°¸¦ »ç¿ëÇϴµ¥ ¸ÕÀú »ó´ëÀûÀ¸·Î ½¬¿î <Del>Å°ÀÇ ÄÚµåºÎÅÍ ÀÛ¼ºÇغ¸ÀÚ.

 

     case WM_KEYDOWN:

          switch (wParam)

          {

          ....

          case VK_DELETE:

               if (IsDBCS(off)) {

                   Delete(off, 2);

               } else {

                   Delete(off, 1);

               }

               InvalidateRect(hWnd,NULL,TRUE);

               return 0;

 

<Del>Å°´Â ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ¸¦ »èÁ¦ÇÏ´Â °ÍÀ̹ǷΠoff À§Ä¡ÀÇ ¹®ÀÚ ±æÀ̸¦ Á¶»çÇÑ ÈÄ Delete ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. Delete ÇÔ¼ö¿¡¼­ ¹üÀ§ Á¡°ËÀ» ÇϹǷΠ¹®ÀÚ¿­ ³¡ÀÎÁö´Â ±»ÀÌ Á¡°ËÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ¸¦ »èÁ¦ÇßÀ¸¹Ç·Î off´Â º¯ÇÔÀÌ ¾øÀ¸¸ç µû¶ó¼­ SetCaret ÇÔ¼öµµ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 <BS>Å°´Â ÇöÀç À§Ä¡¿¡¼­ µÚ·Î »èÁ¦ÇÏ´Â °ÍÀ̱⠶§¹®¿¡ ÇÑ Ä­ ¿ÞÂÊÀ¸·Î °£ ÈÄ <Del>Å°¸¦ ´©¸£´Â °Í°ú µ¿ÀÏÇÏ´Ù. ´Ü Á¦ÀÏ ¿ÞÂÊ¿¡ ÀÖÀ» ¶§´Â ¾Æ¹« °Íµµ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

     case WM_KEYDOWN:

          switch (wParam)

          {

          ....

          case VK_BACK:

               if (off == 0)

                   return 0;

               off=GetPrevOff(off);

               SendMessage(hWnd,WM_KEYDOWN,VK_DELETE,0);

               SetCaret();

               return 0;

 

GetPrevOff ÇÔ¼ö·Î ¿ÞÂÊ ¹®ÀÚ À§Ä¡¸¦ ã°í ÀÌ À§Ä¡¿¡¼­ <Del>Å°¸¦ ´©¸£¸é ¿øÇÏ´Â ´ë·Î µÚ·Î »èÁ¦µÈ´Ù. ÇöÀç À§Ä¡°¡ ¾ÕÀ¸·Î À̵¿ÇßÀ¸¹Ç·Î SetCaret ÇÔ¼ö´Â È£ÃâÇØ¾ß ÇÑ´Ù.

 ¿©±â±îÁö ÀÛ¼ºÇÑ Äڵ带 ½ÇÇàÇÑ ÈÄ <BS>Å°·Î ¹®ÀÚ¸¦ »èÁ¦Çغ¸¸é ¾Õ ¹®ÀÚ°¡ Áö¿öÁö´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÌ»óÇÑ ¹®ÀÚ·Î ¹Ù²î±â¸¸ ÇÒ °ÍÀÌ´Ù. 123456 ÀÔ·Â ÈÄ <BS>¸¦ ´­·¯º¸¸é 6ÀÌ BS ¹®ÀÚÀÎ ·Î º¯°æµÈ´Ù. ¿Ö³ÄÇϸé <BS>Å°´Â Ä¿¼­À̵¿Å°³ª <Del>Å°¿Í´Â ´Þ¸® ¹®ÀÚÅ°À̱⠶§¹®¿¡ WM_CHAR ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃÅ°¸ç WM_CHAR¿¡¼­´Â ¹«Á¶°Ç wParamÀ¸·Î Àü´ÞµÈ ¹®ÀÚ¸¦ ÇöÀç À§Ä¡¿¡ »ðÀÔÇϱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ <BS>Å°´Â ¹®ÀÚ·Î Ãë±ÞÇÏÁö ¾Êµµ·Ï Ưº°ÇÑ ¿¹¿Ü 󸮸¦ ÇØ¾ß ÇÑ´Ù.

 

     case WM_CHAR:

        if (wParam == 8)

            return 0;

          szChar[0]=(BYTE)wParam;

 

WM_CHAR¿¡¼­ ÀԷ¹ÞÀº ¹®ÀÚ°¡ BSÀÏ °æ¿ì ±×³É ¸®ÅÏÇÏ¿© ¹®ÀÚ°¡ Ãâ·ÂµÇÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ±× ¿ÜÀÇ ¹®ÀÚ´Â Æò»ó½Ã´ë·Î ó¸®ÇÏ¸é µÈ´Ù. ÆíÁý±â´ÉÀº ÀÏ´Ü ¿Ï¼ºµÇ¾ú°í ¸¶Áö¸·À¸·Î ÇÑ±Û Á¶¸³Áß¿¡ ¿­¸®´Â Á¶¸³Ã¢ÀÌ ´Ù¼Ò ´«¿¡ °Å½½¸®¹Ç·Î ÀÌ Ã¢Àº ¼û±âµµ·Ï ÇÑ´Ù. Á¶¸³ÀÌ ½ÃÀ۵Ǵ ½ÃÁ¡ÀÎ WM_IME_STARTCOMPOSITION ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÀÌ ¸Þ½ÃÁö¸¦ DefWindowProcÀ¸·Î º¸³»Áö ¾Ê°í ±×³É ¸®ÅÏÇÏ¸é µÈ´Ù.

 

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

{

     ....

     case WM_IME_STARTCOMPOSITION:

          return 0;

 

Á¶¸³Ã¢À» ´Ù½Ã º¸À̵µ·Ï ÇÏ°í ½Í´Ù¸é return 0;¸¦ break;·Î ¹Ù²Ù±â¸¸ ÇÏ¸é µÇ´Âµ¥ Á¶¸³ÁßÀÇ ¹®ÀÚ°¡ ÀÛ¾÷¿µ¿ª¿¡ ¹Ù·Î º¸À̱⠶§¹®¿¡ ±»ÀÌ Á¶¸³Ã¢À» º¸¿©ÁÙ ÇÊ¿ä°¡ ¾ø´Â °Í °°´Ù. ¿©±â±îÁö ÇѱÛÀÇ ÀÔ·Â ¹× ij·µ ó¸®, À̵¿, »ðÀÔ, »èÁ¦±îÁö ¿Ï¼ºÇÏ¿´´Ù.