ÇÑ±Û IME (Input Method Editing)¸¦ ±¸Çö
ÀÌ ³»¿ëÀº "ÇÑÄÄ ÇÁ·¹½º"¿¡¼ ³ª¿Â "µû¶óÇغ¸¼¼¿ä Visual C++ 6" ¿¡¼ °¡Á®¿Â ³»¿ëÀÔ´Ï´Ù.
IME¸¦ ±¸ÇöÇÑ´Ù°í Çؼ Á÷Á¢ IME¸¦ ¸¸µé¾îº¸ÀÚ´Â °ÍÀº ¾Æ´Ï°í, À§ÀÇ ±×¸²Ã³·³ »óŹٿ¡ ÇѱÛ/¿µ¹® »óŸ¦ ±¸º°ÇÒ ¼ö ÀÖµµ·Ï Ãâ·ÂÇÏÀÚ´Â °ÍÀÌ´Ù.
¹Ì±¹ MS¿¡¼ ¸¸µç Visual C++ 6.0Àº ±âº»ÀûÀ¸·Î ÇÑ±Û IME ±â´ÉÀ» Á¦°øÇÏÁö ¾Ê±â ¶§¹®¿¡ °³¹ßÀÚ ½º½º·Î ÇÑ±Û IME¿¡¼ ¹ß»ýµÇ´Â ¸Þ½ÃÁö¸¦ ºä¿¡¼ Àâ¾Æ ó¸®ÇØ¾ß ÇÑ´Ù. ÇÑ±Û ºñÁÖ¾ó º£ÀÌÁ÷ 5.0°ú 6.0¿¡¼´Â ±âº»À¸·Î ÇÑ±Û IME ±â´ÉÀÌ ±âº»À¸·Î Á¦°øµÇ°í ÀÖ´Ù.
¿©±â¼´Â ÇÑ/¿µ Å°¸¦ ´©¸£¸é Çѱ۰ú ¿µ¹®ÀÌ ¹Ù²î¸ç Ãâ·ÂµÇ°í, ±× ÆäÀÎ À§¿¡¼ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´·¯µµ ÇÑ¿µÀÌ ¹Ù²îµµ·Ï ±¸ÇöÇÑ´Ù.
1. StdAfx.h ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Imm.h ÆÄÀÏÀ» ÀÎŬ·çµå ÇÑ´Ù.
#include <afxwin.h> //
MFC core and standard components
#include <afxext.h> //
MFC extensions
#include <afxdisp.h> //
MFC Automation classes
#include <afxdtctl.h> //
MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include
<afxcmn.h> //
MFC support for Windows Common Controls
#include <Imm.h>
#endif
// _AFX_NO_AFXCMN_SUPPORT
2. ºäÀÇ Çì´õÆÄÀÏÀ» ¿¬´Ù. Ŭ·¡½º À§Àúµå¿¡¼ Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ´ÙÀ½Ã³·³ Á÷Á¢ Äڵ带 ±â¼úÇÑ´Ù.
// Generated message map functions
protected:
//{{AFX_MSG(CImmTestView)
//}}AFX_MSG
afx_msg
LRESULT OnIMENotify(WPARAM wParam, LPARAM LParam); // Ãß°¡
DECLARE_MESSAGE_MAP()
};
3. ºäÀÇ cpp ÆÄÀÏ¿¡µµ ´ÙÀ½Ã³·³ ÇÑ ÁÙÀ» Ãß°¡ÇÑ´Ù.
IMPLEMENT_DYNCREATE(CImmTestView, CView)
BEGIN_MESSAGE_MAP(CImmTestView,
CView)
//{{AFX_MSG_MAP(CImmTestView)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_IME_NOTIFY,
OnIMENotify) // Ãß°¡
//
Standard printing commands
ON_COMMAND(ID_FILE_PRINT,
CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,
CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,
CView::OnFilePrintPreview)
END_MESSAGE_MAP()
4. À§¿¡¼Ã³·³ Ãß°¡ÇÑ ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯 Äڵ带 ºäÀÇ cpp ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù.
LRESULT CImmTestView::OnIMENotify(WPARAM wParam, LPARAM lParam)
{
if(wParam
== IMN_SETCONVERSIONMODE) {
HIMC
hIMC = ::ImmGetContext(m_hWnd);
DWORD
dwConversion;
DWORD
dwSetence;
::ImmGetConversionStatus(hIMC,
&dwConversion, &dwSetence);
CString
strMode;
if(dwConversion
& IME_CMODE_NATIVE)
strMode
= "ÇѱÛ";
else
strMode
= "¿µ¹®";
BOOL
bRet = ::ImmReleaseContext(m_hWnd, hIMC);
((CMainFrame
*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(2, strMode);
}
return
Default();
}
5. 4¹ø¿¡¼ ¸ÞÀÎ ÇÁ·¹ÀÓ Å¬·¡½º¿¡ Á¢±ÙÇϱâ À§Çؼ ºäÀÇ cpp ÆÄÀÏ¿¡ ´ÙÀ½Ã³·³ ¸ÞÀÎ ÇÁ·¹ÀÓÀÇ Çì´õÆÄÀÏÀ» ÀÎŬ·çµå ÇÑ´Ù.
#include "MainFrm.h"
±×¸®°í m_wndStatusBar¿¡ Á¢±ÙÇϱâ À§ÇØ MainFrm.h ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Â CStatusBarÀÇ º¯¼ö m_wndStatusBar¸¦ private¿¡¼ publicÀ¸·Î º¯°æÇÑ´Ù.
6. 5¹ø±îÁö ÀÛ¼ºÇÑ »óÅ·ΠÄÄÆÄÀÏÀ» Çϸé Ãʱ⿡ ÇÑ/¿µ ÀÌ Ãâ·ÂµÇÁö ¾Ê´Ù°¡ ÇÑ/¿µ Å°¸¦ ´©¸¥ ´ÙÀ½ºÎÅÍ Á¦´ë·Î µ¿ÀÛÇÏ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
ÀÌ°ÍÀ» ÇØ°áÇϱâ À§ÇØ ºäÀÇ OnInitialUpdate() ÇÔ¼ö¿¡ OnIMENotify() ÇÔ¼öÀÇ ³»¿ëÀ» Çѹø ´õ Àû´Â´Ù.
void CImmTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();
//
TODO: Add your specialized code here and/or call the base class
//
óÀ½ ½ÃÀÛÇÒ ¶§ ÇÑ¿µ »óÅÂÇ¥½Ã¸¦ À§ÇØ OnIMENotify ÇÔ¼ö¿Í
//
°°Àº Äڵ带 Çѹø ´õ ½áÁØ´Ù.
HIMC
hIMC = ::ImmGetContext(m_hWnd);
DWORD
dwConversion;
DWORD dwSetence;
::ImmGetConversionStatus(hIMC,
&dwConversion, &dwSetence);
CString
strMode;
if(dwConversion
& IME_CMODE_NATIVE)
strMode
= "ÇѱÛ";
else
strMode
= "¿µ¹®";
BOOL
bRet = ::ImmReleaseContext(m_hWnd, hIMC);
((CMainFrame
*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(2, strMode);
}
7. »óŹÙÀÇ ÇÑ/¿µ ÆäÀÎÀ» ¸¶¿ì½ºÀÇ ¿ÞÂʹöÆ°À» ´©¸¦ ¶§¸¶´Ù ¹Ù²îµµ·Ï ¸¸µé±â À§ÇØ ¸î °¡Áö ÀÛ¾÷À» ÇØ¾ß ÇÏ°Ú´Ù. ¿ì¼± CStatusBar¿¡¼ ÆÄ»ýµÈ CMyStatusBar Ŭ·¡½º¸¦ »õ·Î ¸¸µç´Ù. Ŭ·¡½º À§Àúµå¿¡¼ CStatusBar¸¦ º£À̽º Ŭ·¡½º·Î Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ CStatusBarCtrl¿¡¼ ÆÄ»ý½ÃŲ ÈÄ CStatusBarCtrlÀ» CStatusBar·Î ¸ðµÎ ¹Ù²Û´Ù. (Çì´õÆÄÀÏ°ú cpp ÆÄÀÏ ¸ðµÎ)
±×·¯´ÙÀ½ WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.
void CMyStatusBar::OnLButtonDown(UINT nFlags, CPoint point)
{
//
TODO: Add your message handler code here and/or call default
HIMC
hIMC = ::ImmGetContext(this->m_hWnd);
CString
strHangulMode("ÇѱÛ"), strAphaMode("¿µ¹®");
CRect
rect;
this->GetItemRect(2,
&rect);
if(rect.PtInRect(point))
{
BOOL
nMode = ::ImmGetOpenStatus(hIMC);
if(nMode
== 0)
::ImmSetConversionStatus(hIMC,
IME_CMODE_HANGEUL,
IME_SMODE_NONE);
if(nMode
== 1)
::ImmSetConversionStatus(hIMC,
IME_CMODE_ALPHANUMERIC,
IME_SMODE_NONE);
this->SetPaneText(2,
(nMode == 1) ? strAphaMode : strHangulMode);
}
BOOL
bRet = ::ImmReleaseContext(this->m_hWnd, hIMC);
CStatusBar::OnLButtonDown(nFlags,
point);
}
8. ÇÑ±Û IMEÀÇ DLLÀÎ imm32.dllÀ» ÀÓÆ÷Æ®Çϱâ À§ÇØ imm32.lib¸¦ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÑ´Ù.
Âü°í»çÇ×
GetItemRect
¼³¸í : ƯÁ¤ »óŹ٠â¿¡ ´ëÇÑ ¹Ù¿îµù »ç°¢ÇüÀ» ¾ò´Â´Ù.
±¸¹® : void GetItemRect( int nIndex, LPRECT lpRect ) const;
ÆĶó¹ÌÅÍ
nIndex : ƯÁ¤ »óŹÙ
â¿¡ ´ëÇÑ ¹Ù¿îµù »ç°¢ÇüÀ» ¾ò´Â´Ù.
lpRect
: ä¿öÁö´Â »ç°¢Çü ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ
¸®ÅÏ°ª : ¾øÀ½.
ÂüÁ¶ : CStatusBar::SetPaneInfo, CStatusBar::GetPaneInfo
(¿¹Á¦)
CRect rect;
pBar->GetItemRect(2, &rect); // 3¹ø° â¿¡
´ëÇÑ ¹Ù¿îµù »ç°¢ÇüÀ» ¾ò´Â´Ù.
PtInRect
¼³¸í : ±â¼úÇÑ À§Ä¡°¡ CRectÀÇ ¹Ù¿îµå ³»¿¡ Àִ°¡¸¦ ÆÇ´ÜÇÑ´Ù. À§Ä¡°¡ ¸ðµÎ 4°³ ºÎºÐ ³»¿¡ Àְųª ¿ÞÂÊÀ̳ª ¸Ç À ºÎºÐ(¸Ç ¾Æ·¡³ª ¿À¸¥ÂÊÀº ¾Æ´Ï´Ù)¿¡ ÀÖÀ¸¸é, À§Ä¡´Â »ç°¢Çü ³»¿¡ ÀÖ°Ô µÈ´Ù.
±¸¹® : BOOL PtInRect( POINT point ) const;
ÆĶó¹ÌÅÍ
point : °Ë»çÇÏ´Â À§Ä¡
¸®ÅÏ°ª : À§Ä¡°¡ CRect ³»¿¡ ÀÖÀ¸¸é TRUE, ±×·¸Áö ¾ÊÀ¸¸é FALSE
ÂüÁ¶ : ::PtInRect
(¿¹Á¦)
void CMyClass::OnLButtonDown(,,CPoint point)
{
CRect
screenRect(20, 20, 100, 100); //
ȸéÀÇ °ü½ÉÀÖ´Â ¿µ¿ª
if(screenRect.PtInRect(point))
{
//
»ç¿ëÀÚ°¡ °ü½ÉÀÖ´Â ¿µ¿ª¿¡ ¸¶¿ì½º ´ÜÃ߸¦ ´©¸¥´Ù.
}
................
}
SetPaneText
¼³¸í : ƯÁ¤ »óŹ٠â¿¡ ´ëÇØ ÅؽºÆ®¸¦ ¼³Á¤ÇÑ´Ù.
±¸¹® : BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );
ÆĶó¹ÌÅÍ :
nIndex :
ƯÁ¤ »óŹ٠âÀ» ³ªÅ¸³»´Â 0¿¡¼ ½ÃÀÛÇÏ´Â À妽º
lpszNewText
: »õ·Î¿î â ÅؽºÆ®
bUpdate :
»óŹٰ¡ Áö±Ý °»½ÅµÇ¾î¾ß Çϸé TRUE, ±×·¸Áö ¾ÊÀ¸¸é FALSE
¸®ÅÏ°ª : ¼º°øÇϸé TRUE, ±×·¸Áö ¾ÊÀ¸¸é FALSE
ÂüÁ¶ : CStatusBar::GetPaneInfo
- the end of this article -