不知道大家用过Nero 刻录软件没有,我正在改里面的一个终极郁闷的问题,用尽了一切手段和方法也搞不定!
问题如下:编辑菜单的时候 ,输入框采用richedit,创建方法如下: bool cr = RichEditCtrl::Create(0, WS_CHILD |  (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
    if (cr) {
      SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
      SetTextMode(TM_PLAINTEXT);
      Subclass();
      return true;
    }
 调入微软全拼,输入没有任何乱码问题,但是全拼输入时,输入法输入框跑到了屏幕最顶端。而且不能够使用输入法的选择词语功能。
 我们这边的一位高手,找了一个参数ES_SELFIME解决了这个问题如下, bool cr = RichEditCtrl::Create(0, WS_CHILD |ES_SELFIME|  (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
    if (cr) {
      SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
      SetTextMode(TM_PLAINTEXT);
      Subclass();
      return true;
    }
结果输入法位置一切正常了,但是输入汉字的时候会出现乱码!!! 然后我就开始了慢慢查找乱码的旅途。 结果发现
// get required length (use user-specified CR translation setting)
  GETTEXTLENGTHEX gtl;
  gtl.codepage = 1200;
  gtl.flags = GTL_NUMBYTES | ((flags & GT_USECRLF) ? GTL_USECRLF : GTL_DEFAULT);
  int size = (int)SendMessage(EM_GETTEXTLENGTHEX, (WPARAM)&gtl, 0);
  if (size <= 0)
    return size;  wchar_t* p = new wchar_t[size];  // get text
  GETTEXTEX gt;
  gt.cb = size * sizeof(wchar_t);
  gt.codepage = 1200;
  gt.flags = flags;
  gt.lpDefaultChar = 0;
  gt.lpUsedDefChar = 0;
  int rc = (int)SendMessage(EM_GETTEXTEX, (WPARAM)&gt, (LPARAM)p);
  buffer = String(p, rc);
  delete[] p;
  获取到的输入就是乱码
  本系统是 纯英文的vista 操作系统,软件在2005中编译,编译参数加了UNICODE
  也采用了 richedit2.0 unicode版本了
  LoadLibrary(L"RICHED32.DLL");
 // LoadLibrary(L"RICHED20.DLL");
 请问大家能不能帮我分析一下,我真是不尽感激。。

解决方案 »

  1.   

    http://msdn2.microsoft.com/en-us/library/bb774250(VS.85).aspx
      

  2.   

    谢谢各位
    这个问题还不是单纯的RICHEDIT20W问题,我这边这个控件是动态create的,而且我已经查过了,创建的肯定是unicode窗口。具体什么原因估计要查他的主窗口代码了。他的代码实在太复杂了,封装了一套自己的类似mfc了,真是郁闷,太复杂了。