SetLimitText () в CEdit в Vista не работает - PullRequest
6 голосов
/ 16 октября 2008

Это происходит в 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 ]

5 голосов
/ 07 января 2009

Я связался с техподдержкой.

Цель состояла в том, чтобы иметь приблизительно 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. пытаясь прокрутить мимо последнего видимого персонаж издает звуковой сигнал. Остальная часть персонажи там, я знаю это потому что, если я дважды щелкну богатым Отредактируйте элемент управления и скопируйте текст, используя Ctrl-C, а затем вставьте его в текст редактор, я вижу 240000 персонажи. Таким образом, контроль держит правильное количество символов, но последние символы не отображаются кроме как во внешнем редакторе, так что мой оригинальная проблема остается.

Вот ответы от Microsoft Представители:

Проблема здесь в том, что элемент управления редактирования с большим количеством символов в он не рисует свой текст.

Я пытался установить разные символы, и обнаружил, что я мог бы соответствовать больше "Я чем" х "чем" м ". Проблема не прямо число символы, но, скорее всего, число пикселей. Умножая количество видимые символы по ширине пикселя символов в выбранном шрифте показывает, что предел составляет около 32К пиксели.

еще один ответ от Microsoft:

Я провел обширное исследование по этому вопросу. и хотел бы сообщить вам о прогресс дела.

Основная разница между Редактирование управления на Vista и XP что элемент управления Edit на Vista предварительно сочиняет свои глифы для лучшего международная поддержка (внутренне, это заканчивается вызов ExtTextOut с ETO_GLYPH_INDEX и массив глифов а не строка символов. Это в конечном итоге сохранить индексы глифа в метафайл и так впадает в Предел 32k пикселей. Когда слишком много символы предоставляются, ExtTextOut терпит неудачу и ничего не рисует. Править управление на XP не предопределяет глифы и так не имеют этого проблема, но не справится международные символы.

Элемент управления редактирования в XP обрезает 32к, но так как это за кадром это не очевидно При прокрутке к правильно, это начинается с первого видимый символ, поэтому видимая часть контроля всегда раньше, чем 32 тыс. Пикселей.

Элемент управления RichEdit рисует начало, но после нажатия End, правки происходят в основном за кадром. RichEdit 3.0 и 4.1 дает аналогичные поведение. Это похоже на 32 КБ предел пикселей элемента управления RichEdit, как он рисует свой текст на экране растровое изображение перед отображением экран.

Учитывая эти моменты, поведение это дизайн. Вам нужно будет создать ваш собственный контроль, чтобы получить поведение отображения такой большой строки, как 240000 в одну строку.

и последний:

Я провел дальнейшие исследования по этому вопросу. для нахождения любого легкого веса Обходной путь для преодоления 32 тыс. пикселей предел, но, к сожалению, кажется, что для этого нет обходного пути.

Пара альтернатив, которые мы попробовали такое RichEdit 3.0, RichEdit 4.1, используя UniScribe, используя разные шрифты и т. Д., Но ни один из них достаточно вашего требования.

Возможно, вам нужно создать ваш собственный контроль, если вы хотите отображать редактируемую однострочную строку который превышает ограничение в 32 тыс. пикселей в Windows Vista.

1 голос
/ 18 февраля 2009

FYI - если текст только для чтения / dsiplay, вы можете добавить некоторые CR-LF в строку, чтобы исправить отображение текста. Похоже, что функция ExtTextOut работает немного иначе, когда новые строки. Поскольку это поле для редактирования, состоящее из одной строки, символы новой строки удаляются, поэтому текст выглядит одинаково - если вы не скопируете и не вставите его, строки будут в строке ...

0 голосов
/ 16 октября 2008

Не должно быть проблем только с 6000 символами - может, проблема в другом месте? У вас есть обработчики для измененных событий / уведомлений из текстового поля? Может быть, они вешают трубку?

...