´ÙÀ½Àº 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·µ ó¸®, À̵¿, »ðÀÔ, »èÁ¦±îÁö ¿Ï¼ºÇÏ¿´´Ù.