я должен реализовать функциональность EM_SETCUEBANNER, где текстовая подсказка появляется в Средствах редактирования:
Выгода - то, что я не могу использовать версию 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?
Примечание: я также приму ответы, которые решают мою проблему, вместо того, чтобы ответить на мой вопрос. Но кто-либо еще желающий к пользовательской ничьей Средства редактирования, сталкиваясь с этим вопросом, вероятно, хотел бы ответ.
Пользовательское рисование элемента управления Edit по существу невозможно. Есть несколько особых случаев, когда вы делаете так мало, что это может сойти с рук, но вы рискуете сильно сломаться в следующей версии Windows (или когда кто-то запускает ваше приложение в более старой версии или через службы терминалов и т. Д.).
Просто захватить WM_PAINT и WM_ERASEBKGROUND недостаточно, потому что элемент управления иногда рисует и другие сообщения.
Вам лучше просто написать свой собственный элемент управления редактированием. Я знаю, что это огромный объем работы, но в конечном итоге это будет меньше работы, чем попытка взломать свой путь к захвату всего кода рисования элементов управления Edit.
Я помню старые добрые времена, когда все использовали для создания подклассов элемент управления кнопки, чтобы добавить цвет, графику и т. Д. Дело в том, однажды я сел и просто написал свой собственный класс окна кнопки. и это было МЕНЬШЕ КОДА, чем то, что у нас было в нашем исходном дереве для подкласса и пользовательского рисования кнопки Windows.
Создайте собственный класс окна, который выглядит как пустой элемент управления редактирования, который рисует текст подсказки, показывает курсор и имеет фокус. Создайте также элемент редактирования, но разместите его за окном. (или оставьте его скрытым)
Затем, когда вы получите первое сообщение WM_CHAR (или WM_KEYDOWN?). Вы помещаете свое окно за элемент управления редактирования, переключаете фокус на редактирование и передаете сообщение WM_CHAR. С этого момента все права защищены.
Вы можете прослушивать уведомления EN_CHANGE из элемента управления редактированием, если вам нужно вернуться к отображению текста подсказки, когда редактирование становится пустым. Но я бы подумал, что было бы хорошо вернуться к тексту реплики только тогда, когда редактирование теряет фокус И становится пустым.
Создайте подкласс элемента управления редактирования. Обработайте WM_PAINT
, сначала вызвав исходную оконную процедуру, а затем, если она пуста и не в фокусе, нарисуйте текст cue. Передайте все остальные сообщения исходной оконной процедуре.
Я сделал это - работает. Проблема, с которой столкнулся человек CodeGuru, похоже, не относится к вашей ситуации. Я считаю, что он пытается сделать больше для внешнего вида. Что касается производительности, похоже, что элемент управления редактированием выполняет некоторые обновления вне обработки WM_PAINT
(вероятно, для производительности). Это сделает практически невозможным полный контроль над внешним видом. Но вы МОЖЕТЕ нарисовать подсказку.