Как сделать перенос строки в label

Обновлено: 06.07.2024

Помогите! Нигде в своих учебничках не могу найти, как переходить на новую строку в Memo.
Вот если для Label делаю Label->Caption="Строка \nс переносом", всё прекрасно: Результат:
Строка
с переносом.

Но такие компоненты как Memo ведут себя совершенно иначе. Они это \n воспринимают как перенос на новую строку, только отображают символ "|", что уже совсем не понятно, и в самом окне Memo всё-равно пишут в одну строку:
Строка|с переносом.
А дальше ещё непонятнее. Если сохраняю этот текст (эту строку) с такими разделителями в файле с расширением *txt и открываю, например, в болкноте — опять абра-кадабра: одна строка, на этот раз с квадратиками в качестве разделителей. Но если эту строку сохранить в формате *doc или там *rtf и открыть в Word или WordPad, всё в таком виде, как хотелось бы видеть в Memo или текстовом файле:
Строка
с переносом.

Как можно получить функциональность переноса слов Label для текста, который выходит за пределы?

Быстрый ответ: выключите AutoSize .

Большая проблема здесь в том, что метка не изменит свою высоту автоматически (только ширина). Чтобы сделать это правильно, вам нужно будет создать подкласс метки и включить логику вертикального изменения размера.

В основном, что вам нужно сделать в OnPaint:

  1. Измерьте высоту текста (Graphics.MeasureString).
  2. Если высота надписи не равна высоте текста, установите высоту и вернитесь.
  3. Нарисуй текст.

Вам также нужно будет установить флаг стиля ResizeRedraw в конструкторе.

Выберите метку, к которой вы динамически добавляете текст. Посмотрите на свойства метки и выключите AutoSize. Теперь вы сможете перетаскивать / устанавливать область для метки, и она автоматически будет переноситься в соответствии с этими параметрами. Нет необходимости в каком-либо дополнительном кодировании.

Это именно то, что я искал, поскольку это касается форматирования моей формы с пояснительным текстом в форме абзаца.

@madeFromCode Вам нужно установить высоту программно, если вы хотите, чтобы метка расширялась по вертикали, иначе ваш текст будет обрезан.

На самом деле, принятый ответ излишне сложен.

Если вы установите метку в AutoSize, она будет автоматически расти вместе с тем текстом, который вы в нее поместите. (Это включает вертикальный рост.)

Если вы хотите сделать перенос слов определенной ширины, вы можете установить свойство MaximumSize.

Проверено и работает.

Если у вас есть метка, привязанная к ее контейнеру, вы можете отключить AutoSize, оставить свойство максимального размера как есть, и оно будет переносить слова точно так, как мы хотим. ПОЦЕЛУЙ на работе!

Сэм: вы должны иметь возможность установить Dock свойство как метки, так и панели Top вместо моего решения.

В моем случае (метка на панели) я установил label.AutoSize = false и label.Dock = Fill . И текст метки оборачивается автоматически.

Это заставляет метку заполнять всю форму и скрывать все остальные элементы управления в форме . То есть она не работает. Существуют ли другие требования, которые не заполнили бы всю форму?

Это похоже на какой-то дополнительный макет, который должен быть ненужным. Конечно, этикетка должна иметь свою собственную коробку, а не помещать ее в другую коробку.

Свойство autowrap отсутствует, но это можно сделать программно для его динамического определения размера. Вот одно из решений:

Выберите свойства метки

AutoSize знак равно True

MaximumSize = ( Ширина , высота ) где ширина = максимальный размер метки, а высота = количество пикселей, которое нужно обернуть

Свойства образца

Еще одно примечание: если вы оставите максимальную высоту равной 0, она будет продолжать расширяться по вертикали.

Чтобы разбить символы, а не слова (полезно, если у вас длинные строки без пробелов, например путей к файлам), используйте вместо этого (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl). Смотрите последний пост в той же теме MSDN.

Кроме того, не забудьте включить верхний и нижний отступы метки в расчет ( Height = sz.Height + Padding.Vertical; )

Мне нужно было найти быстрое решение, поэтому я просто использовал TextBox со следующими свойствами:

Это оригинальное решение, которое также хорошо работает на Compact Framework (где у Label нет свойств AutoSize и MaximumSize).

Иметь лучший на основе ответа @hypo

int width = this.Parent == null ? this.Width : this.Parent.Width; это позволяет вам использовать метку автоматического увеличения при прикреплении к родителю, например к панели.

this.Height = sz.Height + Padding.Bottom + Padding.Top; здесь мы позаботимся о прокладке сверху и снизу.

Обработайте ClientSizeChanged event панель, чтобы метка заполнила пространство:

Установить Auto-Size для ярлыка true

Они сделаны в конструкторе (но могут быть выполнены в коде, если вам это нужно), и нет причин для заказа.

Не уверен , что это будет соответствовать все примеры использования , но я часто использую простой трюк , чтобы получить поведение оберточной: положить ваши Label с AutoSize=false внутри 1x1 , TableLayoutPanel который будет заботиться о Label размере «s.

Установите для свойства AutoEllipsis значение TRUE, а для свойства AutoSize - значение FALSE.

введите описание изображения здесь

введите описание изображения здесь

Если ваша панель ограничивает ширину вашей метки, вы можете установить свойство привязки вашей метки влево, вправо и установить для AutoSize значение true. Концептуально это похоже на прослушивание SizeChanged события Panel и обновление MaximumSize метки до a, new Size(((Control)sender).Size.Width, 0) как было предложено в предыдущем ответе. . Каждая сторона, указанная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает размерность элемента управления. Привязка к левому и правому краям устанавливает свойство Width элемента управления, а привязка к верхнему и нижнему элементам устанавливает его свойство Height.

Не работает Метка увеличивает ширину моей панели только для того, чтобы ее не нужно было оборачивать. К сожалению, окно не такое широкое.

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

  • Установите автоматический размер true
  • Установите максимальную ширину так, как вы хотите
  • Установите минимальную ширину одинаково

Теперь метка имеет постоянную ширину, но она автоматически адаптируется к своей высоте.

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

UserForm.Label – это элемент управления пользовательской формы, предназначенный для отображения на ней поясняющих надписей к другим элементам управления, меток, заметок, вывода дополнительной текстовой информации.

Элемент управления Label, как и другие элементы управления, реагирует на нажатия мышью, то есть его можно использовать для запуска подпрограмм, изменения собственных свойств, свойств пользовательской формы и других элементов управления.

Свойства элемента Метка

* При загруженной в надпись картинке свойство TextAlign не работает, следует использовать свойство PicturePosition.

Свойство по умолчанию для элемента Label – Caption, основное событие – Click.

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

Примеры кода VBA с Label

Пример 1
Загрузка элемента управления Label на пользовательскую форму с параметрами, заданными в коде VBA Excel:

Читайте также: