CRichEditCtrl :: GetSelText () non funziona correttamente
-
22-09-2019 - |
Domanda
MFC File: winctrl4.cpp
(C: \ Programmi \ 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);
}
Sto avendo un problema strano, quando Io chiamo questo restituisce solo il primo carattere della stringa selezionata. cr
è correttamente stato impostato ma dopo ::SendMessage(m_hWnd, EM_GETSELTEXT,...
l'intera stringa non è presente.
Ho visto un comportamento simile a il mio codice personalizzato a causa di problemi di WCHAR
(caratteri a due byte contenente uno zero in un byte), quando era previsto CHAR
. Ma questo fa parte di MFC / Win32! miei set file RC E 'possibile qualcosa che non va? C'è uno stile Create relativa a questo? O da quando creiamo un CFont per il controllo in questione, potrebbe che rovinare tutto?
Soluzione
Questo non è il corretto codice sorgente MFC, hai modificato esso? Utilizzando CStringA e LPSTR è abbastanza inadeguato, il codice vero e proprio utilizza CString e LPTSTR in modo che Unicode sia correttamente gestita. Sì, come pubblicato il codice sarebbe tornato solo carattere.
Vedendo la versione aiutato. Il bug è descritto in questo all'articolo commento. Se non si può ragionevolmente effettuare l'aggiornamento a VS2008 SP1, si potrebbe derivare la propria classe da CRichEditCtrl e sostituire la funzione. Ad esempio:
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);
}