Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Ограничение изменения размеров окна

10.06.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Подавляющее большинство программ под Windows имеют окна, размер которых можно менять. Это хорошо и правильно, это основа концепции системы. Но в некоторых случаях надо сделать так, чтобы окно приложения нельзя было уменьшить дальше определенного размера, например, чтобы всегда была видна строка меню или чтобы гарантированно оставалось место для других элементов интерфейса. Также теоретически могут быть ограничения и на максимальный размер окна, хотя мне на ум не приходят ситуации, когда это нужно.

Ограничение изменения размера окна реализуется через обработку сообщения WM_SIZING, которое приходит главному окну при попытке изменить его размер путем перетаскивания границ или нажатия на кнопку разворачивания окна. В lparam сообщения передаются новые координаты окна, которые будут установлены после изменения его размера. Здесь можно проверить, не выходят ли они за допустимые границы и, в случае необходимости, скорректировать их до нужных значений.
  1. ; Обработчик сообщений окна
  2.         cmp     [msg],WM_SIZING
  3.         je      resize_window
  4. ...
  5. ...
  6. ...
  7. resize_window:
  8.         ; Минимальные и максимальные размеры окна
  9.         MAX_X = 400
  10.         MIN_X = 200
  11.  
  12.         MAX_Y = 250
  13.         MIN_Y = 80
  14.  
  15.         ; В регистре EDI указатель на структуру координат окна
  16.         mov     edi,[lparam]
  17.  
  18.         ; Проверить максимальную ширину
  19.         mov     edx,[edi+RECT.right]
  20.         sub     edx,[edi+RECT.left]
  21.         cmp     edx,MAX_X
  22.         jbe     @f
  23.         ; Установить максимальную ширину
  24.         mov     eax,[edi+RECT.left]
  25.         add     eax,MAX_X
  26.         mov     [edi+RECT.right],eax
  27. @@:
  28.         ; Проверить минимальную ширину
  29.         cmp     edx,MIN_X
  30.         jae     @f
  31.         ; Установить минимальную ширину
  32.         mov     eax,[edi+RECT.left]
  33.         add     eax,MIN_X
  34.         mov     [edi+RECT.right],eax
  35. @@:
  36.         ; Проверить максимальную высоту
  37.         mov     edx,[edi+RECT.bottom]
  38.         sub     edx,[edi+RECT.top]
  39.         cmp     edx,MAX_Y
  40.         jbe     @f
  41.         ; Установить максимальную высоту
  42.         mov     eax,[edi+RECT.top]
  43.         add     eax,MAX_Y
  44.         mov     [edi+RECT.bottom],eax
  45. @@:
  46.         ; Проверить минимальную высоту
  47.         cmp     edx,MIN_Y
  48.         jae     @f
  49.         ; Установить минимальную высоту
  50.         mov     eax,[edi+RECT.top]
  51.         add     eax,MIN_Y
  52.         mov     [edi+RECT.bottom],eax
  53. @@:
  54.         jmp     processed
Если нужно, то можно проверять, например, только изменение до минимального размера по ширине. В этом случае остальные проверки надо просто убрать.

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

Определение состояния подключения к сети на Ассемблере

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

Определение состояния подключения к сети на Ассемблере

Вдогонку к недавней статье. Если вы разрабатываете приложение, которое должно работать с какими-то данными в интернете, всегда будет полезно знать, есть ли у компьютера подключение к сети и разрешен ли приложению выход в сеть. В этих ваших интернетах приводят несколько способов решения задачи, но, как и йогурты из рекламы, не все они одинаково полезны. Давайте разберемся, какие функции стоит использовать на практике, а какие нет.

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

Обработка перетаскивания ссылок в окно приложения

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

Обработка перетаскивания ссылок в окно приложения

С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.

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

Загрузка шрифтов из памяти на Ассемблере

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

Загрузка шрифтов из памяти на Ассемблере

Хоть я и не сторонник всяких свистоперделок в интерфейсах, но некоторые элементы диалоговых окон выглядят лучше, если к ним применить какой-нибудь шрифт. И хорошо, если это будет стандартный шрифт, типа консольного, а как быть, если требуется использовать какой-нибудь особенный стиль? Никто не даст гарантию, что у пользователя в системе имеется этот шрифт. Принудительно устанавливать в систему шрифт, который нужен только вашему приложению, - это очень плохая практика. Сохранять файл со шрифтом на диск, даже во временный каталог, тоже так себе идея. К счастью, есть простой способ использовать шрифты вообще без установки, напрямую из памяти.

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

Как правильно запретить Windows переходить в спящий режим

12.03.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из предыдущих статей я описывал способ, как можно запретить Windows переходить в спящий режим. Там это было реализовано через имитацию активности пользователя. Способ действительно рабочий, но с точки зрения решения поставленной задачи не совсем корректный. Настало время исправить ситуацию. Итак, наиболее правильный способ запретить Windows переходить в спящий режим - это использование функции SetThreadExecutionState. В качестве параметра она принимает один или комбинацию из нескольких флагов:
  1. ES_CONTINUOUS        = 0x80000000
  2. ES_DISPLAY_REQUIRED  = 0x00000002
  3. ES_SYSTEM_REQUIRED   = 0x00000001
  4. ES_AWAYMODE_REQUIRED = 0x00000040
Значения флагов хорошо расписаны в MSDN. Так, ES_SYSTEM_REQUIRED не дает системе перейти в спящий режим. Флаг ES_DISPLAY_REQUIRED отвечает за активность дисплея. Это касается как блокировки запуска скринсейвера, так и подавления таймера отключения монитора при бездействии, если в нем есть такая функция. Флаг ES_AWAYMODE_REQUIRED в основном используется мультимедийными приложениями для выполнения своих фоновых задач, обычным приложениям он вряд ли потребуется. Флаг ES_CONTINUOUS фиксирует состояние активности системы до следующего вызова функции с этим флагом и комбинацией других флагов.

Для разных задач использование SetThreadExecutionState может отличаться. Например, если ваше приложение должно оставаться активным только на время продолжительного выполнения какого-нибудь критического участка кода, то перед его началом надо зафиксировать состояние запрета перехода системы в спящий режим, а после окончания этот запрет снять.
  1.         ; Установить состояние постоянной активности системы и монитора
  2.         invoke  SetThreadExecutionState,ES_CONTINUOUS+ES_SYSTEM_REQUIRED+\
  3.                 ES_DISPLAY_REQUIRED
  4.  
  5.         ; Тут выполняется какой-то очень важный процесс, который
  6.         ; нельзя прерывать
  7.  
  8.         ; Сбросить состояние постоянной активности
  9.         invoke  SetThreadExecutionState,ES_CONTINUOUS
Для снятия запрета надо вызвать функцию SetThreadExecutionState с единственным флагом ES_CONTINUOUS. Теперь система может спокойно запускать скринсейвер, переходить в спящий режим, понижать частоту процессора при простое и т.п.

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

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