Pregunta

MFC del archivo: winctrl4.cpp

(C: \ Archivos de programa \ 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);
}

Estoy teniendo un problema extraño, cuando llamo a esto, sólo devuelve el primer carácter de la cadena seleccionada. cr está siendo correctamente set, pero después de ::SendMessage(m_hWnd, EM_GETSELTEXT,... toda la cadena no está presente.

vi un comportamiento similar en mi código personalizado debido a problemas de carácter WCHAR (de dos bytes que contiene un cero en un byte) cuando se esperaba CHAR. Pero esto es parte de MFC / Win32! ¿Es posible que mi .rc conjuntos de archivos algo mal? ¿Hay un estilo Crear relacionada con esto? O desde que creamos un CFont para el control en cuestión, podría que meter la pata?

¿Fue útil?

Solución

Este no es el código fuente de MFC anteriores, solicite de editarlo? Usando CStringA y LPSTR es bastante inadecuado, el código real utiliza CString y LPTSTR modo que Unicode se maneja correctamente. Sí, tal como fue anunciado el código sólo volvería un carácter.


Al ver la versión ayudó. El fallo de funcionamiento se describe en este comentarios del artículo. Si no se puede actualizar a VS2008 SP1 razonablemente, podría derivar su propia clase de CRichEditCtrl y reemplazar la función. Por ejemplo:

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top