Blog. Just Blog

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

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

Окно поверх всех окон (Always On Top)

03.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Установка окна поверх всех других окон бывает удобна, когда надо привлечь внимание пользователя к важной информации, или окно с какими-либо данными должно находиться всегда перед глазами. Такое свойство окна можно прописать сразу в ресурсах, а можно изменять динамически, например при нажатии на кнопку-чекбокс "Always on top" или при изменении каких-нибудь внутренних настроек вашей программы.

Для создания окна поверх всех других окон, оно должно быть описано в ресурсах с флагом DS_SYSMODAL. Для динамического изменения используется функция SetWindowPos с флагами SWP_NOMOVE и SWP_NOSIZE. Флаги нужны для того, чтобы не изменять размеры и положение окна.
  1. ; Идентификатор чекбокса в ресурсах
  2. ID_ONTOP        = 101
  3.  
  4. ; Сегмент кода
  5. section '.code' code readable executable
  6.         ...
  7. ; Процедура обработчика окна
  8. proc DialogProc hwnddlg,msg,wparam,lparam
  9.         ; Обработка нажатия на кнопку-чекбокс
  10.         cmp     [wparam],BN_CLICKED shl 16 + ID_ONTOP
  11.         je      .ontop
  12.         ...
  13. .ontop:
  14.         ; Получить состояние чекбокса
  15.         invoke  IsDlgButtonChecked,[hwnddlg],ID_ONTOP
  16.         cmp     eax,BST_CHECKED
  17.         ; По умолчанию будем считать что галочка поставлена
  18.         mov     eax,HWND_TOPMOST
  19.         je      @f
  20.         ; Галочка не поставлена, убрать атрибут "поверх всех окон"
  21.         mov     eax,HWND_NOTOPMOST
  22. @@:
  23.         ; Установить параметр окна "поверх всех окон", изменение размера
  24.         ; и положения окна не производится, это установлено флагами
  25.         invoke  SetWindowPos,[hwnddlg],eax,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE
  26.         jmp     .processed
  27.         ...
  28.  
  29. ; Секция ресурсов
  30. section '.rsrc' resource data readable
  31. ; Диалог описан со стилем DS_SYSMODAL - поверх всех окон
  32. dialog demonstration, 'Always on top Demo', 0, 0, 190, 55,\
  33.         WS_CAPTION+WS_SYSMENU+DS_CENTER+DS_SYSMODAL
  34.         ...
  35.         ; Кнопка-чекбокс, которая будет управлять положением окна
  36.         dialogitem 'BUTTON','Always on top', ID_ONTOP, 5, 150, 63, 13,\
  37.         WS_VISIBLE+BS_AUTOCHECKBOX+BS_FLAT
  38.         ...
В приведенном примере при поставленной галочке "Always on top" окно будет находиться поверх других окон. Исходник с откомпилированным файлом прилагается.

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

Расчет хеша MD5 на Ассемблере

23.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция расчета хеша MD5 на Ассемблере. Готовых решений на FASM как всегда не было, пришлось портировать из MASM. Для работы процедуры в сегменте .data надо подготовить следующие данные:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. ; Шаблоны функции wsprintf для перевода хеша в строковый вид,
  5. ; при необходимости можно оставить только какой-нибудь один
  6. szMD5Format1 db '%.8X%.8X%.8X%.8X',0  ; Для получения заглавных букв
  7. szMD5Format2 db '%.8x%.8x%.8x%.8x',0  ; Для маленьких букв в строке хеша
  8.  
  9. stMD5Result:
  10.   stdtA      dd ?   ; Переменные для получения и хранения
  11.   stdtB      dd ?   ; результата хеширования
  12.   stdtC      dd ?
  13.   stdtD      dd ?
  14.  
  15. stMD5Hash    rb 33  ; Буфер для строки хеша в формате ASCIIZ
А вот собственно сама процедура хеширования и пример использования:

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

Создание выпадающего списка (Combobox)

13.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.
  1. ; Идентификатор списка в ресурсах 
  2. ID_LIST        = 104
  3.  
  4. ; Сегмент данных
  5. section '.data' data readable writeable 
  6.  
  7. ; Элементы списка в формате ASCIIZ
  8. items   db 'item 0',0
  9.         db 'item 1',0
  10.         db 'item 2',0
  11.         db 'item 3',0
  12.         db 0           ; Признак окончания списка
  13.  
  14. CtrlID  dd ?           ; Хэндл списка
  15.  
  16. ; Сегмент кода
  17. section '.code' code readable executable
  18.         ...
  19. ; Процедура обработчика окна
  20. proc DialogProc hwnddlg,msg,wparam,lparam 
  21.         ...
  22.         ; Инициализация окна?
  23.         cmp     [msg], WM_INITDIALOG
  24.         je      wminitdialog 
  25.         ...
  26. wminitdialog:
  27.         ...
  28.         ; Заполнение списка строками
  29.         invoke  GetDlgItem,[hwnddlg],ID_LIST
  30.         mov     [CtrlID],eax
  31.         mov     esi,items    ; Указатель на список элементов
  32. fill_list:
  33.         invoke  lstrlen,esi  ; Длина строки
  34.         or      eax,eax
  35.         jz      fill_end
  36.         push    eax
  37.         ; Добавить строку в список
  38.         invoke  SendMessage, [CtrlID], CB_ADDSTRING, 0, esi
  39.         pop     eax
  40.         add     esi,eax      ; Следующий элемент списка
  41.         inc     esi
  42.         jmp     fill_list
  43. fill_end:
  44.         ; Установить пункт ID=2 дефолтным, нумерация ID начинается с 0
  45.         ; По умолчанию дефолтный первый пункт с ID=0
  46.         invoke  SendMessage, [CtrlID], CB_SETCURSEL, 2, FALSE
  47.         ...
  48.  
  49. ; Секция ресурсов
  50. section '.rsrc' resource data readable
  51.         ...
  52.         ; Определение выпадающего списка в ресурсах
  53.         ; 200 - максимальный вертикальный размер раскрываемой области списка,
  54.         ; высота самого элемента расчитывается автоматически и в ресурсах
  55.         ; изменить ее невозможно
  56.         dialogitem 'COMBOBOX', '', ID_LIST, 2, 10, 150, 200,\
  57.         WS_VISIBLE+CBS_DROPDOWNLIST+CBS_HASSTRINGS+WS_VSCROLL
  58.         ...
Более подробное описание флагов и стилей списка читайте на Microsoft Developer Network. Через сообщение CB_ADDSTRING можно в любое время динамически добавлять новые элементы к уже созданному списку, а через CB_SETCURSEL менять текущий выбранный элемент. Это удобно использовать при создании нескольких взаимосвязанных списков. Все добавляемые строки списка должны быть в формате ASCIIZ.

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

Преобразование строки в число

10.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:
  1. ;----------------------------------------------------------
  2. ; На входе: указатель на строку
  3. ; На выходе: EAX = число или 0 если не получилось
  4. ;----------------------------------------------------------
  5. proc    str2dec lpStr:dword
  6.         push    ebx edx esi
  7.  
  8.         xor     eax,eax
  9.         mov     esi,[lpStr]
  10. .str2dec_loop:
  11.         movsx   ebx,byte [esi]
  12.         sub     bl,'0'
  13.         ; Для системы счисления с другим основанием замените следующую
  14.         ; строчку на cmp bl,основание_системы
  15.         cmp     bl,10
  16.         jnb     .str2dec_ret
  17.         ; Для системы счисления с другим основанием замените следующую
  18.         ; строчку на imul eax,основание_системы
  19.         imul    eax,10
  20.         add     eax,ebx
  21.         inc     esi
  22.         jmp     .str2dec_loop
  23.  
  24. .str2dec_ret:
  25.         pop     esi edx ebx
  26.         ret
  27. endp
Вторая функция похожа, но обрабатывает шестнадцатеричные цифры:

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

Установка и настройка Flat Assembler (FASM)

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

Установка и настройка Flat Assembler (FASM)

Программирование на Ассемблере я начинал с Turbo Assembler (TASM) под MS-DOS, сейчас пишу на Flat Assembler (FASM) под Windows. Это очень удобный и мощный пакет для разработки, бесплатный для любого использования. Написан полностью на самом себе, исходники прилагаются. Мне он нравится тем, что позволяет хранить код и описания ресурсов в одном ASM-файле, поддерживает макросы, генерит чистый машинный код без всякой незаявленной самодеятельности, не требует лишней рутинной работы типа прописывания каждой задействованной функции в секцию импорта и еще множество приятных мелочей, облегчающих жизнь программисту. Единственным недостатком является отсутствие достаточного количества готовых исходников, например по сравнению с тем же MASM'ом, а портирование исходников с других платформ на FASM иногда вызывает затруднения. Но на мой взгляд портирование, в отличие от копирования, помогает гораздо лучше изучить язык. Несколько исходников-примеров есть в самом дистрибутиве FASM, еще несколько примеров можно скачать с офсайта или поискать в Интернете. Ответы на многие возникающие вопросы можно найти на официальном форуме FASM. Форум англоязычный, но на нем немало наших соотечественников. К новичкам на форуме относятся хорошо и отвечают даже на самые глупые вопросы.

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

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