Win32: Как к пользовательской ничьей Средства редактирования?

я должен реализовать функциональность EM_SETCUEBANNER, где текстовая подсказка появляется в Средствах редактирования:

Example of cue banner in edit control

Выгода - то, что я не могу использовать версию 6 Общего контроля, которая является тем, что требуется, чтобы получать предоставленную реализацию Microsoft баннера сигнала.

я изучил простое изменение текста средств редактирования и формата шрифтов к

Dark Gray Italic Text

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

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

Средства редактирования приятно не выставляют пользовательский механизм рисунка, как ListView, TreeView и другие обеспечивают.

Другие люди изучили его, но это, кажется, почти невозможная задача:

От пути смотрят вещи, я должен буду обработать следующие сообщения:

  • WM_ERASEBKGND, WM_PAINT (по очевидным причинам)
  • WM_SETFOCUS, WM_KILLFOCUS (чтобы препятствовать тому, чтобы белая панель отобразилась - описанный выше)
  • WM_CHAR (чтобы обработать и обновить текст в управлении)

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

Это будет забавой.: rolleyes:

Учитывая, что Windows Edit control никогда не предназначался, чтобы быть пользовательский оттянутый: кто-либо знает как к пользовательской ничьей Windows Edit control?


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

11
задан Roman R. 14 February 2017 в 19:01
поделиться

3 ответа

Пользовательское рисование элемента управления Edit по существу невозможно. Есть несколько особых случаев, когда вы делаете так мало, что это может сойти с рук, но вы рискуете сильно сломаться в следующей версии Windows (или когда кто-то запускает ваше приложение в более старой версии или через службы терминалов и т. Д.).

Просто захватить WM_PAINT и WM_ERASEBKGROUND недостаточно, потому что элемент управления иногда рисует и другие сообщения.

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

Я помню старые добрые времена, когда все использовали для создания подклассов элемент управления кнопки, чтобы добавить цвет, графику и т. Д. Дело в том, однажды я сел и просто написал свой собственный класс окна кнопки. и это было МЕНЬШЕ КОДА, чем то, что у нас было в нашем исходном дереве для подкласса и пользовательского рисования кнопки Windows.

9
ответ дан 3 December 2019 в 05:12
поделиться

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

Затем, когда вы получите первое сообщение WM_CHAR (или WM_KEYDOWN?). Вы помещаете свое окно за элемент управления редактирования, переключаете фокус на редактирование и передаете сообщение WM_CHAR. С этого момента все права защищены.

Вы можете прослушивать уведомления EN_CHANGE из элемента управления редактированием, если вам нужно вернуться к отображению текста подсказки, когда редактирование становится пустым. Но я бы подумал, что было бы хорошо вернуться к тексту реплики только тогда, когда редактирование теряет фокус И становится пустым.

5
ответ дан 3 December 2019 в 05:12
поделиться

Создайте подкласс элемента управления редактирования. Обработайте WM_PAINT , сначала вызвав исходную оконную процедуру, а затем, если она пуста и не в фокусе, нарисуйте текст cue. Передайте все остальные сообщения исходной оконной процедуре.

Я сделал это - работает. Проблема, с которой столкнулся человек CodeGuru, похоже, не относится к вашей ситуации. Я считаю, что он пытается сделать больше для внешнего вида. Что касается производительности, похоже, что элемент управления редактированием выполняет некоторые обновления вне обработки WM_PAINT (вероятно, для производительности). Это сделает практически невозможным полный контроль над внешним видом. Но вы МОЖЕТЕ нарисовать подсказку.

3
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: