Blog. Just Blog

Управление кнопками Minimize, Maximize, Help и Close в заголовке окна

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная развлекуха на Ассемблере. Сегодня мы будем всячески управлять стандартными кнопками в заголовке окна. Это могут быть Minimize, Maximize, Help и Close, для каждой из них свои правила. Для начала, чтобы в заголовке окна появились кнопки, оно должно быть создано со стилями WS_CAPTION и WS_SYSMENU, этого достаточно, чтобы появилась кнопка Close. Кнопки Minimize и Maximize появляются при добавлении в стили окна хотя бы одного значения WS_MAXIMIZEBOX или WS_MINIMIZEBOX, причем они неразрывны как Ленин и Партия, в любом случае появятся обе, а комбинацией стилей только регулируется их активность. Для появления кнопки Help в расширенном стиле окна должно присутствовать значение WS_EX_CONTEXTHELP, причем кнопки Minimize/Maximize и кнопка Help взаимоисключающие, одновременно в заголовке окна они присутствовать не могут. Почему так сделано - непонятно.

С теорией закончили, переходим к практике. В различных ситуациях может понадобиться отключение или включение определенных кнопок в заголовке окна. Как несложно догадаться, состояния кнопок Minimize, Maximize и Help регулируются манипуляциями со стилями окна:
  1. .enable_min:
  2.         ; Активировать кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_min:
  2.         ; Отключить кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .enable_max:
  2.         ; Активировать кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_max:
  2.         ; Отключить кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
Если уж делать совсем все правильно, то было бы неплохо при активации одной из кнопок Minimize или Maximize на всякий случай удалять из расширенного стиля окна взаимоисключающее значение WS_EX_CONTEXTHELP. Также имейте в виду, что при одновременном отключении обеих кнопок, они просто исчезнут.

При активации кнопки Help надо обязательно позаботиться, чтобы в заголовке окна не было вышеуказанных кнопок Minimize и Maximize.
  1. .enable_help:
  2.         ; Активировать кнопку Help
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not (WS_MAXIMIZEBOX or WS_MINIMIZEBOX)
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  6.         invoke  GetWindowLong,[hwnddlg],GWL_EXSTYLE
  7.         or      eax,WS_EX_CONTEXTHELP
  8.         invoke  SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
  1. .disable_help:
  2.         ; Отключить кнопку Help
  3.         invoke  GetWindowLong,[hwnddlg],GWL_EXSTYLE
  4.         and     eax,not WS_EX_CONTEXTHELP
  5.         invoke  SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
А вот для управления кнопкой Close используется очень сильное колдунство. Чтобы его понять, надо вернуться к самым первым версиям Windows. Тогда для закрытия окон использовалось специальная кнопка, которая относилась к системному меню. Поэтому корректно активировать и деактивировать ее можно только через системное меню окна, обращаясь к соответствующему пункту. Любые другие способы отключения кнопки Close, в том числе манипуляции со стилем окна CS_NOCLOSE, некорректны.
  1. .enable_close:
  2.         ; Активировать кнопку Close
  3.         invoke  GetSystemMenu,[hwnddlg],FALSE
  4.         invoke  EnableMenuItem,eax,SC_CLOSE,MF_BYCOMMAND or MF_ENABLED
  1. .disable_close:
  2.         ; Отключить кнопку Close
  3.         invoke  GetSystemMenu,[hwnddlg],FALSE
  4.         invoke  EnableMenuItem,eax,SC_CLOSE,\
  5.                 MF_BYCOMMAND or MF_DISABLED or MF_GRAYED
В приложении пример программы с исходным текстом, которая поочередно активирует и деактивирует кнопки в заголовке своего окна.

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

Window.Buttons.Demo.zip (2,520 bytes)


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

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

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

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

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

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