MFC文件: winctrl4.cpp
(C:\Program \8\VC\atlmfc\src\mfc\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 32的一部分!我的.rc文件可能设置了什么错误吗?有与此相关的创作风格吗?或者,既然我们为所讨论的控件创建了一个CFont,那么它会不会搞砸呢?
发布于 2010-02-28 14:07:43
这不是正确的MFC源代码,你编辑过吗?使用CStringA和LPSTR是非常不合适的,真正的代码使用CString和LPTSTR来正确地处理Unicode。是的,正如张贴的代码将只返回一个字符。
看到这个版本有帮助。这个反馈文章。描述了这个bug,如果您不能合理地升级到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);
}发布于 2019-11-23 00:18:26
要获得宽字符字符串,必须使用EM_GETTEXTEX消息。CRichEditCtrl源不包含利用此类消息的方法。下面是GetSelText()的正确实现,它实际上返回Unicode字符:
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;
int sz = (cr.cpMax - cr.cpMin + 1) * sizeof(tchar);
LPTSTR lpsz = strText.GetBufferSetLength(sz);
lpsz[0] = NULL;
GETTEXTEX gte;
memset( >e, 0, sizeof(GETTEXTEX) );
gte.cb = sz;
gte.flags = GT_SELECTION;
if( sizeof(tchar) == 2 ) gte.codepage = 1200;
::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)>e, (LPARAM)lpsz);
strText.ReleaseBuffer();
return CString(strText);
}这里是手段 UTF-16 UTF
https://stackoverflow.com/questions/2333684
复制相似问题