CRichEditCtrl :: GetSelText () не работает правильно - PullRequest
1 голос
/ 25 февраля 2010

Файл 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 устанавливает что-то не так? Есть ли для этого стиль создания? Или, поскольку мы создаем CFont для рассматриваемого элемента управления, может что испортить его?

1 Ответ

2 голосов
/ 28 февраля 2010

Это не правильный исходный код MFC, вы редактировали его? Использование CStringA и LPSTR совершенно неуместно, реальный код использует CString и LPTSTR, чтобы Юникод был правильно обработан. Да, после публикации код будет возвращать только один символ.


Просмотр версии помог. Ошибка описана в этой статье . Если вы не можете разумно перейти на 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);
}
...