CEdit контролировать максимальную длину? (в символах может отображаться) - PullRequest
9 голосов
/ 08 октября 2008

Какова максимальная длина текстовой строки, содержащейся в элементе управления CEdit в MFC? Я получаю звуковой сигнал при попытке добавить символ после символа 30001. Это где-нибудь задокументировано? Могу ли я отображать более длинные тексты в CEdit? Должен ли я использовать другой элемент управления?

Как говорит «программист Windows» ниже, ограничение длины текста не совпадает, когда пользователь печатает текст, когда мы программно устанавливаем текст с помощью SetWindowText. Предел для установки текста программно нигде не упоминается. Неправильное ограничение длины текста по умолчанию для ввода текста пользователем. (см. мой собственный пост ниже).

Я предполагаю, что после того, как я вызову pEdit-> SetLimitText (0), предел для программной и пользовательской длины текста составляет 7FFFFFFE байт. Я прав?

В Vista при вставке текста длиной более 40000 символов в CEdit он перестает отвечать на запросы. Не имеет значения, если я ранее вызывал SetLimitText (100000).

Ответы [ 3 ]

15 голосов
/ 08 октября 2008

Я обнаружил, что документация неверна, когда упоминается размер по умолчанию для однострочного элемента управления CEdit в vista.

Я запустил этот код:

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 символов.

что явно не так.

6 голосов
/ 08 октября 2008

Вы можете узнать, каково максимальное значение для вашего элемента управления, вызвав CEdit :: GetLimitText () для вашего элемента управления. Это возвращает максимальный размер для символьных данных в байтах. Вы можете изменить максимальный размер, используя функцию CEdit :: SetLimitText () .

Функция SetLimitText () эквивалентна отправке сообщения EM_SETLIMITTEXT . В документации к этому сообщению указаны максимальные размеры, которые можно использовать, но поскольку это ссылки MSDN, которые, вероятно, будут сломаны к завтрашнему дню, я скопирую соответствующую информацию:)

Параметр UINT интерпретируется как:

Максимальное количество TCHAR для пользователя могу войти. Для текста ANSI это количество байтов; для текста Unicode, это количество символов. это номер не включает завершающий нулевой символ. Rich edit управления: если этот параметр равен нулю, длина текста установлена ​​в 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 ...

2 голосов
/ 08 октября 2008

"(в символах может отображаться)"! = "При попытке добавить символ".

"при попытке добавить символ" == "Максимальное количество TCHAR, которые пользователь может ввести" если только вы не имеете в виду программную попытку добавить символ.

"0x7FFFFFFE символов"! = "0x7FFFFFFE байтов" за исключением иногда факта, который иногда понимается в цитируемом тексте MSDN.

Бьюсь об заклад, никто не знает ответ на оригинальный вопрос. Но «0x7FFFFFFE bytes», вероятно, является одним из многих ограничений.

...