
Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Подсказки (tooltips) в диалоговых окнах
16.09.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один способ придать вашим программам профессиональный вид - использование всплывающих подсказок (tooltips), которые появляются при наведении курсора мыши на какой-нибудь элемент диалогового окна. Готовые примеры на FASM или слишком громоздкие, или недостаточно гибкие, поэтому пришлось придумывать что-то свое. Причем с самого начала поставил себе задачу сделать функции работы с подсказками как можно более универсальными, чтобы в дальнейшем их можно было легко использовать в других проектах.В сегменте данных определим все необходимые константы, переменные и структуры. Большая часть этих данных в FASM по умолчанию отсутствует, так что пришлось штудировать MSDN и другие источники и описывать их самостоятельно.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- hwndTip dd ? ; Хэндл окна подсказки
- TTipFlag dd ? ; Флаг активности подсказки
- ; Структура TRACKMOUSEEVENT не определена, сделаем это сами
- struct TRACKMOUSEEVENT
- cbSize dd ?
- dwFlags dd ?
- hwndTrack dd ?
- dwHoverTime dd ?
- ends
- ; Определяем нужные структуры
- tme TRACKMOUSEEVENT
- pt POINT
- ttip TOOLINFO
- trect RECT
- oldX dd ? ; Сохраненные координаты мыши
- oldY dd ?
- ; Определяем нужные константы
- TTM_TRACKACTIVATE = WM_USER + 17
- TTM_TRACKPOSITION = WM_USER + 18
- TTM_SETMAXTIPWIDTH = WM_USER + 24
- ; Сообщения окну подсказки
- TTF_SUBCLASS = 0x0010
- TTF_TRACK = 0x0020
- TTF_ABSOLUTE = 0x0080
- TTF_TRANSPARENT = 0x0100
- ; Сообщение обработчика мыши
- TME_LEAVE = 0x00000002
- ; Максимальная ширина всплывающей подсказки
- TOOLTIP_WIDTH = 200
- ; Предустановленное количество элементов в массиве подсказок
- TOOLTIPS_COUNT = 5
- ; Массив данных для всплывающих подсказок
- ; Формат массива:
- ; 1 DWORD - сохраненный адрес обработчика
- ; 2 DWORD - адрес подсказки
- tt_data rd (TOOLTIPS_COUNT*2)
Читать статью целиком »
Просмотров: 6005 | Комментариев: 10
Поле EDIT для ввода шестнадцатеричных цифр
23.08.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Поле для ввода только цифр организовать несложно, для этого достаточно просто прописать в ресурсах у нужного поля флаг ES_NUMBER. После этого с клавиатуры в это поле можно будет ввести только символ из интервала "0" - "9". Впрочем этот ничуть не мешает через Ctrl+C / Ctrl+V затолкать в него все что угодно, вплоть до непечатных бинарных данных. А как сделать поле, в которое можно вводить с клавиатуры только шестнадцатеричные цифры? Ведь там могут быть не только символы с десятичными цифрами, но и символы "A" - "F", которые также являются шестнадцатеричными цифрами. Это делается через субклассирование. Мы уже рассмотрели один пример субклассирования, превратив поле EDIT в гиперссылку, и там же определили алгоритм обработчика субклассированного элемента. Как и в прошлый раз, субклассирование должно выполняться на этапе инициализации диалогового окна.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- OldProc dd ? ; Адрес предыдущего обработчика
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Субклассирование на этапе инициализации окна
- invoke GetDlgItem,[hwnddlg],ID_HEX
- ; Установить наш собственный обработчик
- invoke SetWindowLong,eax,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- mov [OldProc],eax
- ...
Читать статью целиком »
Просмотров: 6595 | Комментариев: 9
Создание диалоговых окон с тенью
03.08.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем очередное украшательство для ваших программ, а именно тень от диалоговых окон. Обычная тень создается штатными средствами системы, но поддерживается только начиная с Windows XP. Для этого требуется, чтобы стиль окна включал в себя флаг CS_DROPSHADOW, и здесь есть одна тонкость: этот флаг нельзя прописать в ресурсах, а надо устанавливать при инициализации диалогового окна. В обработчике инициализации должен быть такой код:Code (Assembler) : Убрать нумерацию
- ...
- ; Определить константу CS_DROPSHADOW
- CS_DROPSHADOW = 00020000h
- ; Получить текущее значение стиля окна
- invoke GetWindowLong,[hwnddlg],GCL_STYLE
- ; Добавить к нему атрибут тень
- or eax,CS_DROPSHADOW
- ; Установить новый стиль окна
- invoke SetClassLong,[hwnddlg],GCL_STYLE,eax
- ...
Читать статью целиком »
Просмотров: 6977 | Комментариев: 1
Гиперссылки в диалоговых окнах на Ассемблере
11.07.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter

Гиперссылки в диалоговых окнах на Ассемблере
Создание текстовой гиперссылки в диалоговом окне, казалось бы, простая задача. Но дело в том, что в Windows по умолчанию нет элементов диалоговых окон, которые бы выполняли роль гиперссылки. Готовых решений на FASM тоже не нашлось, значит придется создавать такой элемент самостоятельно. Сперва определимся с задачами, что нам надо сделать. Должен получиться элемент диалогового окна в виде текста определенного цвета, при наведении на который курсор должен менять свою форму, а цвет изменяться на подсвеченный. При клике на такой элемент должна открываться заданная ссылка. Задачи ясны, начнем их решать. Сперва выберем элемент диалоговых окон из списка стандартных, который и будет использоваться в качестве гиперссылки. Сразу же приходит на ум STATIC. По умолчанию элемент класса STATIC полностью оправдывает свое название и не реагирует практически ни на какие сообщения. Чтобы STATIC принимал движение курсора и нажатия клавиш мышки, его надо описать в ресурсах с флагом стилей SS_NOTIFY.
Читать статью целиком »
Просмотров: 7210 | Комментариев: 6
Окна нестандартной формы на Ассемблере. Часть 2
24.06.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
В первой части статьи я рассказал как создавать окна нестандартной формы при помощи регионов. У этого способа есть один большой недостаток: создаваемые окна так или иначе состоят из четких геометрических форм. Но высший пилотаж - это окна в форме картинок, и сейчас я расскажу как они делаются. Сперва немного теоретических выкладок. В графическом файле формата BMP информация о картинке хранится в растровом виде, то есть каждый пиксел описан определенным цветом. Рекомендую внимательно прочитать документацию о формате BMP-файла, так как есть несколько важных моментов. Создание окна нестандартной формы на основе растровой картинки заключается в наложении изображения на диалоговое окно и удалении всех его регионов, в которых находятся точки определенного цвета. Этот цвет мы будем считать "прозрачным", потому что настоящую прозрачность обычный формат BMP не поддерживает. А удалять отдельные регионы мы уже умеем.Итак, берем нужную картинку и накладываем ее на какой-нибудь однородный цветной фон, причем цвет фона не должен присутствовать на основной картинке. Можно добавить надпись, но главное чтобы границы всех элементов композиции были четкими и не сливались с фоном. Получится примерно следующее:

Картинка для окна
Картинку надо сохранить в формате BMP, с глубиной цвета 8 бит. Это очень важно, так как в этом случае количество цветов в палитре не превышает 256, а каждая точка описывается ровно одним байтом. Поскольку картинка будет накладываться на диалоговое окно, то и хранить ее надо будет в ресурсах. Тут есть важная особенность: в ресурсах картинка хранится без 14-байтного заголовка BITMAPFILEHEADER и все смещения считаются сразу же от начала блока BITMAPINFOHEADER.
Читать статью целиком »
Просмотров: 7945 | Комментариев: 11


