当前位置:  开发笔记 > 开发工具 > 正文

Vista中的CEdit中的SetLimitText()不起作用

如何解决《Vista中的CEdit中的SetLimitText()不起作用》经验,为你挑选了1个好方法。

这发生在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个字符我没有问题.



1> rec..:

我联系了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像素限制的可编辑单行字符串,则可能需要创建自己的自定义控件.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有