11

MFC 中 CEdit 控件中包含的文本字符串的最大长度是多少?尝试在字符 30001 之后添加字符时发出哔哔声,这是否记录在任何地方?我可以在 CEdit 中显示更长的文本吗?我应该使用其他控件吗?

正如下面的“Windows 程序员”所说,用户键入时的文本长度限制与我们使用 SetWindowText 以编程方式设置文本时的文本长度限制不同。任何地方都没有提到以编程方式设置文本的限制。用户输入的默认文本长度限制是错误的。(见下面我自己的帖子)。

我猜在我调用 pEdit->SetLimitText(0) 之后,编程和用户输入文本长度的限制都是 7FFFFFFE 字节。我对吗?

在 vista 中,将超过 40000 个字符的文本粘贴到 CEdit 中时,它会变得无响应。我之前是否调用过 SetLimitText(100000) 并不重要。

4

3 回答 3

19

当提到 vista 中单行 CEdit 控件的默认大小时,我发现文档是错误的。

我运行了这段代码:

CWnd* pWnd = dlg.GetDlgItem(nItemId);
CEdit *edit = static_cast<CEdit*>(pWnd); //dynamic_cast does not work
if(edit != 0)
{
    UINT limit = edit->GetLimitText(); //The current text limit, in bytes, for this CEdit object.
    //value returned: 30000 (0x7530)
    edit->SetLimitText(0);
    limit = edit->GetLimitText();
    //value returned: 2147483646 (0x7FFFFFFE) 
}

该文件指出:

在调用 EM_SETLIMITTEXT 之前,用户可以在编辑控件中输入的文本量的默认限制是 32,767 个字符。

这显然是错误的。

于 2008-10-08T19:35:29.903 回答
9

您可以通过在控件上调用CEdit::GetLimitText()来找出控件的最大值。这将返回字符数据的最大大小(以字节为单位)。您可以使用CEdit::SetLimitText()函数更改最大大小。

SetLimitText() 函数相当于发送一个EM_SETLIMITTEXT消息。该消息的文档提供了可以使用的最大大小,但由于这些是 MSDN 链接,明天可能会被破坏,我将复制相关信息:)

UINT 参数解释为:

用户可以输入的最大 TCHAR 数。对于 ANSI 文本,这是字节数;对于 Unicode 文本,这是字符数。此数字不包括终止空字符。丰富的编辑控件:如果此参数为零,则文本长度设置为 64,000 个字符。

Windows NT/2000/XP 上的编辑控件:如果此参数为零,则文本长度设置为单行编辑控件的 0x7FFFFFFE 字符或多行编辑控件的 –1。

Windows 95/98/Me 上的编辑控件:如果此参数为零,则文本长度设置为单行编辑控件的 0x7FFE 字符或多行编辑控件的 0xFFFF。

此外,从备注部分:

在调用 EM_SETLIMITTEXT 之前,用户可以在编辑控件中输入的文本量的默认限制是 32,767 个字符。

Windows NT/2000/XP 上的编辑控件:对于单行编辑控件,文本限制为 0x7FFFFFFE 字节或 wParam 参数的值,以较小者为准。对于多行编辑控件,此值为 –1 字节或 wParam 参数的值,以较小者为准。

Windows 95/98/Me 上的编辑控件:对于单行编辑控件,文本限制为 0x7FFE 字节或 wParam 参数的值,以较小者为准。对于多行编辑控件,此值是 0xFFFF 字节或 wParam 参数的值,以较小者为准。

我认为他们在第二段中的意思是 0xFFFFFFFF 而不是 -1 ......

于 2008-10-08T04:30:17.717 回答
2

“(它可以显示的字符)”!=“尝试添加字符时”。

“尝试添加字符时”==“用户可以输入的最大 TCHAR 数”,除非您的意思是以编程方式尝试添加字符。

"0x7FFFFFFE characters" != "0x7FFFFFFE bytes" 除了有时,引用的 MSDN 文本有时可以理解这一事实。

我敢打赌没有人知道原始问题的答案。但是“0x7FFFFFFE 字节”可能是众多限制之一。

于 2008-10-08T04:48:54.840 回答