у меня 2 CRichEditCtrls
. Один из них является частью диалогового шаблона, созданного автоматически. Когда я вызываю GetSelText, возвращаемые байты составляют один байт на символ, то есть я вернусь char *str={'a','n','d'}
. 2-й элемент управления создается динамически с использованием метода 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) = 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(#)}