CRICHEDITCTRL :: getSelText () não está funcionando corretamente
-
22-09-2019 - |
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?
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);
}