这发生在Vista上.我创建了一个基于MFC项目的新对话框来测试它.我在对话框中添加了一个CEdit控件.我调用SetLimitText让我的CEdit接收100000个字符.我试过两个:
this->m_cedit1.SetLimitText(100000); UpdateData(FALSE);
和
static_cast(GetDlgItem(IDC_EDIT1))->LimitText(100000);
我把这些调用放在InitDialog上.
在我将5461个字符粘贴到我的CEdit后,它变为空白且无响应.关于是什么导致这个和变通办法的任何想法都能够在CEdit或任何其他控件中粘贴长文本串?
注意:5461是二进制的0x1555或1010101010101,我觉得很奇怪.
如果我粘贴5460个字符我没有问题.
我联系了microsof支持.
目标是在一个可编辑的文本行中包含大约240000个字符.
我能够在Windows Vista(x64和x32)上重现这个问题,但不能在Windows XP 上重现 .
这段代码在XP中工作正常:
BOOL ClongeditXPDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here UINT limit = m_longEdit.GetLimitText(); m_longEdit.SetLimitText(240000); UINT limit2 = m_longEdit.GetLimitText(); CString str; str = _T(""); for(int i = 0; i < 250000; i++) str += _T("a"); m_longEdit.SetWindowText(str); return TRUE; // return TRUE unless you set the focus to a control }
如果我使用CRichEdit控件,当我在内部粘贴一个长字符串后按"结束"键或"右箭头"键时,我无法看到Rich Edit Control中的所有字符.试图滚过最后一个可见的角色会产生一声哔哔声.其余的字符都在那里,我知道这是因为如果我双击Rich Edit Control并使用ctrl-c复制文本然后将其粘贴到文本编辑器上,我可以看到240000个字符.因此控件保持适量的字符,但除了在外部编辑器中外,最后的字符是不可见的,所以我原来的问题依然存在.
以下是微软代表的答案:
这里的问题是其中包含大量字符的编辑控件不会绘制其文本.
我尝试设置不同的角色,并发现我可以比'x'更适合'而不是'm'.问题不是直接的字符数,而是很可能是像素数.将可见字符数乘以所选字体中字符的像素宽度表示限制大约为32k像素.
微软的另一个答案:
我对此问题进行了广泛的研究,并希望向您提供有关案例进展的最新信息.
Vista和XP上的Edit控件之间的主要区别在于Vista上的Edit控件预先组合其字形以获得更好的国际支持(在内部,它最终使用ETO_GLYPH_INDEX调用ExtTextOut以及字形数组而不是字符串.这最终将字形索引保存到元文件中,因此会遇到32k像素的限制.当提供的字符太多时,ExtTextOut会失败并且什么都不会.XP上的Edit控件不会预先编写字形,所以没有这个问题,但也不会处理国际字符.
XP上的编辑控件将剪辑为32k,但由于这是在屏幕外,因此不是很明显.向右滚动时,它以第一个可见字符开头,因此控件的可见部分始终早于32k像素.
RichEdit控件绘制开头,但在点击End后,编辑主要发生在屏幕外.RichEdit 3.0和4.1给出了类似的行为.这似乎是RichEdit控件的32k像素限制,因为它在将其文本显示在屏幕外位图之前将其显示在屏幕上.
考虑到这些点,行为是设计的.您需要创建自己的控件以获得在一行中显示为240000的大字符串的行为.
最后一个:
我在这个问题上做了进一步的研究,找到了克服32k像素限制的任何轻量级解决方法,但不幸的是,似乎没有解决方法.
我们尝试的几个替代品是RichEdit 3.0,RichEdit 4.1,使用UniScribe,使用不同的字体等,但它们似乎都不足以满足您的要求.
如果您希望在Windows Vista中显示超过32k像素限制的可编辑单行字符串,则可能需要创建自己的自定义控件.