Автовыделение текста в поле EDIT
20.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем улучшать базовый функционал стандартного поля ввода. При двойном клике на слове, находящемся в поле EDIT, это слово выделяется. Это хорошо и правильно. При двойном клике на пустом поле, которое находится справа от последнего символа текста, выделяется последнее слово в строке. И вот это, как мне кажется, неправильное поведение. По логике должна выделяться вся строка, что-то похожее реализовано в адресной строке браузеров. Вроде бы мелочь, но именно из таких незначительных деталей складывается общее впечатление о вашей программе. Давайте добавим чуточку красоты в этот мир.При инициализации родительского окна установим свой субклассированный обработчик для нужного поля ввода. Эта тема должна быть вам уже хорошо знакома, она не раз обсуждалась на сайте. А вот сам обработчик:
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------
- ; Субклассированный обработчик
- ;------------------------------------------------
- proc EditWindowProc hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
- ; Даблклик левой кнопкой мыши?
- cmp [uMsg],WM_LBUTTONDBLCLK
- je .dblclick
- .char_ok:
- ; Передать управление предыдущему обработчику
- invoke CallWindowProc,[OldProc],[hEdit],[uMsg],[wParam],[lParam]
- ret
- .dblclick:
- ; Передать управление предыдущему обработчику
- invoke CallWindowProc,[OldProc],[hEdit],[uMsg],[wParam],[lParam]
- ; Получить информацию о ближайшем символе, рядом с которым
- ; произошло событие двойного клика
- ; В lParam находятся координаты произошедшего события
- invoke SendMessage,[hEdit],EM_CHARFROMPOS,0,[lParam]
- ; Сохранить для сравнения
- mov ebx,eax
- ; Получить длину текста в поле ввода
- invoke GetWindowTextLength,[hEdit]
- ; Событие произошло за границами содержимого?
- cmp eax,ebx
- jne @f
- ; Выделить весь текест в поле ввода
- invoke SendMessage,[hEdit],EM_SETSEL,0,eax
- @@:
- ret
- endp
Читать статью целиком »
Просмотров: 494 | Комментариев: 2