2010-03-02 23 views
1

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

回答

3

你冷杉ST的richedit Ctrl为类“RichEdit20A” 第二个是“RichEdit20W”的 - 宽字符

一个你可以做的事情是改变类的第一richeditctrl的RC文件RichEdit20W 因此,无论给出wide_char的价值。

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

+0

1)就像我说的,整个应用程序使用对话框,这是控件动态创建的唯一位置。那么我怎样才能让第二个版本匹配对话框版本? –

+0

2)另外,我的应用程序设置为unicode。我怀疑_why_默认情况下,MSVC正在创建RichEdit20A的richtext控件,这是错误的吗?我确认它正在.rc文件中执行此操作。但我无法真正更新我的许多应用程序中的所有对话以匹配手动创建的控件。 –

+0

您可以使用类“RichEdit20A”的CreateWindow API来动态创建它,而不是使用CRichEditCtrl – SysAdmin

1

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

如果您更改资源文件以使用RichEdit20W而不是RichEdit20A,则必须不时检查以确保其保持为RichEdit20W! 请参阅here了解为什么这是必要的详细配方。 注意:VS2010似乎已经修复了这个bug。

+0

整洁。谢谢你提到它。 –

相关问题