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?

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top