CRichEditCtrl::GetSelText() работает неправильно
-
22-09-2019 - |
Вопрос
MFC-файл:winctrl4.cpp
(C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc)
CString CRichEditCtrl::GetSelText() const
{
ASSERT(::IsWindow(m_hWnd));
CHARRANGE cr;
cr.cpMin = cr.cpMax = 0;
::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
CStringA strText;
LPSTR lpsz=strText.GetBufferSetLength((cr.cpMax - cr.cpMin + 1)*2);
lpsz[0] = NULL;
::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
strText.ReleaseBuffer();
return CString(strText);
}
У меня странная проблема: когда я вызываю это, он возвращает только первый символ выбранной строки. cr
устанавливается правильно, но после ::SendMessage(m_hWnd, EM_GETSELTEXT,...
вся строка отсутствует.
Я видел подобное поведение в мой пользовательский код из-за WCHAR
выдает (двухбайтовый символ, содержащий ноль в одном байте), когда CHAR
ожидалось.Но это часть MFC/Win32!Возможно ли, что мой файл .rc устанавливает что-то неправильно?Есть ли стиль Create, относящийся к этому?Или, поскольку мы создаем CFont для рассматриваемого элемента управления, можно ли что нафиг это?
Решение
Это неправильный исходный код MFC, вы его редактировали?Использование CStringA и LPSTR совершенно неуместно, реальный код использует CString и LPTSTR, чтобы Unicode обрабатывался правильно.Да, как было опубликовано, код будет возвращать только один символ.
Просмотр версии помог.Ошибка описана здесь статья обратной связи. Если у вас нет разумной возможности перейти на VS2008 SP1, вы можете получить свой собственный класс от CRichEditCtrl и заменить функцию.Например:
CString CRichEditCtrlFix::GetSelText() const
{
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;
::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
strText.ReleaseBuffer();
return CString(strText);
}