首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRichEditCtrl::GetSelText()不能正常工作

CRichEditCtrl::GetSelText()不能正常工作
EN

Stack Overflow用户
提问于 2010-02-25 11:47:50
回答 2查看 1.8K关注 0票数 1

MFC文件: winctrl4.cpp

(C:\Program \8\VC\atlmfc\src\mfc\mfc)

代码语言:javascript
复制
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,那么它会不会搞砸呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-28 14:07:43

这不是正确的MFC源代码,你编辑过吗?使用CStringA和LPSTR是非常不合适的,真正的代码使用CString和LPTSTR来正确地处理Unicode。是的,正如张贴的代码将只返回一个字符。

看到这个版本有帮助。这个反馈文章。描述了这个bug,如果您不能合理地升级到VS2008 SP1,您可以从CRichEditCtrl派生出自己的类并替换该函数。例如:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2019-11-23 00:18:26

要获得宽字符字符串,必须使用EM_GETTEXTEX消息。CRichEditCtrl源不包含利用此类消息的方法。下面是GetSelText()的正确实现,它实际上返回Unicode字符:

代码语言:javascript
复制
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( &gte, 0, sizeof(GETTEXTEX) );
    gte.cb = sz;
    gte.flags = GT_SELECTION;
    if( sizeof(tchar) == 2 ) gte.codepage = 1200;
    ::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)&gte, (LPARAM)lpsz);
    strText.ReleaseBuffer();
    return CString(strText);
}

这里是手段 UTF-16 UTF

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2333684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档