1

MFC ファイル: winctrl4.cpp

(C:\Program Files\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);
}

これを呼び出すと、選択した文字列の最初の文字のみが返されます。cr正しく設定されていますが::SendMessage(m_hWnd, EM_GETSELTEXT,...、文字列全体が存在しません。

問題 (1 バイトに 0 を含む 2 バイト文字) が原因で、予想されるときにカスタムコードで同様の動作が見られました。しかし、これは MFC/Win32 の一部です! 私の .rc ファイルが何か間違った設定をしている可能性はありますか? これに関連する作成スタイルはありますか? それとも、問題のコントロールの CFont を作成するので、それが台無しになる可能性はありますか?WCHARCHAR

4

2 に答える 2

3

これは正しい MFC ソース コードではありません。編集しましたか? CStringA と LPSTR の使用はまったく不適切です。実際のコードでは、Unicode が正しく処理されるように CString と LPTSTR を使用しています。はい、投稿されたように、コードは 1 文字のみを返します。


バージョンを見て助かりました。このバグは、このフィードバック記事で説明されています。 VS2008 SP1 に合理的にアップグレードできない場合は、CRichEditCtrl から独自のクラスを派生させ、関数を置き換えることができます。例えば:

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);
}
于 2010-02-28T14:07:43.403 に答える