³ª. Á¶¸³ÁßÀÎ ¹®ÀÚ º¸¿©ÁÖ±â

±×·³ ÀÌÁ¦ IME ¸Þ½ÃÁö¸¦ È°¿ëÇÏ¿© Á¶¸³ÁßÀÎ ÇѱÛÀ» º¸¿©ÁÖ´Â ¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ¸Þ¸ðÀå¿¡¼­ »ç¿ëÇÏ°í ÀÖ´Â ¿¡µðÆ® ÄÁÆ®·ÑÀ» óÀ½ºÎÅÍ ÀÛ¼ºÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. ÀÌ ½Ç½ÀÀº »ý°¢º¸´Ù º¹ÀâÇϹǷΠ¹Ýµå½Ã ¼Ò½º¸¦ Á÷Á¢ ÀÔ·ÂÇØ °¡¸é¼­ ¿Ö Àú·± Äڵ尡 ÇÊ¿äÇÒ±î °í¹ÎÀ» ÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. ±×·¸Áö ¾ÊÀ¸¸é °á°ú´Â º¼ ¼ö À־ µ¿ÀÛ¹æ½Ä¿¡ ´ëÇÑ ÀÌÇظ¦ ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ÀÀ¿ëÀÌ ¾î·Á¿öÁø´Ù. ¹Ýµå½Ã ÄÄÆÄÀÏ·¯¸¦ ¶ç¿ö ³õ°í ½Ç½ÀÀ» °°ÀÌ Çغ¸µµ·Ï ÇÏÀÚ. ù ¹ø° ¿¹Á¦ÀÇ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù. ²À ÇÊ¿äÇÑ Äڵ常 ³Ö¾úÀ¸¹Ç·Î ´ÙÇàÈ÷ ±×´ÙÁö ±æÁö ¾Ê´Ù.

Ime1À̶ó´Â À̸§À¸·Î »õ ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÏ°í ÀÌ ÇÁ·ÎÁ§Æ®¿¡ Ime1.cpp¸¦ Ãß°¡ÇÑ ÈÄ ´ÙÀ½ ¼Ò½º¸¦ ÀÔ·ÂÇÏ¸é µÈ´Ù. Á÷Á¢ ÀÔ·ÂÇϱⰡ ±ÍÂúÀ¸¸é CD-ROMÀÇ ¿¹Á¦¸¦ ¿­¾î¼­ º¹»çÇØ ¿Àµµ·Ï Ç쵂 ±×·¸´Ù°í ÇÏ´õ¶óµµ ÇÁ·ÎÁ§Æ®´Â ¹Ýµå½Ã Á÷Á¢ ¸¸µé¾î º¸±â ¹Ù¶õ´Ù. imm32.lib¿Í ¿¬°áÇÏ´Â °ÍÀ» ÀØÁö ¸»µµ·Ï ÇÏÀÚ.

 

#include <windows.h>

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_hInst;

HWND hWndMain;

LPCTSTR lpszClass=TEXT("Ime1");

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     HWND hWnd;

     MSG Message;

     WNDCLASS WndClass;

     g_hInst=hInstance;

    

     WndClass.cbClsExtra=0;

     WndClass.cbWndExtra=0;

     WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

     WndClass.hCursor=LoadCursor(NULL,IDC_IBEAM);

     WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

     WndClass.hInstance=hInstance;

     WndClass.lpfnWndProc=(WNDPROC)WndProc;

     WndClass.lpszClassName=lpszClass;

     WndClass.lpszMenuName=NULL;

     WndClass.style=CS_HREDRAW | CS_VREDRAW;

     RegisterClass(&WndClass);

 

     hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,

          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

          NULL,(HMENU)NULL,hInstance,NULL);

     ShowWindow(hWnd,nCmdShow);

     hWndMain=hWnd;

    

     while(GetMessage(&Message,0,0,0)) {

          TranslateMessage(&Message);

          DispatchMessage(&Message);

     }

     return (int)Message.wParam;

}

 

#include <imm.h>

TCHAR *buf;

BOOL bComp;

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

{

     HDC hdc;

     PAINTSTRUCT ps;

     HIMC hImc;

     TCHAR szChar[3], *szComp;

     int i;

     int len;

 

     switch(iMessage) {

     case WM_CREATE:

          bComp=FALSE;

          buf=(TCHAR *)malloc(65536);

          memset(buf,0,65536);

          return 0;

     case WM_CHAR:

          szChar[0]=(BYTE)wParam;

          szChar[1]=0;

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

              lstrcat(buf,szChar);

          }

          bComp=FALSE;

          InvalidateRect(hWnd,NULL,TRUE);

          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) {

                    buf[lstrlen(buf)-2]=0;

              }

              if (len == 0) {

                   bComp=FALSE;

              } else {

                   bComp=TRUE;

              }

              lstrcat(buf,szComp);

              ImmReleaseContext(hWnd,hImc);

              free(szComp);

              InvalidateRect(hWnd,NULL,TRUE);

          }

          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) {

              buf[lstrlen(buf)-2]=0;

          }

          lstrcat(buf,szChar);

          bComp=FALSE;

          InvalidateRect(hWnd,NULL,TRUE);

          return 0;

     case WM_PAINT:

          hdc=BeginPaint(hWnd,&ps);

          TextOut(hdc,0,0,buf,lstrlen(buf));

          EndPaint(hWnd,&ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          free(buf);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

ÀÌ ¿¹Á¦´Â µÎ °³ÀÇ Àü¿ªº¯¼ö¸¦ ¼±¾ðÇÏ°í ÀÖ´Ù. buf´Â ÀÔ·ÂµÈ ¹®ÀÚ¿­À» ÀúÀåÇÒ ¹öÆÛÀε¥ WM_CREATE¿¡¼­ 65536Å©±â(64KB)·Î ÇÒ´çÇÏ¿´À¸¸ç ³»¿ëÀ» ¸ðµÎ 0À¸·Î ÃʱâÈ­ÇÏ¿´´Ù. ´õ Å« ¹®¼­¸¦ ÆíÁýÇÏ°íÀÚ ÇÑ´Ù¸é º°µµÀÇ ¸Þ¸ð¸®°ü¸®°¡ ÇÊ¿äÇÏ°ÚÁö¸¸ °£´ÜÇÑ ¿¹Á¦À̹ǷΠÀÏ´Ü ÀÌ Á¤µµ Å©±â¸é ÃæºÐÇÏ´Ù. bComp º¯¼ö´Â ÇöÀç ÇѱÛÀÌ Á¶¸³ÁßÀΰ¡ ¾Æ´Ñ°¡¸¦ ±â¾ïÇϴµ¥ ÀÌ °ªÀÌ TRUEÀ̸é ÇѱÛÀ» Á¶¸³ÇÏ°í ÀÖ´Â ÁßÀÌ°í FALSEÀ̸é Á¶¸³ÀÌ ¿Ï·áµÇ¾ú°Å³ª ¿µ¹®À» ÀÔ·ÂÇÏ°í ÀÖ´Â ÁßÀÌ´Ù. ÀÌ º¯¼ö´Â ¹®ÀÚÀÔ·ÂÁß¿¡ ¼ö½Ã·Î Âü°íÇÏ°í °ü¸®ÇØ¾ß ÇÏ´Â ¾ÆÁÖ Áß¿äÇÑ º¯¼öÀÌ´Ù. ÃÖÃÊ ½ÇÇàµÉ ¶§´Â ÇѱÛÁ¶¸³ÁßÀÌ ¾Æ´Ï¹Ç·Î WM_CREATE¿¡¼­ FALSE·Î ÃʱâÈ­ÇÑ´Ù.

WndProc¿¡¼­´Â ¿©¼¸ °³ÀÇ ¸Þ½ÃÁö¸¦ ó¸®Çϴµ¥ WM_CREATE´Â ¹öÆÛ ÇÒ´ç ¹× ÃʱâÈ­¸¦ ÇÏ°í WM_PAINT´Â ¹öÆÛÀÇ ³»¿ëÀ» È­¸éÀ¸·Î ¹«Á¶°Ç Ãâ·ÂÇÑ´Ù. WM_DESTROY´Â ¹öÆÛ¸¦ ÇØÁ¦ÇÏ°í ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â ÀÏÀ» Çϴµ¥ ¼¼ ¸Þ½ÃÁö´Â ¾ÆÁÖ ÆòÀÌÇϹǷΠº°´Ù¸¥ °ü½ÉÀ» º¸ÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ÀÌ ÇÁ·Î±×·¥ÀÌ ¹®ÀÚÀÔ·ÂÀ» À§ÇØ Ã³¸®ÇÏ´Â ¸Þ½ÃÁö´Â ¼¼ °¡Áö»ÓÀÌ´Ù. ¸ÕÀú °¡Àå ½¬¿î WM_CHAR ¸Þ½ÃÁöÀÇ Äڵ带 ºÐ¼®Çغ¸ÀÚ. ÀÌ ¸Þ½ÃÁö´Â ÇѱÛÀÌ ¾Æ´Ñ ¿µ¹®, ¼ýÀÚ¸¦ ÀÔ·ÂÇÒ ¶§¸¸ ¹ß»ýÇϴµ¥ wParamÀº Ç×»ó 1¹ÙÀÌÆ®ÀÌ´Ù.

wParamÀ¸·Î Àü´ÞµÈ ¹®ÀÚÄڵ带 ¹öÆÛ µÚ¿¡ ºÙÀ̱⸸ ÇÏ¸é µÇ´Âµ¥ szChar ¹öÆÛ¿¡ ±æÀÌ 1ÀÇ ¹®ÀÚ¿­À» ¸¸µç ÈÄ buf µÚ¿¡ ÀÌ ¹®ÀÚ¿­À» ´©Àû½ÃÄ×´Ù. ¹°·Ð wParam ¹®ÀÚ¸¦ bufÀÇ ³¡¿¡ ¹Ù·Î ´ëÀÔÇصµ º° »ó°üÀº ¾øÁö¸¸ ÀÏ°ü¼º°ú È®À强À» À§ÇØ Àӽà ¹®ÀÚ¿­ ¹öÆÛ¸¦ »ç¿ëÇÏ¿´´Ù. LOWORD(lParam)Àº Å°ÀÔ·Â ¹Ýº¹È½¼öÀε¥ ÀÌ È½¼ö¸¸Å­ ¹®ÀÚ¸¦ ´©Àû½ÃŲ´Ù. Åë»ó ¹Ýº¹È½¼ö´Â 1À̹ǷΠ¹«½ÃÇصµ º° »ó°üÀº ¾øÁö¸¸ ¿¹Á¦ÀÇ ¿Ï¼ºµµ¸¦ ³ôÀ̱â À§ÇØ ÀÏ´Ü Æ÷ÇÔ½ÃÄ×´Ù.

¿µ¹®, ¼ýÀÚ°¡ ÀԷµǾú´Ù´Â °ÍÀº ÇѱÛÁ¶¸³ÁßÀÌ ¾Æ´Ï¶ó´Â ¶æÀ̹ǷΠbComp º¯¼ö´Â FALSE·Î ¹Ù²Û´Ù. ¹®ÀÚ¸¦ ¹öÆÛ¿¡ ´©Àû½ÃŲ ÈÄ È­¸éÀ» ¹«È¿È­ÇÏ¿© ´Ù½Ã ±×¸®µµ·Ï Çϸé ÀÔ·ÂµÈ ¹®ÀÚ°¡ º¸ÀÏ °ÍÀÌ´Ù. ¿©±â±îÁö´Â DefIme ¿¹Á¦¿Íµµ °ÅÀÇ µ¿ÀÏÇÏ´Ù.

ÀÌ ¿¹Á¦ÀÇ °¡Àå ¾î·Á¿î ºÎºÐÀº WM_IME_COMPOSITION ¸Þ½ÃÁö ó¸® ºÎºÐÀε¥ ÀÌ ¸Þ½ÃÁö´Â ÇѱÛÀ» Á¶¸³ÁßÀÏ ¶§, ¶Ç´Â Á¶¸³ÁßÀÎ ¹®ÀÚ°¡ ¿Ï¼ºµÉ ¶§ º¸³»Áø´Ù. Á¶¸³ÁßÀÎ ¹®ÀÚ¸¸ ó¸®Çϱâ À§ÇØ lParam¿¡ GCS_COMPSTR Ç÷¡±×°¡ ¼³Á¤µÈ °æ¿ì¸¸ ó¸®ÇÏ¸ç ±× ¿ÜÀÇ °æ¿ì´Â DefWindowProcÀ¸·Î 󸮸¦ ³Ñ°Ü µðÆúÆ® 󸮵ǵµ·Ï ÇÏ¿´´Ù. Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ º¸¿©ÁÖ·Á¸é ¸ÕÀú Á¶¸³µÈ ¹®ÀÚÀÇ Äڵ带 ±¸ÇØ¾ß ÇÑ´Ù. À̶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

LONG ImmGetCompositionString(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen);

 

ù ¹ø° Àμö hIMC´Â ÀÔ·Â ÄÁÅؽºÆ®ÀÇ ÇÚµéÀε¥, ImmGetContext ÇÔ¼ö·Î ±¸ÇÑ ÇÚµéÀ» Àü´ÞÇÏ¸é µÈ´Ù. µÎ ¹ø° Àμö dwIndex´Â ±¸ÇÏ°íÀÚ ÇÏ´Â Á¤º¸¸¦ ÁöÁ¤Çϴµ¥, GCS_COMPSTRÀ̸é Á¶¸³ÁßÀÎ ¹®ÀÚÄڵ带 ±¸Çϸç, GCS_RESULTSTRÀÌ¸é ¿Ï¼ºµÈ ¹®ÀÚÄڵ带 ±¸ÇÑ´Ù. Á¶»çµÈ Á¤º¸´Â ¼¼ ¹ø° Àμö lpBuf¿¡ ¸®ÅϵȴÙ. ³× ¹ø° Àμö dwBufLenÀº lpBufÀÇ ±æÀ̸¦ ÁöÁ¤Ç쵂 ´Ü ÀÌ °ªÀÌ 0ÀÌ¸é ½ÇÁ¦ Á¤º¸¸¦ ±¸ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÊ¿äÇÑ ¹öÆÛÀÇ Å©±â¸¦ ¸®ÅÏÇÑ´Ù. ±×·¡¼­ Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ ±¸ÇÒ ¶§´Â ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÛ¼ºÇÏ´Â °ÍÀÌ ¿øÄ¢ÀÌ´Ù.

 

TCHAR *szComp;

int len;

 

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

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

ImmGetCompositionString(hImc,GCS_COMPSTR,szComp,len);

szComp[len]=0;

 

// Á¶»çÇÑ Á¤º¸ »ç¿ë

 

free(szComp);

 

lpBufÀμö¿¡ NULLÀ» ÁÖ°í ÀÌ ¹öÆÛÀÇ ±æÀ̸¦ 0À¸·Î ÁöÁ¤ÇÏ¿© ÇÊ¿äÇÑ ¹öÆÛ Å©±â¸¦ ¸ÕÀú ±¸ÇÑ´Ù. ±×¸®°í Á¶»çµÈ Å©±â¿¡ ³Î¹®ÀÚ¸¦ À§ÇÑ 1À» ´õÇÑ ¸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ ´Ù½Ã ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¿øÇÏ´Â Äڵ带 Á¶»çÇÏ¿´´Ù. À̶§ ImmGetComposition ÇÔ¼ö´Â ½ÇÁ¦·Î Á¶»çµÈ ¹ÙÀÌÆ® ¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¹°·Ð ÇÒ´çÇÑ ¸Þ¸ð¸®´Â Á¤º¸¸¦ »ç¿ëÇÑ ÈÄ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

ÇѱÛÀÇ °æ¿ì ÇÑ À½ÀýÀº ¹«Á¶°Ç 2¹ÙÀÌÆ®À̹ǷΠ±»ÀÌ ÀÌ·± ¹ø°Å·Î¿î ¹æ¹ýÀ» ¾µ ÇÊ¿ä¾øÀÌ °ø¹é°ú ³Î¹®ÀÚÀÇ ±æÀ̱îÁö °í·ÁÇÑ 4¹ÙÀÌÆ® Å©±âÀÇ °íÁ¤ ±æÀÌ ¹öÆÛ¸¦ »ç¿ëÇϸé ÃæºÐÇÏ´Ù. ÇÏÁö¸¸ Á¶»çµÇ´Â Á¤º¸ÀÇ ±æÀÌ°¡ °¡º¯ÀûÀ̶ó¸é µ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â ¹æ¹ýÀÌ ¿øÄ¢ÀûÀ¸·Î ¿ÇÀº ¹æ¹ýÀ̸ç ÀÌ·¸°Ô ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ »ç¿ëÇÏ´õ¶óµµ ½ÇÇà½Ã°£ÀÇ ³¶ºñ´Â °ÅÀÇ ¾ø´Ù.

Á¶¸³ÁßÀÎ ¹®ÀÚÀÇ Äڵ带 ±¸ÇÑ ÈÄ buf ³¡¿¡ ´©Àû½ÃÅ°µÇ ¹«Á¶°Ç µ¡ºÙ¿©¼­´Â ¾ÈµÈ´Ù. ÀÌ ¸Þ½ÃÁö·Î Àü´ÞµÈ ÄÚµå´Â ¿Ï¼ºµÈ ¹®ÀÚ°¡ ¾Æ´Ï¹Ç·Î ÀÌÀüÀÇ Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ ¸ÕÀú Á¦°ÅÇÑ ÈÄ ¹öÆÛ¿¡ ºÙ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¡®ÇÏ¡¯ÀÚ°¡ ÀÔ·ÂµÈ »óÅ¿¡¼­ ¤¤À» ÀÔ·ÂÇÏ¸é ¡®ÇÑ¡¯ÀÚ°¡ µÇ´Âµ¥ ÀÌ·¸°Ô µÇ·Á¸é ¡®ÇÏ¡¯ÀÚ¸¦ ¸ÕÀú Á¦°ÅÇÏ°í ¡®ÇÑ¡¯ÀÚ¸¦ ºÙ¿©¾ß ÇÑ´Ù. Áï Á¶¸³ÁßÀÎ ¹®ÀÚ´Â ´©Àû½ÃÅ°´Â °ÍÀÌ ¾Æ´Ï¶ó ±³Ã¼ÇÏ´Â °ÍÀÌ´Ù.

±×·¡¼­ bComp°¡ TRUEÀÎ °æ¿ì, Áï ÇѱÛÀ» Á¶¸³ÇÏ°í ÀÖÀ» ¶§´Â bufÀÇ µÚÂÊ 2¹ÙÀÌÆ®¸¦ Á¦°ÅÇÑ ÈÄ »õ Á¶¸³ Äڵ带 buf¿¡ ºÙ¿© ±âÁ¸ÀÇ Á¶¸³ÁßÀÎ Äڵ带 »õ ÄÚµå·Î ´ëüÇÑ´Ù. ¿¹Á¦¿¡¼­ Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ Á¦°ÅÇÏ´Â ÄÚµåÀÎ buf[lstrlen(buf)-2]=0;À» ÁÖ¼®À¸·Î ó¸®ÇÑ ÈÄ ÇѱÛÀ» ÀÔ·ÂÇغ¸¸é ÀÌ Äڵ尡 ¿Ö ÇÊ¿äÇÑ°¡ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¡®´ëÇѹα¹¡¯À» ÀÔ·ÂÇߴµ¥ Á¶¸³ÁßÀÇ Àӽà ÄÚµå±îÁö ¸ðµÎ Ãâ·ÂµÇ¾î ¹ö·È´Ù. ÇѱÛÀº ¿µ¹®, ¼ýÀÚ¿Í´Â ´Þ¸® ÇϳªÀÇ Å°ÀÔ·ÂÀ¸·Î ÇÑ ¹®ÀÚ°¡ ¿Ï¼ºµÇÁö ¾Ê°í ¿¬¼ÓÀûÀ¸·Î µé¾î¿À´Â Å°·ÎºÎÅÍ Á¶¸³À» ÇØ ³ª°¡¹Ç·Î ¿Ï¼ºµÇ±â ÀüÀÇ ¹®ÀÚ´Â °è¼Ó ±³Ã¼µÇ¾î¾ß Çϸç ÃÖÁ¾ÀûÀ¸·Î ¿Ï¼ºµÈ ¹®ÀÚ¸¸ ¹öÆÛ¿¡ ºÙ¿©¾ß ÇÑ´Ù.

Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ ó¸®ÁßÀ̹ǷΠbComp´Â TRUE·Î º¯°æÇÏ¿© ¾ÆÁ÷ Á¶¸³ÁßÀÓÀ» ±â·ÏÇسõ¾Æ¾ß Çϴµ¥ Á¶¸³Áß¿¡µµ bComp¸¦ FALSE·Î º¯°æÇØ¾ß Çϴ Ư¼öÇÑ °æ¿ì°¡ ÀÖ´Ù. IME´Â Á¶¸³ÁßÀÎ ¹®ÀÚ¿¡ ´ëÇØ <BS>Å°·Î À½¼Ò¸¦ Áö¿ï ¼ö ÀÖµµ·Ï Çϴµ¥ ¸¸¾à <BS>·Î Áö¿ö ³ª°¡´Ù°¡ ÀÔ·ÂÇÑ ÇÑ À½ÀýÀ» ´Ù Áö¿ö¹ö¸®°Ô µÇ¸é À̶§´Â Á¶¸³ÀÌ Ãë¼ÒµÈ °ÍÀ̹ǷΠbComp¸¦ FALSE·Î º¯°æÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¡®Çѱۡ¯±îÁö ÀÔ·ÂÇÑ ÈÄ ¡®ÇѶ󡯷Πº¯°æÇÏ·Á°í <BS>Å°¸¦ ´©¸¥´Ù°í Çغ¸ÀÚ.

BS¸¦ ¼¼ ¹ø ´­·¯ ¡®±Û¡¯ÀÚ¸¦ ¿ÏÀüÈ÷ »èÁ¦ÇÑ ÈÄ ¡®¶ó¡¯ÀÚ¸¦ ÀÔ·ÂÇÏ·Á°í ÇÒ ¶§ bComp°¡ TRUE·Î µÇ¾î ÀÖÀ¸¸é ¾Õ¿¡ ÀÖ´Â ÀÌ¹Ì ¿Ï¼ºµÈ ¡®ÇÑ¡¯ÀÚ±îÁöµµ Á¶¸³ÁßÀÎ ¹®ÀÚ·Î Ãë±ÞÇÏ¿© »èÁ¦ÇØ ¹ö¸°´Ù. ±×·¡¼­ BS·Î Á¶¸³ÀÌ Ãë¼ÒµÈ °æ¿ì´Â ´ÙÀ½ ÀÔ·ÂÀ» À§ÇØ Á¶¸³ÁßÀÓÀ» ÇØÁ¦Çϴ Ưº°ÇÑ Ã³¸®°¡ ÇÊ¿äÇÏ´Ù. ImmGetCompositionString ÇÔ¼ö·Î Á¶¸³ÁßÀÎ Äڵ带 Á¶»çÇÑ °á°ú ±× ±æÀÌ°¡ 0À̸é Á¶¸³µÇ´ø ¹®ÀÚ°¡ ¿ÏÀüÈ÷ »èÁ¦µÈ °ÍÀ̹ǷΠÀ̶§ bComp¸¦ FALSE·Î ¹Ù²Ù°í ±× ³ª¸ÓÁö °æ¿ì´Â bComp¸¦ TRUE·Î ¹Ù²Ù¸é µÈ´Ù. ÀÌ Äڵ尡 ¿Ö ÇÊ¿äÇÑÁö Á÷Á¢ º¸°í ½ÍÀ¸¸é bComp¸¦ ¹«Á¶°Ç TRUE·Î ¹Ù²Û ÈÄ Å×½ºÆ®Çغ¸¸é µÈ´Ù.

 

//            if (len == 0) {

//                bComp=FALSE;

//            } else {

                   bComp=TRUE;

//            }

 

À½ÀýÀ» ¿ÏÀüÈ÷ Áö¿ìÁö ¾ÊÀº »óÅ¿¡¼­´Â º° »ó°üÀÌ ¾øÁö¸¸ ÇÑ À½ÀýÀ» »èÁ¦ÇÏ°í ´Ù½Ã ÀÔ·ÂÇÏ·Á°í ÇÏ¸é ¾ÕÂÊ ±ÛÀÚ°¡ ±úÁö°Ô µÈ´Ù. bComp °ª±îÁö º¯°æÇÑ ÈÄ¿¡´Â Á¶»çµÈ Á¶¸³ Äڵ带 buf¿¡ ºÙÀÌ°í È­¸éÀ» ¹«È¿È­ÇÏ¿© Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ º¸¿©ÁÖµµ·Ï Çß´Ù. ÀÌ ¸Þ½ÃÁö¿¡¼­ Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ ó¸®Çß´Ù°í Çؼ­ return 0;·Î ¸®ÅÏÇعö¸®¸é ¾ÈµÇ¸ç ¹Ýµå½Ã DefWindowProcÀ¸·Î º¸³»¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé IMEµµ ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¾ß¸¸ Á¶¸³ À©µµ¿ì¸¦ °»½ÅÇÒ ¼ö ÀÖÀ¸¸ç ÇÑ À½ÀýÀÌ ¿Ï¼ºµÉ ¶§ WM_IME_CHAR ¸Þ½ÃÁö°¡ º¸³»Áö±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ ÀÌ ¿¹Á¦ÀÇ WM_IME_COMPOSITION ¸Þ½ÃÁö´Â ó¸® ÈÄ break; ¹®À» »ç¿ëÇÏ°í ÀÖ´Ù.

WM_IME_CHAR ¸Þ½ÃÁö´Â ¹®ÀÚ°¡ ¿Ï¼ºµÉ ¶§ º¸³»Áø´Ù. ÀÌ ¸Þ½ÃÁö·Î´Â ÇÑ±Û Äڵ常 ¿À´Â °ÍÀÌ ¾Æ´Ï¶ó ÇѱÛÁ¶¸³ ÈÄ¿¡ °ð¹Ù·Î ÀԷµǴ °ø¹é, ¼ýÀÚ, ±âÈ£ µîÀÇ 1¹ÙÀÌÆ® Äڵ忡 ´ëÇؼ­µµ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ ¹®ÀåÀ» ÀÔ·ÂÇß´Ù°í Çغ¸ÀÚ.

¡®´Â¡¯ ´ÙÀ½ÀÇ °ø¹é, ¡®ÄÅ¡¯ ´ÙÀ½ÀÇ 2, ¡®ÀÇ¡¯ ´ÙÀ½ÀÇ °ø¹é¿¡ ´ëÇؼ­µµ WM_IME_CHAR ¸Þ½ÃÁö°¡ ¹ß»ýÇÑ´Ù. 1¹ÙÀÌÆ® ¹®ÀÚµµ Àü´ÞµÉ ¼ö Àֱ⠶§¹®¿¡ wParamÀ¸·Î Àü´ÞµÈ Äڵ尡 DBCSÀÎÁö SBCSÀÎÁö Á¶»çÇÑ ÈÄ szChar¿¡ ¹®ÀÚ¿­À» ¸ÕÀú ¸¸µé°í ÀÌ ¹®ÀÚ¿­À» buf¿¡ ´©Àû½ÃÄÑ¾ß ÇÑ´Ù. À̶§µµ ¹°·Ð ÇѱÛÀ» Á¶¸³ÁßÀ̾úÀ¸¸é Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ ¸ÕÀú Á¦°ÅÇØ¾ß ÇÑ´Ù.

WM_IME_CHAR ¸Þ½ÃÁöÀÇ Á¦ÀÏ ³¡¿¡ ÀÖ´Â return 0;´Â Àý´ë·Î »ý·«ÇÒ ¼ö ¾ø´Ù. ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ ÈÄ ¸®ÅÏÇÏÁö ¾Ê°í DefWindowProcÀ¸·Î º¸³» ¹ö¸®¸é µðÆúÆ® 󸮿¡ ÀÇÇØ ¿Ï¼ºµÈ ÇÑ±Û ¹®ÀÚ¸¦ WM_CHAR·Îµµ º¸³»°Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¸é ¿Ï¼ºµÈ ¹®ÀÚ¸¦ µÎ °÷¿¡¼­ ó¸®ÇÏ°Ô µÇ¹Ç·Î ±×¾ß ¸»·Î ¾û¸ÁÁøâÀÌ µÉ °ÍÀÌ´Ù. return 0;¸¦ break;·Î ¹Ù²ã ³õ°í Å×½ºÆ®Çغ¸¸é ¾ó¸¶³ª ¾û¸ÁÀÌ µÇ´ÂÁö Á÷Á¢ È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù. ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ ÈÄ return 0;¸¦ ÇÏ´Â °ÍÀº ¡®¿Ï¼º ¹®ÀÚ´Â ³»°¡ Àß Ã³¸®ÇßÀ¸´Ï ´õ ÀÌ»ó ½Å°æ¾²Áö ¸»¶ó¡¯´Â ¸íÈ®ÇÑ ÀÇ»ç Ç¥ÇöÀÌ´Ù. ±×·³ ÀÌÁ¦ ¿¹Á¦¸¦ ½ÇÇàÇغ¸°í Çѱ۰ú ¿µ¹®, ¼ýÀÚ µîÀ» ÀÔ·ÂÇغ¸ÀÚ.

Á¶¸³ÁßÀÎ ¹®ÀÚ¸¦ <BS>Å°·Î ¼öÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç Èĺ¸ À©µµ¿ì¸¦ ÅëÇØ ÇÑÀÚ¸¦ ÀÔ·ÂÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ¾ÕÂÊÀ¸·Î À̵¿Çϰųª ÀÌ¹Ì ¿Ï¼ºÇÑ ¹®ÀÚ¸¦ »èÁ¦ÇÏ´Â °ÍÀº ¾ÆÁ÷ ¾ÈµÈ´Ù. ÀÌ·± 󸮴 Á» ´õ ¸¹Àº Äڵ带 ÀÛ¼ºÇØ¾ß °¡´ÉÇÏ´Ù.

Ime1 ¿¹Á¦´Â ªÀº ±æÀÌ¿¡ ºñÇØ ±²ÀåÈ÷ ¸¹Àº Àǹ̸¦ °¡Áö°í ÀÖ´Ù. ÅؽºÆ® ÆíÁý±â¸¦ ¸¸µå´Â ù°ÉÀ½¿¡ ÇØ´çÇÏ´Â Áß¿äÇÑ ¿¹Á¦À̸ç Ä¿½ºÅÒÄÁÆ®·ÑÀ̳ª ¿öµåÇÁ·Î¼¼¼­¸¦ ¸¸µé´õ¶óµµ ÀÌ ¿¹Á¦¿¡ ´ëÇÑ Á¤È®ÇÑ ÀÌÇØ°¡ ÇÊ¿äÇÏ´Ù. IME ¸Þ½ÃÁö°¡ ¾ðÁ¦ ¾î¶² Á¤º¸¸¦ °¡Áö°í ¹ß»ýÇÏ´ÂÁö ImeMsg ¿¹Á¦·Î »ìÆì º¸°í °¢ ¸Þ½ÃÁöµéÀÌ Ime1 ¿¹Á¦¿¡¼­ ¾î¶»°Ô 󸮵DZ淡 ¹®ÀÚ¿­ÀÌ Á¦´ë·Î Á¶¸³µÇ´ÂÁö º¸±â ¹Ù¶õ´Ù.