
Быстрый поиск
Введите фрагмент названия статьи для поиска
Обработка Drag'n'Drop в разные поля ввода
28.03.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
В статье об обработке перетаскивания файлов я упомянул про раздельную обработку перетаскивания файлов в разные поля. В частности про вариант с субклассированием. Теперь расскажу, как это делается. Предположим, что у нас на форме есть три поля для выбора файла, причем каждое должно работать независимо.Code (Assembler) : Убрать нумерацию
- ; Разрешить каждому полю принимать файлы
- invoke GetDlgItem,[hwnddlg],ID_FILE1
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
- invoke GetDlgItem,[hwnddlg],ID_FILE2
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
- invoke GetDlgItem,[hwnddlg],ID_FILE3
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
Читать статью целиком »
Просмотров: 846 | Комментариев: 3
MessageBox с чекбоксом "Больше не показывать"
04.10.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще одна хорошая практика взаимодействия с пользователем - окно сообщения с чекбоксом "Больше не показывать это диалоговое окно". Таким образом и приложение выполняет свою работу по уведомлению пользователя о каком-то периодическом событии, и пользователь сам решает, желает ли он наблюдать это уведомление в дальнейшем. Делается это при помощи стандартной функции SHMessageBoxCheck. По параметрам эта функция очень похожа на вызов MessageBox, но поддерживает ограниченное количество стилей и не весь набор кнопок, а также обязательно требует текстовую строку с уникальным идентификатором этого сообщения. В остальном все сводится к единственному вызову, типа такого:Code (Assembler) : Убрать нумерацию
- ; Уникальный идентификатор окна сообщения
- szUID db '{D9108BA3-9A61-4398-BFBC-B02102C77E8A}',0
- ...
- ; Значение по умолчанию
- DEFAULT_RESULT = 0
- ; Вывести окно сообщения с галочкой "Больше не показывать"
- invoke SHMessageBoxCheck,HWND_DESKTOP,\
- szMess,szTitle,MB_YESNO+MB_ICONEXCLAMATION,\
- DEFAULT_RESULT,szUID
- ; EAX = выбранная кнопка или DEFAULT_RESULT
Читать статью целиком »
Просмотров: 1297 | Комментариев: 6
Работа с кнопкой Help в заголовке окна
28.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
Code (Assembler) : Убрать нумерацию
- struct HELPINFO
- cbSize dd ?
- iContextType dd ?
- iCtrlId dd ?
- hItemHandle dd ?
- dwContextId dd ?
- MousePos POINT
- ends
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Назначить контекстный идентификатор справки элементу окна
- invoke GetDlgItem,[hwnddlg],ID_BUTTON_1
- invoke SetWindowContextHelpId,eax,777
Читать статью целиком »
Просмотров: 1345 | Комментариев: 4
MessageBox с таймером обратного отсчета
31.01.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

MessageBox с таймером обратного отсчета
Наверняка вы сталкивались с диалоговыми окнами и окнами сообщений, в которых какое-то действие может быть выполнено только после истечения некоторого времени или которые сами продолжат работу через какой-то интервал. Это, например, могут быть инсталляторы, дающие пользователю возможность передумать, но начинающие установку обновлений через несколько секунд, если подтверждения от пользователя не было получено. Или уведомление о завершении какой-либо операции, которое пользователь прочитает и закроет, если в данный момент он находится у монитора. То есть в таких ситуациях, когда и пользователя надо о чем-то поставить в известность, но при этом обязательной ответной реакции от него ждать не требуется, так как с большой вероятностью он сделает именно так же или у него вообще не будет других вариантов. Примерно такое же поведение используют триальные окна, когда кнопка "OK" блокируется и вам приходится какое-то время наблюдать предложение метнуться в кассу.
Читать статью целиком »
Просмотров: 2397 | Комментариев: 6
Подгонка размеров поля EDIT под используемый шрифт
07.12.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Много чего уже делали и с полями ввода, и со шрифтами. На очереди автоматическая подгонка высоты однострочного элемента EDIT в зависимости от размеров шрифта, который ему назначен. Это необходимо, чтобы при изменении шрифта текст в поле ввода смотрелся правильно. Высота EDIT считается по высоте выбранного шрифта плюс отступ толщиной в двойную рамку, чтобы текст при отображении эту рамку не перекрывал. В случае многострочных полей ввода высоту надо считать по высоте шрифта, умноженной на необходимое количество строк, плюс отступ.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------
- ; Подгонка размера поля EDIT под заданный шрифт
- ;-------------------------------------------------------------
- ; Параметры:
- ; hEdit - хэндл поля EDIT
- ; hFont - хэндл шрифта
- ;-------------------------------------------------------------
- proc resize_edit hEdit:DWORD, hFont:DWORD
- locals
- rc RECT
- tm TEXTMETRIC
- endl
- pusha
- mov edi,[hEdit]
- ; Получить контекст устройства
- invoke GetDC,edi
- or eax,eax
- ; Поля ввода не существует, на выход
- jz .loc_exit
- xchg eax,esi
- ; Выбрать шрифт
- invoke SelectObject,esi,[hFont]
- or eax,eax
- jnz @f
- ; Шрифт не загружен, на выход
- invoke ReleaseDC,edi,esi
- jmp .loc_exit
- @@:
- ; Получить метрику выбранного шрифта
- lea ebx,[tm]
- invoke GetTextMetrics,esi,ebx
- invoke ReleaseDC,edi,esi
- ; Высота шрифта
- mov ebx,[ebx+TEXTMETRIC.tmHeight]
- ; Добавить к высоте размер рамки
- invoke GetSystemMetrics,SM_CYEDGE
- shl eax,2
- add ebx,eax
- ; Получить размеры поля EDIT
- lea esi,[rc]
- invoke GetWindowRect,edi,esi
- invoke GetParent,edi
- ; Отмасштабировать координаты окна
- invoke MapWindowPoints,HWND_DESKTOP,eax,esi,2
- ; Установить новые размеры поля EDIT
- mov eax,[esi+RECT.right]
- sub eax,[esi+RECT.left]
- invoke MoveWindow,edi,[esi+RECT.left],[esi+RECT.top],eax,ebx,TRUE
- .loc_exit:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 1383 | Комментариев: 1


