
Быстрый поиск
Введите фрагмент названия статьи для поиска
Управление кнопками Minimize, Maximize, Help и Close в заголовке окна
15.04.2020 | Категория: Образ мышления: 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 регулируются манипуляциями со стилями окна:
Code (Assembler) : Убрать нумерацию
- .enable_min:
- ; Активировать кнопку Minimize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- or eax,WS_MINIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .disable_min:
- ; Отключить кнопку Minimize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- and eax,not WS_MINIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .enable_max:
- ; Активировать кнопку Maximize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- or eax,WS_MAXIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .disable_max:
- ; Отключить кнопку Maximize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- and eax,not WS_MAXIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Читать статью целиком »
Просмотров: 2205 | Комментариев: 0
Переключение окна в полноэкранный режим и обратно
14.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Смотрел тут очередную киношку на своем любимом плеере Light Alloy и впервые за много лет обратил внимание, как он переключается в полноэкранный режим, а затем обратно. Нет, про само переключение, естественно, я знал и использовал, просто внезапно захотелось сделать что-нибудь подобное для оконного приложения на не менее любимом Ассемблере.Вот обработчик переключения. Он будет двухпозиционный, то есть если окно уже находится в полноэкранном режиме, то вернет его к исходному виду, а иначе развернет на полный экран. Естественно, вы можете разделить его на два отдельных события или оставить только нужную часть, например, только переход в полноэкранный режим.
Code (Assembler) : Убрать нумерацию
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- ; EBX - текущий стиль окна
- mov ebx,eax
- test ebx,WS_OVERLAPPEDWINDOW
- jz .fullscreen_off
- .fullscreen_on:
- and ebx,not WS_OVERLAPPEDWINDOW
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,ebx
- invoke ShowWindow,[hwnddlg],SW_MAXIMIZE
- jmp .processed
- .fullscreen_off:
- or ebx,WS_OVERLAPPEDWINDOW
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,ebx
- invoke ShowWindow,[hwnddlg],SW_RESTORE
- jmp .processed
Читать статью целиком »
Просмотров: 1504 | Комментариев: 0
Способы отправки сообщений в Windows
09.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Способы отправки сообщений в Windows
Любой разработчик программ под Windows наверняка так или иначе сталкивался с отправкой сообщений через функции SendMessage и PostMessage. При всей кажущейся простоте, у этих функций есть свои особенности, про которые будет полезно узнать, особенно начинающим программистам.
Читать статью целиком »
Просмотров: 2624 | Комментариев: 7
Приложение с постоянно активным окном
17.03.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
В Windows, когда окно становится активным или наоборот теряет фокус, меняется его визуальный стиль. В зависимости от выбранной темы, меняется цвет кнопок в заголовке, увеличивается или уменьшается тень от окна, да и сам заголовок тоже меняет цвет. А можно ли сделать так, чтобы окно не меняло визуальный стиль? Можно. Реализуется это таким несложным трюком. Когда окну надо поменять визуальный стиль в зависимости от активности, ему отправляется сообщение WM_NCACTIVATE с соответствующим параметром. Значит в наше приложение надо добавить обработку этого сообщения.Code (Assembler) : Убрать нумерацию
- ; (Де)активировать заголовок окна?
- cmp [msg],WM_NCACTIVATE
- je .activate_window
- ...
- ...
- ...
- .activate_window:
- ; Деактивировать?
- cmp [wparam],FALSE
- jne @f
- ; Оставить заголовок активным
- mov [wparam],TRUE
- @@:
- ; Отправить сообщение дальше
- invoke DefWindowProc,[hwnddlg],[msg],[wparam],[lparam]
- jmp .processed
Конечно, возникает логичный вопрос зачем это вообще все надо? Например, ваше приложение создает виджет или тулбар в виде окна, которое должно постоянно находиться на экране. Так вот, для таких окон как раз желательно применить этот трюк, чтобы они выглядели всегда одинаково, неважно, активен виджет или нет.
Читать статью целиком »
Просмотров: 1225 | Комментариев: 0
Поле EDIT для ввода десятичных цифр
26.02.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как известно, если элементу диалогового окна типа EDIT установить флаг ES_NUMBER, то ввести в него можно будет только символы из интервала "0" - "9". Это в теории. На практике же в это поле через Ctrl+V или контекстное меню совершенно спокойно можно вставить любые данные, о чем даже написано в официальной документации. А еще в это поле нельзя ввести отрицательное число. Таким образом, практическая ценность ES_NUMBER приближается к нулю. Давайте учтем все эти недостатки и сделаем собственное, правильное поле EDIT для ввода десятичных цифр.Чтобы полностью контролировать ввод, надо будет воспользоваться субклассированием, заменив стандартную процедуру обработки на собственную. Это мы уже делали не раз, ничего нового тут нет.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- OldProc dd ? ; Адрес предыдущего обработчика
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Субклассирование на этапе инициализации окна
- invoke GetDlgItem,[hwnddlg],ID_SUB
- ; Установить наш собственный обработчик
- invoke SetWindowLong,eax,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- mov [OldProc],eax
- ...
Читать статью целиком »
Просмотров: 1434 | Комментариев: 13


