一个控件将内容作为单字节返回,另一个控制作为双字节返回?

时间:2010-03-02 16:52:27

标签: mfc character-encoding

我有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);

对话框模板控件的输出:

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(#)}

2 个答案:

答案 0 :(得分:3)

你的第一个richedit ctrl属于“RichEdit20A”类 第二个是“RichEdit20W” - 宽字符

您可以做的一件事是将RC文件中第一个richeditctrl的类更改为RichEdit20W 所以,两者都给出了wide_char中的值。

请参阅此知识库文章。这会有所帮助 http://support.microsoft.com/kb/261171

答案 1 :(得分:1)

使用IsWindowUnicode()API查明控件是ANSI还是Unicode。 Ansi控制返回单字节字符串,unicode控件返回双字节字符串。

如果您更改资源文件以使用RichEdit20W而不是RichEdit20A,则必须不时检查以确保它保持为RichEdit20W! 有关详细信息,请参阅here。 注意:VS2010似乎最终修复了这个bug。