我有2 CRichEditCtrls
。一个是自动创建的对话框模板的一部分。当我调用GetSelText时,返回的字节是每个字符一个字节,即我将返回char *str={'a','n','d'}
。第二个控件是使用Create
方法动态创建的,并且返回调用GetSelText的数据以2字节字符返回:char *str={'a',0,'n',0,'d',0}
。一个控件返回内容为单字节,另一个为双字节?
这让事情变得真正痛苦......见this topic。一种方法适用于一种控制,一种方式适用于另一种控制。
我什至不能看如何两个控件(在同一个对话框中)可以有这样的不同行为。我看不到一种方式来告诉动态创建的工作方式。
这是怎么回事?动态创建的控制是奇一出在我们的应用程序,所以这是需要改变的一个...
这里是我使用的代码:
ASSERT(::IsWindow(m_hWnd));
CHARRANGE cr;
cr.cpMin = cr.cpMax = 0;
::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
CString strText;
LPTSTR lpsz=strText.GetBufferSetLength((cr.cpMax - cr.cpMin + 1) * 2);
lpsz[0] = NULL;
long nLen = ::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
lpsz[nLen] = NULL;
for(long i=0;i<nLen;++i)
{
TRACE("lpsz[%d] (%d bytes) = %d {",i,sizeof(lpsz[i]),lpsz[i]);
char *pc = (char *)&lpsz[i];
for(int j=0;j<sizeof(lpsz[i]);++j)
{
TRACE(" %d(%c)",pc[j],pc[j] ? pc[j] : '#');
}
TRACE("}\n");
}
strText.ReleaseBuffer();
return CString(strText);
从我的对话框输出-template控制:
lpsz[0] (2 bytes) = 28257 { 97(a) 110(n)}
lpsz[1] (2 bytes) = 100 { 100(d) 0(#)}
lpsz[2] (2 bytes) = 52685 { -51(Í) -51(Í)}
而且从我的动态创建的控制:
lpsz[0] (2 bytes) = 97 { 97(a) 0(#)}
lpsz[1] (2 bytes) = 110 { 110(n) 0(#)}
lpsz[2] (2 bytes) = 100 { 100(d) 0(#)}
1)就像我说的,整个应用程序使用对话框,这是控件动态创建的唯一位置。那么我怎样才能让第二个版本匹配对话框版本? –
2)另外,我的应用程序设置为unicode。我怀疑_why_默认情况下,MSVC正在创建RichEdit20A的richtext控件,这是错误的吗?我确认它正在.rc文件中执行此操作。但我无法真正更新我的许多应用程序中的所有对话以匹配手动创建的控件。 –
您可以使用类“RichEdit20A”的CreateWindow API来动态创建它,而不是使用CRichEditCtrl – SysAdmin