Win32 Edit Control - GetText не возвращает финал \ n - PullRequest
1 голос
/ 16 октября 2010

У меня есть окно редактирования Win32 (т.е. CreateWindow с именем класса "EDIT").

Каждый раз, когда я добавляю строку к элементу управления, я добавляю '\ r \ n' (т.е. новую строку).

Однако, когда я вызываю WM_GETTEXT, чтобы получить текст окна РЕДАКТИРОВАНИЯ, в нем всегда пропускается последний '\ n'.

Если я добавлю 1 к результату WM_GETTEXTLENGTH, он вернёт правильное количество символов, поэтому WM_GETTEXT вернёт окончательный '\ n'.

MSDN говорит об WM_GETTEXTLENGTH:

Когда сообщение WM_GETTEXTLENGTH отправлено, функция DefWindowProc возвращает длину в символах текст. При определенных условиях функция DefWindowProc возвращает значение, которое больше, чем фактическое длина текста. Это происходит с определенные смеси ANSI и Unicode, и связано с системой, позволяющей возможное существование двухбайтовых набор символов (DBCS) в пределах текст. Возвращаемое значение, однако, всегда будет по крайней мере такой же большой, как фактическая длина текста; вы можете таким образом, всегда используйте его для направления буфера распределение. Такое поведение может возникнуть когда приложение использует оба ANSI функции и общие диалоги, которые используйте Unicode.

... но это не объясняет 1 загадку.

Почему это происходит, и для меня безопасно просто добавить необъяснимую 1 к длине текста?

Редактировать

После отключения unicode-компиляции я могу заставить его работать со сборкой ASCII, однако мне бы хотелось, чтобы это работало со сборкой UNICODE, возможно, элемент управления окна EDIT плохо работает с UNICODE?

Ответы [ 4 ]

0 голосов
/ 16 апреля 2011

Вы должны добавить один символ для ограничителя строки \0 символ.

0 голосов
/ 17 октября 2010

\r и \n отображаются в байтовые конструкции, которые работают при компиляции для ASCII.

Поскольку \r, \n не гарантируют возврат каретки, перевод строки (оба могутнапример, сопоставить с переводом строки), при построении строки лучше всего использовать шестнадцатеричные кодовые точки.(Вы, вероятно, будете использовать функции TCHAR.)

Compile for ASCII - sprintf(dest, "%s\x0D\x0A", str);
Compile for UNICODE - wsprintf(dest, "%s\0x000D\x000A", str);

Когда вы вызываете WM_GETTEXT для получения текста, вам может потребоваться вызвать WideCharToMultiByte для преобразования его в определенную кодовую страницу или набор символов, такой как ASCII или UTF8 вчтобы сохранить его в файл.

http://msdn.microsoft.com/en-us/library/aa450989.aspx

0 голосов
/ 20 октября 2010

Документация для WM_GETTEXT говорит, что поставляемый буфер должен быть достаточно большим, чтобы включать нулевой терминатор. Документация для WM_GETTEXTLENGTH говорит, что возвращаемое значение не включает нулевой терминатор. Таким образом, вы должны включить место для дополнительного символа при выделении буфера, который получает текст.

0 голосов
/ 16 октября 2010

Попробуйте установить ES_MULTILINE и ES_WANTRETURN стили для элемента управления.

...