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

Как узнать установленный в системе масштаб текста
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, который применяется к отдельно взятой кнопке. По прямому назначению он используется для корректной отрисовки содержимого окна на арабском или других языках с направлением письма справа-налево. Как оказалось, для иконок это тоже неплохо работает.Вот код для переключения иконки на положение справа. Подразумевается, что иконка уже ранее была установлена на кнопку при инициализации окна или при создании элемента управления.
Code (Assembler) : Убрать нумерацию
- ; Установить иконку справа от текста
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- mov ebx,eax
- ; Добавить стиль Right-to-Left
- invoke GetWindowLong,ebx,GWL_EXSTYLE
- or eax,WS_EX_LAYOUTRTL
- invoke SetWindowLong,ebx,GWL_EXSTYLE,eax
- ; Обновить иконку
- invoke SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
- invoke SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Code (Assembler) : Убрать нумерацию
- ; Установить иконку слева от текста
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- mov ebx,eax
- ; Убрать стиль Right-to-Left
- invoke GetWindowLong,ebx,GWL_EXSTYLE
- and eax,not WS_EX_LAYOUTRTL
- invoke SetWindowLong,ebx,GWL_EXSTYLE,eax
- ; Обновить иконку
- invoke SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
- invoke SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Читать статью целиком »
Просмотров: 950 | Комментариев: 0

Автовыделение текста в поле 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
Читать статью целиком »
Просмотров: 648 | Комментариев: 2

Графический курсор (каретка) в поле EDIT
09.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня отдохнем от системы и немного поработаем с графикой, будем делать собственный графический курсор в поле EDIT. Какого-то необычайно полезного практического применения этому нет, просто симпатичное дополнение к интерфейсу, например, к окнам нестандартной формы. Ну а что, раз уж наворотили чудо-окна, почему бы не наворотить и чудо-курсор.Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
Code (Assembler) : Убрать нумерацию
- ; Загрузить из ресурсов картинку
- invoke GetModuleHandle,0
- invoke LoadBitmap,eax,1
- mov [hСaret],eax
- ; Выбрать картинку для холста поля ввода
- invoke GetDlgItem,[hwnddlg],ID_EDIT
- invoke GetDC,eax
- mov [hDC],eax
- invoke CreateCompatibleDC,[hDC]
- mov [hСaretDC],eax
- invoke SelectObject,[hСaretDC],[hСaret]
- ; Получить цвет угловой точки картинки
- invoke GetPixel,[hСaretDC],0,0
- mov [bColor],eax
- ; Создать кисть с этим цветом
- invoke CreateSolidBrush,[bColor]
- mov [hBrush],eax
- ; Прибраться за собой
- invoke DeleteObject,[hСaret]
Читать статью целиком »
Просмотров: 1793 | Комментариев: 7
