ÀÔ·Â ÄÁÅؽºÆ®(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ÀÇ º¯È¯ ¸ðµå³ª ±âŸ »óÅ´ ¸ðµÎ µ¶¸³ÀûÀ¸·Î À¯ÁöµÈ´Ù.