Blog. Just Blog

Автовыделение текста в поле EDIT

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

При инициализации родительского окна установим свой субклассированный обработчик для нужного поля ввода. Эта тема должна быть вам уже хорошо знакома, она не раз обсуждалась на сайте. А вот сам обработчик:
  1. ;------------------------------------------------
  2. ; Субклассированный обработчик
  3. ;------------------------------------------------
  4. proc EditWindowProc hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  5.         ; Даблклик левой кнопкой мыши?
  6.         cmp     [uMsg],WM_LBUTTONDBLCLK
  7.         je      .dblclick
  8. .char_ok:
  9.         ; Передать управление предыдущему обработчику
  10.         invoke  CallWindowProc,[OldProc],[hEdit],[uMsg],[wParam],[lParam]
  11.         ret
  12. .dblclick:
  13.         ; Передать управление предыдущему обработчику
  14.         invoke  CallWindowProc,[OldProc],[hEdit],[uMsg],[wParam],[lParam]
  15.  
  16.         ; Получить информацию о ближайшем символе, рядом с которым
  17.         ; произошло событие двойного клика
  18.         ; В lParam находятся координаты произошедшего события
  19.         invoke  SendMessage,[hEdit],EM_CHARFROMPOS,0,[lParam]
  20.         ; Сохранить для сравнения
  21.         mov     ebx,eax
  22.  
  23.         ; Получить длину текста в поле ввода
  24.         invoke  GetWindowTextLength,[hEdit]
  25.         ; Событие произошло за границами содержимого?
  26.         cmp     eax,ebx
  27.         jne     @f
  28.         ; Выделить весь текест в поле ввода
  29.         invoke  SendMessage,[hEdit],EM_SETSEL,0,eax
  30. @@:
  31.         ret
  32. endp
При поступлении в обработчик события WM_LBUTTONDBLCLK, получаем координаты, где оно произошло. Затем с помощью EM_CHARFROMPOS узнаем позицию ближайшего символа строки, рядом с которым произошло событие. Если эта позиция равна длине строки, то выделяем весь текст в поле ввода при помощи EM_SETSEL. Все очень просто.

Читать статью целиком »
Просмотров: 494 | Комментариев: 2

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.17 сек. / MySQL: 1 (0.0249 сек.) / Память: 4.5 Mb
Наверх