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

MessageBox с таймером обратного отсчета
31.01.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

MessageBox с таймером обратного отсчета
Наверняка вы сталкивались с диалоговыми окнами и окнами сообщений, в которых какое-то действие может быть выполнено только после истечения некоторого времени или которые сами продолжат работу через какой-то интервал. Это, например, могут быть инсталляторы, дающие пользователю возможность передумать, но начинающие установку обновлений через несколько секунд, если подтверждения от пользователя не было получено. Или уведомление о завершении какой-либо операции, которое пользователь прочитает и закроет, если в данный момент он находится у монитора. То есть в таких ситуациях, когда и пользователя надо о чем-то поставить в известность, но при этом обязательной ответной реакции от него ждать не требуется, так как с большой вероятностью он сделает именно так же или у него вообще не будет других вариантов. Примерно такое же поведение используют триальные окна, когда кнопка "OK" блокируется и вам приходится какое-то время наблюдать предложение метнуться в кассу.
Читать статью целиком »
Просмотров: 465 | Комментариев: 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
Читать статью целиком »
Просмотров: 210 | Комментариев: 0

Работа с контролом SysTabControl32 на Ассемблере
31.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с контролом SysTabControl32 на Ассемблере
Вкладки - очень удобное решение, когда в ограниченное пространство диалогового окна надо поместить большое количество элементов. Достаточно сгруппировать их по смыслу или функциям и предоставить пользователю возможность переключаться между группами. Делается это при помощи стандартного контрола SysTabControl32.
Читать статью целиком »
Просмотров: 420 | Комментариев: 3

Управление отображением программы на панели задач
07.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
При скрытии главного окна программы при помощи функции ShowWindow, программа также убирается с панели задач. Тут ничего сложного. А как сделать так, чтобы окно отображалось на экране, но при этом программа не отображалась на панели задач? В некоторых случаях это можно сделать определенной комбинацией стилей окна, например, добавив в расширенный стиль параметр WS_EX_TOOLWINDOW. Но это не всегда приемлемо, чаще всего стиль окна должен оставаться привычным, то есть с заголовком, иконкой, кнопками сворачивания и т.д. Значит нужны программные способы добавить или убрать программу с панели задач.Наиболее простой в реализации способ, который чаще всего рекомендуют использовать, основан на изменении родительского окна. Если у главного окна приложения нет родительского окна, то оно отображается на панели задач. Если в качестве родительского окна указан рабочий стол, то программа убирается из панели задач. На этапе инициализации окна ему присваивается нулевое значение в качестве хэндла родительского окна.
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Если окно уже имеет родителя, то сбросить значение
- invoke GetWindowLong,[hwnddlg],GWL_HWNDPARENT
- or eax,eax
- jz @f
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
- @@:
Code (Assembler) : Убрать нумерацию
- .taskbar_show:
- ; Добавить программу на панели задач
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
- ...
- .taskbar_hide:
- ; Убрать программу с панели задач
- invoke GetDesktopWindow
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,eax
- ...
Читать статью целиком »
Просмотров: 431 | Комментариев: 9

Как убрать прямоугольник фокуса с элемента BUTTON
04.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как убрать прямоугольник фокуса с элемента BUTTON
При получении фокуса элементами диалогового окна типа BUTTON, они выделяются прямоугольной пунктирной рамкой. К таким элементам относятся простые кнопки, чекбоксы или радиопереключатели. Это хорошо и правильно, так как является стандартным поведением системы. Но сегодня я расскажу, как избавиться от этой рамки при фокусировке. Зачем это нужно? Ну, например, если вы используете собственную стилизацию элементов управления диалогового окна и не хотите, чтобы система влияла на их отображение. Или же вам просто не нравятся пунктирные прямоугольники на элементах. Лично я как раз отношусь к этой категории :)
Читать статью целиком »
Просмотров: 454 | Комментариев: 4
