Один элемент управления возвращает содержимое как однобайтовый, другой - как двухбайтовый? - PullRequest
1 голос
/ 02 марта 2010

у меня 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(#)}

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Ваш первый richedit ctrl класса "RichEdit20A" Второй - RichEdit20W - широкий символ

Одна вещь, которую вы можете сделать, это изменить класс вашего первого richeditctrl в файле RC на RichEdit20W Итак, оба дают значение в wide_char's.

См. Эту статью базы знаний. Это поможет http://support.microsoft.com/kb/261171

1 голос
/ 03 марта 2010

Используйте API IsWindowUnicode (), чтобы узнать, является ли элемент управления ANSI или Unicode. Элементы управления Ansi возвращают однобайтовые строки, элементы управления Unicode возвращают двухбайтовые строки.

И если вы измените свой файл ресурсов на использование RichEdit20W вместо RichEdit20A, вам придется время от времени проверять, чтобы он оставался как RichEdit20W! См. здесь для подробного рецепта, почему это необходимо. Примечание: VS2010, похоже, наконец-то исправил эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...