CRichEditCtrl::GetLine 函数不适用于字符 < 4

CRichEditCtrl::GetLine funtion is not working for Charaters < 4

在visual studio2015年,当我试图在富文本框中输入少于4个字符时,出现异常(附件如下)

调试后,我们了解到 Ensure() 导致了异常:

int CRichEditCtrl::GetLine(_In_ int nIndex, _Out_writes_to_(nMaxLength, return) LPTSTR lpszBuffer, _In_ int nMaxLength) const
    {
        ASSERT(::IsWindow(m_hWnd));
        ENSURE(sizeof(nMaxLength)<=nMaxLength*sizeof(TCHAR)&&nMaxLength>0);
        *(LPINT)lpszBuffer = nMaxLength;
        return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
    }

当我们在富文本框中输入少于 4 个字符时,

sizeof(nMaxLength)<=nMaxLength*sizeof(TCHAR)

在这种情况下 sizeof(nMaxLength) = 4 和 nMaxLength*sizeof(TCHAR) = 3 因此,3<4 导致异常。

现在,我需要帮助,我应该如何在富文本框中输入少于 4 个字符,以便此函数工作并且不会给出异常。

当然可以。

此函数获取一行。您必须提供一个足够大的缓冲区来容纳内容。允许传递给消息的最小缓冲区是一个整数(4 个字节)的大小。

函数返回您收到的大小。

此代码始终适用于任何长度

CString strTemp;
nMinLength = min(nLineLength,sizeof(int));
int iLen = m_ItemTextCtrl.GetLine(k, strtemp.GetBuffer(nMinLength), nLineLength); 
strTetmp.ReleaseBuffer(iLen);

向 RTF 控件传递数据由 streaming in data or using WM_SETTEXT or SetWindowText

完成