Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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
Если нужно, то можно проверять, например, только изменение до минимального размера по ширине. В этом случае остальные проверки надо просто убрать.

Более простой способ устанавливать ограничения на размер окна заключается в использовании обработчика сообщения WM_GETMINMAXINFO. В качестве lparam сообщения приходит указатель на структуру MINMAXINFO, в которой можно настроить минимальные и максимальные размеры окна. Никаких дополнительных проверок при этом делать не надо.
  1. ; Обработчик сообщений окна
  2.         cmp     [msg],WM_GETMINMAXINFO
  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 указатель на структуру MINMAXINFO
  16.         mov     edi,[lparam]
  17.  
  18.         mov     [edi+MINMAXINFO.ptMaxSize.x],MAX_X
  19.         mov     [edi+MINMAXINFO.ptMaxSize.y],MAX_Y
  20.         mov     [edi+MINMAXINFO.ptMaxTrackSize.x],MAX_X
  21.         mov     [edi+MINMAXINFO.ptMaxTrackSize.y],MAX_Y
  22.         mov     [edi+MINMAXINFO.ptMinTrackSize.x],MIN_X
  23.         mov     [edi+MINMAXINFO.ptMinTrackSize.y],MIN_Y
  24.  
  25.         jmp     processed
В приложении примеры программ с исходными текстами, которые создают окно с изменяемым размером. Размер окна можно изменить только до определенных размеров как по ширине, так и по высоте, обработка выполняется каждым из приведенных в статье способов.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Fixed.Size.Window.Demo.zip (4,044 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1966 | Комментариев: 2

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (16.06.2019 в 20:47):
Саныч, спасибо, дополнил.
Саныч (16.06.2019 в 20:31):
Можно проще - WM_GETMINMAXINFO

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.005 сек.) / Память: 4.5 Mb
Наверх