Ограничение изменения размеров окна
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