NT류 윈도우에서는 unicode로 하지 않으면 이상하게 edit control에 한글이

입력시마다 깨져서 나오져.. 근데 우낀건 paste로 한글을 쓰면 써지더군요..

그걸 window98에 가서 해보면 잘되져.. 근데 모두 98만 쓰는것두 아니고

그렇다고 unicode로 하자니 98에서 안되고...

어디가도 해결법을 찾을수 없어서 고민고민하다가 이상한 방식으로 해결했습니다.

뭐 근본적인 문제는 뭔지 알수 없지만...

방법은 edit control을 서브클래싱해서 WM_IME_CHAR메세지를 처리해 줍니다.

LRESULT OnImeChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
  static char kk[3];
        
  kk[0] = (char) (wParam >> 8);
  if(kk[0]==0x00)
  {
     bHandled=FALSE;
     return 0;
  }
  kk[1] = (char) wParam & 0xff;
  SendDlgItemMessage(IDC_MYEDIT, EM_SETSEL, 0, -1);
  SendDlgItemMessage(IDC_MYEDIT, EM_SETSEL, -1, 0);
  SendDlgItemMessage(IDC_MYEDIT, EM_REPLACESEL, FALSE, (LPARAM) kk);

  return 0;
}

그럼 됩니다. ㅋㅋ

참고로 ATL에서 서브클래싱하는것도 히한하죠..

생성자에서..

CContainedWindow m_EditCtrl;

CMyClass() : m_EditCtrl(_T("EDIT"), this, 1)
{
  m_bWindowOnly = TRUE;
  m_Total=0;
  CalcExtent(m_sizeExtent);
  m_sClient=0;
}

메세지맵에서..

BEGIN_MSG_MAP(CMyClass)
  CHAIN_MSG_MAP(CComCompositeControl<CMyClass>)
  MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  ...
ALT_MSG_MAP(1)
  MESSAGE_HANDLER(WM_IME_CHAR, OnImeChar)
BEGIN_MSG_MAP(CMyClass)

...

LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
   m_EditCtrl.SubclassWindow(GetDlgItem(IDC_MYEDIT));
....


제가 별로 아는게 없어서 되는대로 했는데

더 괞찮게 하는 방법이 있으면 답변달아주세여........

tab    tab되나????
728x90

+ Recent posts