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

时间:2008-10-15 21:37:22

标签: visual-c++ mfc windows-vista

Vista上正在发生这种情况。 我创建了一个基于MFC项目的新对话框来测试它。我在对话框中添加了一个CEdit控件。我调用SetLimitText让我的CEdit接收100000个字符。我试过了两个:

this->m_cedit1.SetLimitText(100000);
UpdateData(FALSE);

static_cast<CEdit*>(GetDlgItem(IDC_EDIT1))->LimitText(100000);

我将这些调用放在InitDialog上。

在我将5461个字符粘贴到我的CEdit后,它变为空白且无响应。有关导致此问题和解决方法的任何想法能够在CEdit或任何其他控件中粘贴长字符串文本吗?

注意:5461是二进制的0x1555或1010101010101,我觉得很奇怪。

如果我粘贴5460个字符,我没有问题。

3 个答案:

答案 0 :(得分:5)

我联系了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  编辑控制并使用复制文本  ctrl-c然后将其粘贴到文本上  编辑,我可以看到240000  字符。所以控制权持有  适量的角色,但是  最后一个字符不可见  除了在外部编辑器中,所以我的  原始问题仍然存在。

以下是微软的答案  代表:

  

这里的问题是编辑控件   中包含大量字符   它没有画出文字。

     

我尝试设置不同的角色,   并发现我可以适应更多   '我比'x'而不是'm'。问题   不是直接的数量   字符,但可能是数字   像素。乘以数量   像素宽度的可见字符   所选字体中的字符   表明限制大约是32k   像素。

微软的另一个答案:

  

我对这个问题进行了广泛的研究   并想更新你的   案件进展。

     

之间的主要区别   在Vista和XP上编辑控件   Vista上的Edit控件   预先编写其字形以获得更好的效果   国际支持(内部,它   最终调用ExtTextOut   ETO_GLYPH_INDEX和一组字形   而不是一串字符。   这最终保存了字形索引   进入一个图元文件,因此遇到了   32k像素限制。当太多了   提供了字符,ExtTextOut   失败,什么都没画。编辑   控制XP不会预先组成   字形等都没有这个   问题,但不会处理   国际人物也是如此。

     

XP上的编辑控件将剪辑为   32k,但因为那是屏幕外的   不明显。滚动到的时候   对,它从第一个开始   可见字符所以可见部分   控制总是早于   32k像素。

     

RichEdit控件绘制   开始,但在击中End之后,   编辑主要发生在屏幕外。   RichEdit 3.0和4.1给出了类似的功能   行为。这似乎是32k   RichEdit控件的像素限制为   它在屏幕外绘制文本   在将其显示到之前的位图   屏幕。

     

考虑到这些点,行为   是设计的。你需要创建   你自己控制以获得行为   显示为240000的大字符串   在一行。

和最后一个:

  

我对这个问题做了进一步的研究   找到任何轻量级   克服32k像素的解决方法   限制,但不幸的是,似乎   没有解决方法。

     

我们尝试过的几种替代品   是RichEdit 3.0,RichEdit   4.1,使用UniScribe,使用不同的字体等,但似乎没有   满足你的要求。

     

可能你需要创造   如果你愿意,你自己的自定义控件   显示可编辑的单行字符串   超过32k像素限制   Windows Vista。

答案 1 :(得分:1)

FYI - 如果文本只读/ dsiplay,您可以在字符串中添加一些CR-LF来修复文本的显示。看起来ExtTextOut函数在换行时的工作方式略有不同。由于它是单行编辑框,因此新行被剥离,因此文本看起来相同 - 除非您复制并粘贴它,否则换行符将在字符串中...

答案 2 :(得分:0)

只有6000个字符应该没有任何问题 - 问题可能在其他地方?您是否有任何处理程序可以从文本框中更改事件/通知?也许他们挂了?