Ограничение изменения размеров окна
Подавляющее большинство программ под 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
Более простой способ устанавливать ограничения на размер окна заключается в использовании обработчика сообщения WM_GETMINMAXINFO. В качестве lparam сообщения приходит указатель на структуру MINMAXINFO, в которой можно настроить минимальные и максимальные размеры окна. Никаких дополнительных проверок при этом делать не надо.
Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщений окна
- cmp [msg],WM_GETMINMAXINFO
- je resize_window
- ...
- ...
- ...
- resize_window:
- ; Минимальные и максимальные размеры окна
- MAX_X = 400
- MIN_X = 200
- MAX_Y = 250
- MIN_Y = 80
- ; В регистре EDI указатель на структуру MINMAXINFO
- mov edi,[lparam]
- mov [edi+MINMAXINFO.ptMaxSize.x],MAX_X
- mov [edi+MINMAXINFO.ptMaxSize.y],MAX_Y
- mov [edi+MINMAXINFO.ptMaxTrackSize.x],MAX_X
- mov [edi+MINMAXINFO.ptMaxTrackSize.y],MAX_Y
- mov [edi+MINMAXINFO.ptMinTrackSize.x],MIN_X
- mov [edi+MINMAXINFO.ptMinTrackSize.y],MIN_Y
- jmp processed
Просмотров: 1966 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(16.06.2019 в 20:47):
Саныч, спасибо, дополнил.
Саныч
(16.06.2019 в 20:31):
Можно проще - WM_GETMINMAXINFO
Добавить комментарий
Заполните форму для добавления комментария