Mfc 一个控件以单字节形式返回内容,另一个控件以双字节形式返回内容?

Mfc 一个控件以单字节形式返回内容,另一个控件以双字节形式返回内容?,mfc,character-encoding,Mfc,Character Encoding,我有两个CRICHEDITCTRL。一个是自动创建的对话框模板的一部分。当我对它调用GetSelText时,返回的字节是每个字符一个字节,也就是说,我将返回char*str={'a','n','d'}。第二个控件是使用Create方法动态创建的,调用GetSelText返回的数据以2字节字符返回:char*str={'a',0,'n',0,'d',0} 这让事情变得很痛苦。。。看见一种方法与一个控件协同工作,一种方法与另一个控件协同工作 我甚至看不出同一个对话框上的两个控件怎么会有这样不同的行为

我有两个CRICHEDITCTRL。一个是自动创建的对话框模板的一部分。当我对它调用GetSelText时,返回的字节是每个字符一个字节,也就是说,我将返回char*str={'a','n','d'}。第二个控件是使用Create方法动态创建的,调用GetSelText返回的数据以2字节字符返回:char*str={'a',0,'n',0,'d',0}

这让事情变得很痛苦。。。看见一种方法与一个控件协同工作,一种方法与另一个控件协同工作

我甚至看不出同一个对话框上的两个控件怎么会有这样不同的行为。我看不到一种方法来告诉动态创建的一个如何工作

怎么会这样?动态创建的控件是应用程序中的奇数控件,因此需要更改该控件

以下是我正在使用的代码:

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);
从动态创建的控件中:

lpsz[0] (2 bytes) = 97 { 97(a) 0(#)}
lpsz[1] (2 bytes) = 110 { 110(n) 0(#)}
lpsz[2] (2 bytes) = 100 { 100(d) 0(#)}

您的第一个richedit ctrl属于RichEdit20A类 第二个是RichEdit20W宽字符

您可以做的一件事是将RC文件中第一个richeditctrl的类更改为RichEdit20W 因此,两者都以宽字符的形式给出值

请参阅本文。这会有帮助的

您的第一个richedit ctrl属于RichEdit20A类 第二个是RichEdit20W宽字符

您可以做的一件事是将RC文件中第一个richeditctrl的类更改为RichEdit20W 因此,两者都以宽字符的形式给出值

请参阅本文。这会有帮助的

使用API确定控件是ANSI还是Unicode。 Ansi控件返回单字节字符串,unicode控件返回双字节字符串

如果您将资源文件更改为使用RichEdit20W而不是RichEdit20A,您必须不时检查以确保它保持为RichEdit20W! 有关详细的配方,请参阅。 注意:VS2010似乎终于修复了这个错误。

使用API来确定控件是ANSI还是Unicode。 Ansi控件返回单字节字符串,unicode控件返回双字节字符串

如果您将资源文件更改为使用RichEdit20W而不是RichEdit20A,您必须不时检查以确保它保持为RichEdit20W! 有关详细的配方,请参阅。
注意:VS2010似乎终于修复了这个错误。

1如我所说,整个应用程序使用对话框,这是唯一一个动态创建控件的地方。那么,如何使第二个版本与对话版本匹配呢?2另外,我的应用程序设置为unicode。我想知道为什么MSVC在默认情况下将richtext控件创建为RichEdit20A,这是错误的吗?我在.rc文件中确认了它正在这样做。但我无法更新许多应用程序中的所有对话框以匹配手动创建的控件。您可以使用CreateWindow API和RichEdit20A类来动态创建它,而不是使用CRichEditCtrlAwesome,它现在可以正常工作了。我从来没有想到过这个!1如我所说,整个应用程序使用对话框,这是唯一一个动态创建控件的地方。那么,如何使第二个版本与对话版本匹配呢?2另外,我的应用程序设置为unicode。我想知道为什么MSVC在默认情况下将richtext控件创建为RichEdit20A,这是错误的吗?我在.rc文件中确认了它正在这样做。但我无法更新许多应用程序中的所有对话框以匹配手动创建的控件。您可以使用CreateWindow API和RichEdit20A类来动态创建它,而不是使用CRichEditCtrlAwesome,它现在可以正常工作了。我从来没有想到过这个!整洁的谢谢你的提醒。整洁。谢谢你提到这件事。
lpsz[0] (2 bytes) = 97 { 97(a) 0(#)}
lpsz[1] (2 bytes) = 110 { 110(n) 0(#)}
lpsz[2] (2 bytes) = 100 { 100(d) 0(#)}