Быстрый поиск
Введите фрагмент названия статьи для поиска
Окно поверх всех окон (Always On Top)
03.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Установка окна поверх всех других окон бывает удобна, когда надо привлечь внимание пользователя к важной информации, или окно с какими-либо данными должно находиться всегда перед глазами. Такое свойство окна можно прописать сразу в ресурсах, а можно изменять динамически, например при нажатии на кнопку-чекбокс "Always on top" или при изменении каких-нибудь внутренних настроек вашей программы.Для создания окна поверх всех других окон, оно должно быть описано в ресурсах с флагом DS_SYSMODAL. Для динамического изменения используется функция SetWindowPos с флагами SWP_NOMOVE и SWP_NOSIZE. Флаги нужны для того, чтобы не изменять размеры и положение окна.
Code (Assembler) : Убрать нумерацию
- ; Идентификатор чекбокса в ресурсах
- ID_ONTOP = 101
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ; Обработка нажатия на кнопку-чекбокс
- cmp [wparam],BN_CLICKED shl 16 + ID_ONTOP
- je .ontop
- ...
- .ontop:
- ; Получить состояние чекбокса
- invoke IsDlgButtonChecked,[hwnddlg],ID_ONTOP
- cmp eax,BST_CHECKED
- ; По умолчанию будем считать что галочка поставлена
- mov eax,HWND_TOPMOST
- je @f
- ; Галочка не поставлена, убрать атрибут "поверх всех окон"
- mov eax,HWND_NOTOPMOST
- @@:
- ; Установить параметр окна "поверх всех окон", изменение размера
- ; и положения окна не производится, это установлено флагами
- invoke SetWindowPos,[hwnddlg],eax,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE
- jmp .processed
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ; Диалог описан со стилем DS_SYSMODAL - поверх всех окон
- dialog demonstration, 'Always on top Demo', 0, 0, 190, 55,\
- WS_CAPTION+WS_SYSMENU+DS_CENTER+DS_SYSMODAL
- ...
- ; Кнопка-чекбокс, которая будет управлять положением окна
- dialogitem 'BUTTON','Always on top', ID_ONTOP, 5, 150, 63, 13,\
- WS_VISIBLE+BS_AUTOCHECKBOX+BS_FLAT
- ...
Читать статью целиком »
Просмотров: 11741 | Комментариев: 3
Создание выпадающего списка (Combobox)
13.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.Code (Assembler) : Убрать нумерацию
- ; Идентификатор списка в ресурсах
- ID_LIST = 104
- ; Сегмент данных
- section '.data' data readable writeable
- ; Элементы списка в формате ASCIIZ
- items db 'item 0',0
- db 'item 1',0
- db 'item 2',0
- db 'item 3',0
- db 0 ; Признак окончания списка
- CtrlID dd ? ; Хэндл списка
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна?
- cmp [msg], WM_INITDIALOG
- je wminitdialog
- ...
- wminitdialog:
- ...
- ; Заполнение списка строками
- invoke GetDlgItem,[hwnddlg],ID_LIST
- mov [CtrlID],eax
- mov esi,items ; Указатель на список элементов
- fill_list:
- invoke lstrlen,esi ; Длина строки
- or eax,eax
- jz fill_end
- push eax
- ; Добавить строку в список
- invoke SendMessage, [CtrlID], CB_ADDSTRING, 0, esi
- pop eax
- add esi,eax ; Следующий элемент списка
- inc esi
- jmp fill_list
- fill_end:
- ; Установить пункт ID=2 дефолтным, нумерация ID начинается с 0
- ; По умолчанию дефолтный первый пункт с ID=0
- invoke SendMessage, [CtrlID], CB_SETCURSEL, 2, FALSE
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ...
- ; Определение выпадающего списка в ресурсах
- ; 200 - максимальный вертикальный размер раскрываемой области списка,
- ; высота самого элемента расчитывается автоматически и в ресурсах
- ; изменить ее невозможно
- dialogitem 'COMBOBOX', '', ID_LIST, 2, 10, 150, 200,\
- WS_VISIBLE+CBS_DROPDOWNLIST+CBS_HASSTRINGS+WS_VSCROLL
- ...
Читать статью целиком »
Просмотров: 11797 | Комментариев: 3
Создание прозрачных окон в Windows
29.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один простой в реализации, но красивый эффект для ваших программ - прозрачные диалоговые окна. Для этого надо, чтобы диалоговое окно было прописано в ресурсах или создавалось с расширенным стилем WS_EX_LAYERED, а при его инициализации вызывалась функция SetLayeredWindowAttributes. Значение коэффициента прозрачности может быть от 0 (полностью прозрачное окно) до 255 (непрозрачное окно). Рекомендуется значение 240-245, при этом эффект прозрачности уже заметен, а содержимое окна еще легко читается и не сливается с перекрываемыми окнами. Этой же функцией можно динамически менять прозрачность уже созданного окна, например чтобы создать эффект его плавного появления или исчезновения.Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна?
- cmp [msg], WM_INITDIALOG
- je wminitdialog
- ; Закрытие окна?
- cmp [msg], WM_CLOSE
- je wmclose
- ...
- wminitdialog:
- ; Установить первоначальную прозрачность окна 245
- invoke SetLayeredWindowAttributes, [hwnddlg], 0, 245, LWA_ALPHA
- ...
- wmclose:
- ; Плавное исчезновение окна при его закрытии
- mov ecx,245
- fade_dialog:
- push ecx
- ; Установка нового атрибта прозрачности
- invoke SetLayeredWindowAttributes, [hwnddlg], 0, ecx, LWA_ALPHA
- ; Небольшая пауза
- invoke Sleep,2
- pop ecx
- loop fade_dialog
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ; Описание диалогового окна в ресурсах.
- ; В расширенных стилях должен быть прописан атрибут "WS_EX_LAYERED"
- dialog demo, 'Demo', 70, 70, 190, 175,\
- WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME,\
- WS_EX_LAYERED
- ...
Читать статью целиком »
Просмотров: 11115 | Комментариев: 4
Перетаскивание окна за любое место
13.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Перетаскивание окна за любое место, а не только за заголовок, реализуется очень просто, но смотрится очень эффектно. Тем более, что окно может быть вообще без заголовка. Для этого в обработчик окна надо добавить следующий код.Code (Assembler) : Убрать нумерацию
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ......
- ; Нажата левая кнопка мышки на окне?
- cmp [msg], WM_LBUTTONDOWN
- je drag_window
- ......
- drag_window:
- ; Освободить захват мыши окном в текущем потоке и
- ; восстановить обычную обработку ввода данных от мыши
- invoke ReleaseCapture
- ; Перенаправить сообщение передвижения мышью SC_MOVE на заголовок окна
- ; 61458 = SC_MOVE or HTCAPTION, в FASM по умолчанию не определено,
- ; поэтому сразу задается числовым значением
- invoke SendMessage,[hwnddlg],WM_SYSCOMMAND,61458,0
- ......
Читать статью целиком »
Просмотров: 7345 | Комментариев: 6