°¡. ÀÔ·Â ÄÁÅؽºÆ®

ÀÔ·Â ÄÁÅؽºÆ®(Input Context)¶õ IME°¡ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â ±¸Á¶Ã¼À̸ç ÀÌ ±¸Á¶Ã¼¿¡´Â Á¶¸³ ¹®ÀÚ¿­, º¯È¯ ¸ðµå, IME À©µµ¿ìÀÇ À§Ä¡ µî IMEÀÇ ÇöÀç »óÅ¿¡ ´ëÇÑ Á¤º¸µéÀÌ ÀúÀåµÈ´Ù. È­¸é¿¡ ¹«¾ùÀΰ¡¸¦ ±×¸®·Á¸é DCÀÇ ÇÚµéÀÌ ÇÊ¿äÇÑ °Íó·³ IMEÀÇ »óŸ¦ Á¶»çÇϰųª º¯°æÇÏ°í ½Í´Ù¸é ¸ÕÀú ÀÔ·Â ÄÁÅؽºÆ®ÀÇ ÇÚµéÀ» ±¸ÇØ¾ß ÇÑ´Ù. ÀÌ ÇÚµéÀº ´ÙÀ½ ÇÔ¼ö·Î ±¸ÇÏ°í ÇØÁ¦ÇÑ´Ù.

 

HIMC ImmGetContext(HWND hWnd);

BOOL ImmReleaseContext(HWND hWnd,HIMC hIMC);

 

¹®ÀÚÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌ´Â À©µµ¿ìµéÀº ¸ðµÎ ÀÔ·Â ÄÁÅؽºÆ®¸¦ °¡Áö´Âµ¥ À©µµ¿ì ÇÚµéÀ» ÁÖ¸é ÀÔ·Â ÄÁÅؽºÆ®ÀÇ ÇÚµéÀÎ hImc °ªÀ» ±¸ÇÑ´Ù. ½Ã½ºÅÛÀº º°µµÀÇ ÁöÁ¤ÀÌ ¾ø¾îµµ ½º·¹µå¸¶´Ù µðÆúÆ® ÀÔ·Â ÄÁÅؽºÆ®¸¦ ÀÚµ¿À¸·Î »ý¼ºÇϸç ÀÌ ÄÁÅؽºÆ®´Â ½º·¹µå ³»ÀÇ ¸ðµç À©µµ¿ì¿¡ ÀÇÇØ °øÀ¯µÈ´Ù. ImmGetContext ÇÔ¼ö·Î ±¸ÇÑ ÀÔ·Â ÄÁÅؽºÆ® ÇÚµé·ÎºÎÅÍ IMEÀÇ Á¤º¸¸¦ ±¸Çϰųª º¯°æÇÒ ¼ö ÀÖÀ¸¸ç, ÀÔ·Â ÄÁÅؽºÆ®µµ ¸Þ¸ð¸®¸¦ Â÷ÁöÇϹǷΠ´Ù »ç¿ëÇÏ°í ³­ ÈÄ¿¡´Â ¹Ýµå½Ã ImmReleaseContext ÇÔ¼ö·Î ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

ÀÔ·Â ÄÁÅؽºÆ®·ÎºÎÅÍ »óŸ¦ ±¸ÇÏ°í º¯°æÇÏ´Â °Í Áß¿¡ °¡Àå ½Ç¿ëÀûÀÎ ¿¹´Â ÀԷ¸ðµå¸¦ ¼ÒÇÁÆ®¿þ¾îÀûÀ¸·Î º¯È¯ÇÏ´Â °ÍÀÌ´Ù. µðÆúÆ® ÀÔ·Â ÄÁÅؽºÆ®´Â ¿µ¹® ÀԷ¸ðµå·Î ½ÃÀ۵DZ⠶§¹®¿¡ ÇÁ·Î±×·¥À» ½ÇÇàÇϸé Ç×»ó ¿µ¹® ÀԷ¸ðµå¿¡¼­ ½ÃÀÛÇÑ´Ù. ±×·¡¼­ ÇѱÛÀ» ÀÔ·Â¹Þ¾Æ¾ß ÇÒ °æ¿ì Ç×»ó ÇѱÛÅ°³ª <Shift+Space>Å°·Î ¸ðµå¸¦ º¯°æÇÑ ÈÄ ÀÔ·ÂÇØ¾ß ÇÏ´Â ºÒÆíÇÔÀÌ Àִµ¥ ÀÔ·Â ÄÁÅؽºÆ®¸¦ Á¶ÀÛÇÏ¸é ¸ðµå¸¦ °­Á¦·Î º¯°æÇÒ ¼öµµ ÀÖ´Ù. À̶§´Â ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

BOOL ImmGetConversionStatus(HIMC hIMC,LPDWORD lpfdwConversion,LPDWORD lpfdwSentence);

BOOL ImmSetConversionStatus(HIMC hIMC,DWORD fdwConversion,DWORD fdwSentence);

 

ÀÔ·Â ÄÁÅؽºÆ®ÀÇ ÇÚµéÀ» ÁÖ°í º¯È¯ ¸ðµå¿Í ¹®Àå ¸ðµå¸¦ ÁöÁ¤Çϰųª Á¶»çÇϴµ¥ ¹®Àå ¸ðµå´Â Çѱۿ¡¼­´Â º° Àǹ̰¡ ¾ø°í º¯È¯ ¸ðµå Áß IME_CMODE_NATIVE Ç÷¡±×¸¸ ¾Ë¾Æ µÎ¸é µÈ´Ù. ÀÌ Ç÷¡±×°¡ ÀÖÀ¸¸é ÇÑ±Û ÀԷ¸ðµå°í ±×·¸Áö ¾ÊÀ¸¸é ¿µ¹® ÀԷ¸ðµå´Ù. ´ÙÀ½ ImeStatus¿¹Á¦´Â ¼ÒÇÁÆ®¿þ¾îÀûÀ¸·Î ÇÑ±Û ÀԷ¸ðµå¸¦ º¯È¯Çϴµ¥ Á÷Á¢ ¸¸µé¾î º¼ ÇÊ¿ä´Â ¾ø°í CD-ROM¿¡ ÀÖ´Â ¿¹Á¦¸¦ Âü°í¸¸ Çϵµ·Ï ÇÏÀÚ.

 

#include <windows.h>

#include <imm.h>

#include "resource.h"

 

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

HINSTANCE g_hInst;

HWND hDlgMain;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

     ,LPSTR lpszCmdParam,int nCmdShow)

{

     g_hInst=hInstance;

    

     DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, MainDlgProc);

    

     return 0;

}

 

BOOL MyGetImeMode(HWND hEdit)

{

     HIMC hImc;

     DWORD Con, Sen;

 

     hImc=ImmGetContext(hEdit);

     ImmGetConversionStatus(hImc,&Con,&Sen);

     ImmReleaseContext(hEdit,hImc );

     if (Con & IME_CMODE_NATIVE) {

          return TRUE;

     } else {

          return FALSE;

     }

}

 

void MySetImeMode(HWND hEdit, BOOL bHan)

{

     HIMC hImc;

     hImc=ImmGetContext(hEdit);

 

     if (bHan == TRUE) {

          ImmSetConversionStatus(hImc,IME_CMODE_NATIVE,IME_SMODE_NONE);

     } else {

          ImmSetConversionStatus(hImc,0,IME_SMODE_NONE);

     }

 

     ImmReleaseContext(hEdit,hImc );

}

 

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static HWND hEdit1, hEdit2;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          hDlgMain = hDlg;

          hEdit1=GetDlgItem(hDlg,IDC_EDIT1);

          hEdit2=GetDlgItem(hDlg,IDC_EDIT2);

          MySetImeMode(hEdit1,TRUE);

 

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDCANCEL:

              EndDialog(hDlg,0);

              return TRUE;

          case IDC_BTNHANGUL:

              MySetImeMode(hEdit1,TRUE);

              SetFocus(hEdit1);

              return TRUE;

          case IDC_BTNENGLISH:

              MySetImeMode(hEdit1,FALSE);

              SetFocus(hEdit1);

              return TRUE;

          case IDC_BTNGETMODE:

              if (MyGetImeMode(hEdit1) == TRUE) {

                   MessageBox(hDlg,"ÇÑ±Û ÀԷ¸ðµåÀÔ´Ï´Ù","¾Ë¸²",MB_OK);

              } else {

                   MessageBox(hDlg,"¿µ¹® ÀԷ¸ðµåÀÔ´Ï´Ù","¾Ë¸²",MB_OK);

              }

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

IME °ü·Ã ÇÔ¼ö¿Í »ó¼ö´Â imm.h¿¡ ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ Çì´õ¸¦ ¹Ýµå½Ã ÀÎŬ·çµåÇØ¾ß ÇÏ¸ç °ü·Ã ÇÔ¼öÀÇ Á¤º¸´Â imm32.lib¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ÀÓÆ÷Æ® ¶óÀ̺귯¸®µµ ¹Ýµå½Ã ¸µÅ©½ÃÄÑ¾ß ÇÑ´Ù. ÇÁ·ÎÁ§Æ®ÀÇ ¼Ó¼º ´ëÈ­»óÀÚ¿¡¼­ ¸µÄ¿/ÀÔ·Â/Ãß°¡ Á¾¼Ó¼º¿¡ imm32.lib¸¦ ¿¬°áÇß´Ù. ÀÌÈÄÀÇ ¿¹Á¦µéÀº ¹°·ÐÀÌ°í IME¸¦ »ç¿ëÇÏ´Â ¸ðµç ÇÁ·ÎÁ§Æ®´Â ÀÌ Çì´õ¿Í ¿¬°á ÆÄÀϵéÀÌ ÇÊ¿äÇϹǷΠ¹Ýµå½Ã ±â¾ïÇسõµµ·Ï ÇÏÀÚ.

MyGetImeMode ÇÔ¼ö´Â hEdit À©µµ¿ìÀÇ ÀԷ¸ðµå°¡ ÇÑ±Û ¸ðµåÀÎÁö ¿µ¹® ¸ðµåÀÎÁö Á¶»çÇÑ´Ù. MySetImeMode ÇÔ¼ö´Â ÀԷ¸ðµå¸¦ º¯°æÇϴµ¥, bHan Àμö°¡ TRUEÀ̸é hEditÀÇ ÀԷ¸ðµå¸¦ Çѱ۷Π¹Ù²Ù¾î ÁØ´Ù. °£´ÜÇÑ ¿¹Á¦¶ó ´ëÈ­»óÀÚ ±â¹ÝÀ¸·Î ÀÛ¼ºÇß´Ù. Á÷Á¢ ½ÇÇàÇغ¸ÀÚ.

ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ MySetImeMode¸¦ È£ÃâÇÏ¿© ÇÑ±Û ¸ðµå·Î º¯È¯ÇصξúÀ¸¹Ç·Î ÇÁ·Î±×·¥À» ½ÃÀÛÇÏÀÚ ¸¶ÀÚ °ð¹Ù·Î ÇѱÛÀÌ ÀԷµȴÙ. ÇѱÛÅ°·Î ÀԷ¸ðµå¸¦ º¯È¯ÇÒ ¼öµµ ÀÖ°í ¾Æ·¡ÂÊ¿¡ ÀÖ´Â ¹öÆ°À» Ŭ¸¯ÇÏ¿© ¼ÒÇÁÆ®¿þ¾îÀûÀ¸·Î ÀԷ¸ðµå¸¦ º¯È¯ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ÇѱÛÀ» ÀԷ¹޴ ¿¡µðÆ®¶ó¸é ¹Ì¸® ÇÑ±Û ÀԷ¸ðµå·Î ¹Ù²ã ÁÖ°í ¿µ¹®À» ÀÔ·Â¹Þ¾Æ¾ß ÇÏ´Â ¿¡µðÆ®¶ó¸é ¿µ¹® ÀԷ¸ðµå·Î ¹Ù²ã ÁÖ´Â °ÍÀº »ç¿ëÀÚ¸¦ À§ÇÑ »ó´çÇÑ ¹è·Á°¡ µÈ´Ù.

±×·±µ¥ ÀÌ ¿¹Á¦´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. µÎ °³ÀÇ ¿¡µðÆ® ÄÁÆ®·ÑÀÌ Àִµ¥ ÇÑÂÊ¿¡¼­ ÀԷ¸ðµå¸¦ º¯°æÇÏ¸é ´Ù¸¥ ¿¡µðÆ®ÀÇ ÀԷ¸ðµåµµ °°ÀÌ º¯°æµÈ´Ù´Â Á¡ÀÌ´Ù. À§ÂÊ ¿¡µðÆ®¿¡¼­ ÇÑ±Û ¸ðµå·Î º¯°æÇÑ ÈÄ ¾Æ·¡ÂÊ ¿¡µðÆ®¿¡ ÀÔ·ÂÇغ¸¸é ¿ª½Ã ÇѱÛÀÌ ÀÔ·ÂµÇ¸ç ¹Ý´ëµµ ¸¶Âù°¡Áö´Ù. ÇÑÂÊÀº Çѱ۷Π´Ù¸¥ ÂÊÀº ¿µ¹®À¸·Î ÀԷ¹޵µ·Ï ÇÏ°í ½ÍÁö¸¸ ±×·¸°Ô´Â ¾ÈµÈ´Ù. ¿Ö³ÄÇÏ¸é ½Ã½ºÅÛÀÌ ¸¸µå´Â µðÆúÆ® ÀÔ·Â ÄÁÅؽºÆ®´Â ½º·¹µå ³»ÀÇ ¸ðµç À©µµ¿ì°¡ °øÀ¯Çϱ⠶§¹®ÀÌ´Ù.

±×·¡¼­ ÇÑ À©µµ¿ì°¡ ÀÔ·Â ÄÁÅؽºÆ®¸¦ ±¸ÇÑ ÈÄ »óŸ¦ º¯°æÇÏ¸é ´Ù¸¥ À©µµ¿ìµéµµ ÀÌ º¯°æ¿¡ ¿µÇâÀ» ¹Þ°Ô µÈ´Ù. ¸¸¾à À©µµ¿ì º°·Î ÀÔ·Â ÄÁÅؽºÆ®¸¦ ¸¸µé¾î »óŸ¦ µû·Î À¯ÁöÇÏ°í ½Í´Ù¸é ±×·¸°Ô ÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¼¼ ÇÔ¼ö´Â ÀÔ·Â ÄÁÅؽºÆ®¸¦ »ý¼º, ÇØÁ¦ÇÏ°í À©µµ¿ì¿Í ¿¬°á½ÃŲ´Ù.

 

HIMC ImmCreateContext(void);

HIMC ImmAssociateContext(HWND hWnd,HIMC hIMC);

BOOL ImmDestroyContext(HIMC hIMC);

 

ImmCreateContext ÇÔ¼ö´Â ÀÔ·Â ÄÁÅؽºÆ®¸¦ À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ±× ÇÚµéÀ» ¸®ÅÏÇÑ´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø ÀÔ·Â ÄÁÅؽºÆ®´Â ImmAssociateContext ÇÔ¼ö·Î ƯÁ¤ À©µµ¿ì¿Í ¿¬°áÇÒ ¼ö Àִµ¥ ÀÌ·¸°Ô µÇ¸é ÇØ´ç À©µµ¿ì´Â Àڱ⸸ÀÇ ÀÔ·Â ÄÁÅؽºÆ®¸¦ °¡Áö°í °íÀ¯ÀÇ »óŸ¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù. ImmAssociateContext ÇÔ¼ö´Â ÀÌÀü¿¡ ¿¬°áµÇ¾î ÀÖ´ø ÀÔ·Â ÄÁÅؽºÆ® ÇÚµéÀ» ¸®ÅÏÇϴµ¥ ÀÌ ÇÚµéÀº º¹±¸¸¦ À§ÇØ Àß º¸°üÇØ¾ß ÇÑ´Ù.

Á÷Á¢ ¸¸µç ÀÔ·Â ÄÁÅؽºÆ®´Â ¹Ýµå½Ã ÇØÁ¦ÇØ¾ß Çϴµ¥ ÇØÁ¦Çϱâ Àü¿¡ À©µµ¿ì¿ÍÀÇ ¿¬°á °ü°è¸¦ ¸ÕÀú ²÷¾î¾ß Çϸç, ±×·¯±â À§Çؼ­´Â ÀÌÀüÀÇ ÀÔ·Â ÄÁÅؽºÆ® ÇÚµéÀ» ´Ù½Ã ¿¬°áÇØ¾ß ÇÑ´Ù. ¸¶Ä¡ ºê·¯½Ã³ª ÆæÀ» »ç¿ëÇÒ ¶§ OldPen, OldBrush º¯¼ö°¡ º¹±¸¸¦ À§ÇØ ÇÊ¿äÇÑ °Íó·³ ÀÌÀü ÄÁÅؽºÆ® Çڵ鵵 °°Àº ÀÌÀ¯·Î ÇÊ¿äÇÏ´Ù. ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤Çغ¸ÀÚ.

 

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static HWND hEdit1, hEdit2;

    static HIMC hImc, OldImc;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          hDlgMain = hDlg;

          hEdit1=GetDlgItem(hDlg,IDC_EDIT1);

          hEdit2=GetDlgItem(hDlg,IDC_EDIT2);

          MySetImeMode(hEdit1,TRUE);

 

        hImc=ImmCreateContext();

        OldImc=ImmAssociateContext(hEdit2,hImc);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDCANCEL:

               EndDialog(hDlg,0);

            ImmAssociateContext(hEdit2,OldImc);

            ImmDestroyContext(hImc);

               return TRUE;

 

¼Ò½º¿¡¼­ ±½°Ô Ç¥½ÃµÈ ºÎºÐ¸¸ »õ·Î ÀÔ·ÂÇÑ´Ù. ÀÌ·± ¼Ò½º Ç¥±â¹ýÀº ÀÌ Ã¥ Àü¹Ý¿¡ °ÉÃÄ Àû¿ëµÇ´Âµ¥ »õ·Î ÀԷµǾú°Å³ª º¯°æµÈ ÄÚµå, ¶Ç´Â ³»¿ë»ó °­Á¶ÇÒ¸¸ÇÑ ¼Ò½º ºÎºÐÀ» ±½°Ô ÀμâÇÏ¿´´Ù. »õ·Î¿î ÀÔ·Â ÄÁÅؽºÆ®¸¦ »ý¼ºÇÏ°í hEdit2¿¡ ¿¬°áÇßÀ¸¹Ç·Î hEdit2´Â ÁÖ ½º·¹µåÀÇ ÀÔ·Â ÄÁÅؽºÆ®¿Í´Â ´Ù¸¥ IME »óŸ¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ hEdit2ÀÇ º¯È¯ ¸ðµå³ª ±âŸ »óÅ´ ¸ðµÎ µ¶¸³ÀûÀ¸·Î À¯ÁöµÈ´Ù.