Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Как узнать установленный в системе масштаб текста

10.04.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать установленный в системе масштаб текста

Технический прогресс неумолимо наступает, разрешение мониторов с каждым годом становится все больше. В результате пользователям приходится увеличивать масштаб, чтобы не ломать глаза разглядыванием микрошрифта. И если программа изначально написана под "стандартный" DPI=96, то при отображении на мониторе с бОльшим значением DPI некоторые элементы ее интерфейса скорее всего будут отображаться некорректно. Это приходится учитывать разработчикам при написании своих программ. По возможности я тоже начал обновлять свои утилиты, чтобы в них учитывался установленный в системе масштаб текста. Естественно, что для этого потребовались определенные инструменты.

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

Добавление элементов и задач в Jump List приложения

22.01.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter

Добавление элементов и задач в Jump List приложения

Функция "Jump List" - список быстрого перехода - впервые появилась в Windows 7. Она создана для облегчения поиска нужных опций и ускорения выполнения наиболее частых операций для выбранного приложения. Списки быстрого перехода появляются при нажатии правой кнопкой мыши на значке приложения в панели задач. Большинство функций для работы с панелью задач я уже давным-давно разобрал, а про Jump List совсем забыл. Срочно исправляю ситуацию.

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

Как сделать иконку на кнопке справа от текста

25.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
При помощи сообщение BM_SETIMAGE на кнопку можно добавить иконку, в обычном режиме она будет располагаться слева от надписи. Для одной из моих программ понадобилось разместить иконку на кнопке справа от надписи. Да, я в курсе про самостоятельную отрисовку кнопок, про субклассирование и прочие навороты, но хотелось обойтись малой кровью. Поразмыслив, я решил задачу с помощью расширенного стиля окна WS_EX_LAYOUTRTL, который применяется к отдельно взятой кнопке. По прямому назначению он используется для корректной отрисовки содержимого окна на арабском или других языках с направлением письма справа-налево. Как оказалось, для иконок это тоже неплохо работает.

Вот код для переключения иконки на положение справа. Подразумевается, что иконка уже ранее была установлена на кнопку при инициализации окна или при создании элемента управления.
  1.         ; Установить иконку справа от текста
  2.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  3.         mov     ebx,eax
  4.         ; Добавить стиль Right-to-Left
  5.         invoke  GetWindowLong,ebx,GWL_EXSTYLE
  6.         or      eax,WS_EX_LAYOUTRTL
  7.         invoke  SetWindowLong,ebx,GWL_EXSTYLE,eax
  8.         ; Обновить иконку
  9.         invoke  SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
  10.         invoke  SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Для возврата обычного положения иконки нужно убрать WS_EX_LAYOUTRTL из расширенного стиля кнопки.
  1.         ; Установить иконку слева от текста
  2.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  3.         mov     ebx,eax
  4.         ; Убрать стиль Right-to-Left
  5.         invoke  GetWindowLong,ebx,GWL_EXSTYLE
  6.         and     eax,not WS_EX_LAYOUTRTL
  7.         invoke  SetWindowLong,ebx,GWL_EXSTYLE,eax
  8.         ; Обновить иконку
  9.         invoke  SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
  10.         invoke  SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
После смены расширенного стиля надо обязательно обновить иконку на кнопке. Чтобы не заморачиваться с повторной загрузкой и не хранить данные, кому какая иконка назначена, достаточно получить хэндл имеющейся на кнопке иконки и тут же назначить его обратно.

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

Автовыделение текста в поле 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. Все очень просто.

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

Графический курсор (каретка) в поле EDIT

09.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня отдохнем от системы и немного поработаем с графикой, будем делать собственный графический курсор в поле EDIT. Какого-то необычайно полезного практического применения этому нет, просто симпатичное дополнение к интерфейсу, например, к окнам нестандартной формы. Ну а что, раз уж наворотили чудо-окна, почему бы не наворотить и чудо-курсор.

Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
  1.         ; Загрузить из ресурсов картинку
  2.         invoke  GetModuleHandle,0
  3.         invoke  LoadBitmap,eax,1
  4.         mov     [hСaret],eax
  5.  
  6.         ; Выбрать картинку для холста поля ввода
  7.         invoke  GetDlgItem,[hwnddlg],ID_EDIT
  8.         invoke  GetDC,eax
  9.         mov     [hDC],eax
  10.         invoke  CreateCompatibleDC,[hDC]
  11.         mov     [hСaretDC],eax
  12.         invoke  SelectObject,[hСaretDC],[hСaret]
  13.  
  14.         ; Получить цвет угловой точки картинки
  15.         invoke  GetPixel,[hСaretDC],0,0
  16.         mov     [bColor],eax
  17.         ; Создать кисть с этим цветом
  18.         invoke  CreateSolidBrush,[bColor]
  19.         mov     [hBrush],eax
  20.  
  21.         ; Прибраться за собой
  22.         invoke  DeleteObject,[hСaret]
Для простоты реализации рисунок текстового курсора будет храниться в ресурсах. Загружаем его стандартными функциями, затем получаем холст поля ввода и добавляем к нему загруженный рисунок. Теоретически рисунок каретки может быть любого размера, но практически он должен хотя бы по вертикали соответствовать высоте поля ввода, а лучше высоте шрифта.

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

prev 01 02 03 04 05 06
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0035 сек.) / Память: 4.5 Mb
Наверх