Pergunta

Arquivo MFC: winctrl4.cpp

(C: Arquivos de Programas 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);
}

Estou tendo um problema estranho, quando chamo isso, ele retorna apenas o primeiro caractere da string selecionada. cr está sendo definido corretamente, mas depois ::SendMessage(m_hWnd, EM_GETSELTEXT,... toda a string não está presente.

Eu vi comportamento semelhante em minha código personalizado devido a WCHAR questões (caracteres de dois bytes contendo um zero em um byte) quando CHAR era esperado. Mas isso faz parte do MFC/Win32! É possível que meu arquivo .rc defina algo errado? Existe um estilo de criação relacionado a isso? Ou como criamos um CFONT para o controle em questão, poderia este estragar tudo?

Foi útil?

Solução

Este não é o código -fonte do MFC correto, você o editou? Usando o CStringa e o LPSTR é bastante inapropriado, o código real usa CString e LPTSTR para que o Unicode seja tratado corretamente. Sim, conforme publicado, o código retornaria apenas um caractere.


Ver a versão ajudou. O bug é descrito neste Artigo de feedback. Se você não puder atualizar razoavelmente para o VS2008 SP1, poderá derivar sua própria classe do Cricheditctrl e substituir a função. Por exemplo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top