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,... 整个字符串不存在。

我在中看到了类似的行为 我的 自定义代码由于 WCHAR 问题(一个字节中包含零的两字节字符) CHAR 是预料之中的。但这是MFC/Win32的一部分!我的 .rc 文件是否可能设置有问题?有与此相关的创建样式吗?或者,由于我们为相关控件创建了 CFont,因此可以 搞砸了?

有帮助吗?

解决方案

这不是正确的 MFC 源代码,您是否编辑过它?使用 CStringA 和 LPSTR 是非常不合适的,实际代码使用 CString 和 LPTSTR 以便正确处理 Unicode。是的,正如发布的那样,代码只会返回一个字符。


查看版本有帮助。该错误在此进行了描述 反馈文章。 如果您无法合理升级到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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top