Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Ограничение изменения размеров окна
10.06.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Подавляющее большинство программ под Windows имеют окна, размер которых можно менять. Это хорошо и правильно, это основа концепции системы. Но в некоторых случаях надо сделать так, чтобы окно приложения нельзя было уменьшить дальше определенного размера, например, чтобы всегда была видна строка меню или чтобы гарантированно оставалось место для других элементов интерфейса. Также теоретически могут быть ограничения и на максимальный размер окна, хотя мне на ум не приходят ситуации, когда это нужно.Ограничение изменения размера окна реализуется через обработку сообщения WM_SIZING, которое приходит главному окну при попытке изменить его размер путем перетаскивания границ или нажатия на кнопку разворачивания окна. В lparam сообщения передаются новые координаты окна, которые будут установлены после изменения его размера. Здесь можно проверить, не выходят ли они за допустимые границы и, в случае необходимости, скорректировать их до нужных значений.
Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщений окна
- cmp [msg],WM_SIZING
- je resize_window
- ...
- ...
- ...
- resize_window:
- ; Минимальные и максимальные размеры окна
- MAX_X = 400
- MIN_X = 200
- MAX_Y = 250
- MIN_Y = 80
- ; В регистре EDI указатель на структуру координат окна
- mov edi,[lparam]
- ; Проверить максимальную ширину
- mov edx,[edi+RECT.right]
- sub edx,[edi+RECT.left]
- cmp edx,MAX_X
- jbe @f
- ; Установить максимальную ширину
- mov eax,[edi+RECT.left]
- add eax,MAX_X
- mov [edi+RECT.right],eax
- @@:
- ; Проверить минимальную ширину
- cmp edx,MIN_X
- jae @f
- ; Установить минимальную ширину
- mov eax,[edi+RECT.left]
- add eax,MIN_X
- mov [edi+RECT.right],eax
- @@:
- ; Проверить максимальную высоту
- mov edx,[edi+RECT.bottom]
- sub edx,[edi+RECT.top]
- cmp edx,MAX_Y
- jbe @f
- ; Установить максимальную высоту
- mov eax,[edi+RECT.top]
- add eax,MAX_Y
- mov [edi+RECT.bottom],eax
- @@:
- ; Проверить минимальную высоту
- cmp edx,MIN_Y
- jae @f
- ; Установить минимальную высоту
- mov eax,[edi+RECT.top]
- add eax,MIN_Y
- mov [edi+RECT.bottom],eax
- @@:
- jmp processed
Читать статью целиком »
Просмотров: 1815 | Комментариев: 2
Определение состояния подключения к сети на Ассемблере
13.05.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Определение состояния подключения к сети на Ассемблере
Вдогонку к недавней статье. Если вы разрабатываете приложение, которое должно работать с какими-то данными в интернете, всегда будет полезно знать, есть ли у компьютера подключение к сети и разрешен ли приложению выход в сеть. В этих ваших интернетах приводят несколько способов решения задачи, но, как и йогурты из рекламы, не все они одинаково полезны. Давайте разберемся, какие функции стоит использовать на практике, а какие нет.
Читать статью целиком »
Просмотров: 2333 | Комментариев: 7
Обработка перетаскивания ссылок в окно приложения
16.04.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обработка перетаскивания ссылок в окно приложения
С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.
Читать статью целиком »
Просмотров: 1709 | Комментариев: 0
Загрузка шрифтов из памяти на Ассемблере
19.03.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Загрузка шрифтов из памяти на Ассемблере
Хоть я и не сторонник всяких свистоперделок в интерфейсах, но некоторые элементы диалоговых окон выглядят лучше, если к ним применить какой-нибудь шрифт. И хорошо, если это будет стандартный шрифт, типа консольного, а как быть, если требуется использовать какой-нибудь особенный стиль? Никто не даст гарантию, что у пользователя в системе имеется этот шрифт. Принудительно устанавливать в систему шрифт, который нужен только вашему приложению, - это очень плохая практика. Сохранять файл со шрифтом на диск, даже во временный каталог, тоже так себе идея. К счастью, есть простой способ использовать шрифты вообще без установки, напрямую из памяти.
Читать статью целиком »
Просмотров: 2680 | Комментариев: 14
Как правильно запретить Windows переходить в спящий режим
12.03.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из предыдущих статей я описывал способ, как можно запретить Windows переходить в спящий режим. Там это было реализовано через имитацию активности пользователя. Способ действительно рабочий, но с точки зрения решения поставленной задачи не совсем корректный. Настало время исправить ситуацию. Итак, наиболее правильный способ запретить Windows переходить в спящий режим - это использование функции SetThreadExecutionState. В качестве параметра она принимает один или комбинацию из нескольких флагов:Code (Assembler) : Убрать нумерацию
- ES_CONTINUOUS = 0x80000000
- ES_DISPLAY_REQUIRED = 0x00000002
- ES_SYSTEM_REQUIRED = 0x00000001
- ES_AWAYMODE_REQUIRED = 0x00000040
Для разных задач использование SetThreadExecutionState может отличаться. Например, если ваше приложение должно оставаться активным только на время продолжительного выполнения какого-нибудь критического участка кода, то перед его началом надо зафиксировать состояние запрета перехода системы в спящий режим, а после окончания этот запрет снять.
Code (Assembler) : Убрать нумерацию
- ; Установить состояние постоянной активности системы и монитора
- invoke SetThreadExecutionState,ES_CONTINUOUS+ES_SYSTEM_REQUIRED+\
- ES_DISPLAY_REQUIRED
- ; Тут выполняется какой-то очень важный процесс, который
- ; нельзя прерывать
- ; Сбросить состояние постоянной активности
- invoke SetThreadExecutionState,ES_CONTINUOUS
Читать статью целиком »
Просмотров: 3117 | Комментариев: 4