Blog. Just Blog

Как добавить замещающий текст в поле EDIT

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем ставить эксперименты с полем EDIT. Сегодня будем добавлять в поле ввода так называемый "cue banner", что с некоторой натяжкой можно перевести на русский язык как "замещающий текст". Очень полезная штуковина, помогающая пользователю при заполнении форм с неочевидным форматом вводимых данных, а также снимающая с разработчика различные костыльно-велосипедные задачи по кастомной обработке полей ввода. Смотрите сами. По умолчанию в пустом поле ввода располагается замещающий текст. Это может быть пример данных или информация о необходимости заполнения, да вообще что угодно. Когда пользователь переходит на это поле, текст заполнителя исчезает и позволяет вводить свой собственный текст. А если поле ввода теряет фокус, но текст при этом все еще отсутствует, тогда замещающий текст возвращается обратно на свое место. При этом замещающий текст фактически не является содержимым поля, его нельзя получить через WM_GETTEXT или GetWindowText, он никуда не попадет при отправке незаполненной формы.

Для добавления замещающего текста в однострочное поле EDIT используется сообщение EM_SETCUEBANNER. В параметре lParam передается указатель на юникодную строку, которая будет отображаться в качестве замещающего текста. При этом не имеет значения, какую кодировку имеет само приложение, строка должна быть только в юникоде. В параметре wParam передается режим отображения замещающего текста. В старых мануалах вы можете встретить информацию, что этот параметр зарезервирован и там обязательно должен быть ноль. В последней редакции официальной документации написано, если значение нулевое, то подсказка будет пропадать сразу же при установке фокуса на EDIT, а если указано значение 1, то подсказка пропадет только при начале ввода пользовательского текста. И похоже, что из-за этого дополнения на сайте MSDN заявлена поддержка операционной системы как минимум Windows Vista, хотя на деле EM_SETCUEBANNER прекрасно работает, начиная с Windows XP.

Замещающий текст не появляется для многострочного поля EDIT, заблокированного поля ввода или если оно имеет атрибут "только для чтения". В остальных случаях все делается очень просто:
  1. ; Замещающие тексты
  2. szCue1  du 'required',0
  3. szCue2  du 'permanent cue',0
  4. szCue3  du 'enter text',0
  5.  
  6.         ...
  7.         ...
  8.         EM_SETCUEBANNER = 0x1501
  9.  
  10.         ; Установить исчезающую подсказку
  11.         invoke  SendDlgItemMessage,[hwnddlg],ID_EDIT1,EM_SETCUEBANNER,0,szCue1
  12.         invoke  SendDlgItemMessage,[hwnddlg],ID_EDIT4,EM_SETCUEBANNER,0,szCue3
  13.         ; Установить постоянную подсказку
  14.         invoke  SendDlgItemMessage,[hwnddlg],ID_EDIT2,EM_SETCUEBANNER,1,szCue2
Чтобы программа могла использовать сообщение EM_SETCUEBANNER, она должна быть скомпилирована с манифестом, в котором заявлена поддержка динамической библиотеки comctl32.dll версии 6.

В приложении пример программы с исходным текстом, которая создает форму с несколькими полями ввода и помещает в некоторые из них замещающие тексты.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Cue.EDIT.Demo.zip (2,966 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1051 | Комментариев: 8

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Владимир (04.12.2021 в 14:24):
Дмитрий, спасибо большое за подсказку, буду пробовать. Ваш опыт дорого стоит..Спасибо огромное!
С уважением,
Володя
ManHunter (04.12.2021 в 13:25):
GR_X1 = 188
GR_X2 = 218
GR_X3 = 252

GR_Y  = 11
STEP  = 9

dialogitem 'BUTTON','Operators',ID_PROC, 182, 1,106,(STEP*17+18),WS_VISIBLE+BS_GROUPBOX

dialogitem 'BUTTON','xor'  ,ID_200,GR_X1,GR_Y+STEP*00,25,STEP,WS_VISIBLE+BS_AUTORADIOBUTTON+BS_FL AT+WS_GROUP
dialogitem 'BUTTON','and'  ,ID_201,GR_X1,GR_Y+STEP*01,25,STEP,WS_VISIBLE+BS_AUTORADIOBUTTON+BS_FL AT
dialogitem 'BUTTON','or'   ,ID_202,GR_X1,GR_Y+STEP*02,25,STEP,WS_VISIBLE+BS_AUTORADIOBUTTON+BS_FL AT
dialogitem 'BUTTON','test' ,ID_203,GR_X1,GR_Y+STEP*03,25,STEP,WS_VISIBLE+BS_AUTORADIOBUTTON+BS_FL AT

для перемещения всего блока достаточно изменить начальные координаты X Y, для изменения расстояния между элементами меняется STEP и т.п.
Владимир (04.12.2021 в 08:29):
Дмитрий, доброе утро, спасибо большое за ответ. У меня просто была идея, например, использовать вспомогательные среды типа Delphi / Lazarus в которых можно быстро накидать на форму элементы, которые тебе нужны, и потом посмотреть координаты этих элементов в ресурс-файле, который они автоматом создают..они правда к сожалению не совпадают один-в-один с координатами, которые нужны для FASM, но в принципе можно высчитать какой-то коэффициент/соотношение чем они разнятся и уже потом эти координаты вставлять в свой FASM-файл. Та же история с Fresh IDE, те координаты, которые он показывает не совпадают с FASM, но тоже наверно можно высчитать соотношение. Странно, что в самом FASMe до сих пор нет толкового решения этой проблемы и люди тратят кучу времени на эту подгонку - на глазок, пиксельхантинг и прочее. Я кстати не совсем понял Вашу конструкцию (Y+STEP*5), (Y+STEP*6) , можете пожалуйста объяснить в двух словах что это значит ? Спасибо заранее.
С уважением,
Володя
ManHunter (04.12.2021 в 02:49):
Начальная подгонка на глазок, потом уже пиксельхантингом до приемлемой раскладки. Когда элементов дохера, то использую конструкции типа (Y+STEP*5), (Y+STEP*6) и т.п.
Владимир (03.12.2021 в 23:03):
Дмитрий, добрый вечер, есть вопрос, подскажите пожалуйста как Вы работаете с ресурсами ? Интересует способ размещения элементов на форме, как Вы высчитываете координаты элементов ? Всё "на глазок" или есть какие-то спец.программы, которые облегчают этот процесс ? Когда элементов мало, наверно можно поиграться и подгонять элементы чтобы они красиво смотрелись, а если их много ? Поделитесь пожалуйста опытом.
Спасибо заранее,
Володя
Владимир (29.11.2021 в 23:53):
Дмитрий, спасибо большое за подсказку. Мотаю на ус. И спасибо огромное за программу, Constant Helper крутая вещь, очень удобно! Файл "const.dat" вселяет страх..сколько Вы его собирали ? Это же просто кладезь...спасибо большое. Отдельное спасибо за Ваши пояснения к программам, мне кажется я начинаю понимать как это всё работает и начинаю смотреть на Ваши программы уже другими глазами..раньше они казались просто какой-то нереальной магией, а сейчас немного начинают открываться и глаза и я понемногу начинаю понимать как это всё работает. Когда прочитаете, удалите пожалуйста мой комментарий, чтоб не разводить тут флуд, и мой вопрос тоже. Я всё понял, учусь дальше.
Спасибо ещё раз!
С уважением,
Володя
ManHunter (29.11.2021 в 23:26):
EM_SETCUEBANNER описание
https://docs.microsoft.com/en-...setcuebanner
а значение берется из заголовочных файлов SDK или из моей программы Constant Helper, я ее рисовал как раз для таких случаев

ЦитатаДля чего нужна вот эта проверка для IDOK ?

Рудименты от используемых заготовок для демонстрашек. Не всегда удаляю, забываю.
Владимир (29.11.2021 в 20:36):
Дмитрий, добрый вечер, можете пожалуйста помочь разобраться, подскажите пожалуйста, откуда берётся это значение EM_SETCUEBANNER = 0x1501  ? Что это за константа ? откуда она взята ? на MSDN не нашёл..или плохо искал.
И ещё, извините за нубский вопрос, я учусь ещё, хочу понять вот эту строчку :
cmp     [wparam],BN_CLICKED shl 16 + IDOK
        jne     .processed 
На форме получается всего одна кнопка, это кнопка "Exit",которую на сколько я понял обозначают как IDCANCEL. Для чего нужна вот эта проверка для IDOK ?
Ещё раз извините заранее за тупой вопрос, я ещё начинающий.
Спасибо заранее.
С уважением,
Володя

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0076 сек.) / Память: 4.5 Mb
Наверх