Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Выпадающий список (Combobox) с динамическим поиском

17.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем усовершенствовать элемент Combobox. Создавать его мы научились, красивыми иконками снабдили, теперь давайте добавим полнотекстовый поиск по списку и фильтрацию. Справедливости ради стоит отметить, что зачаточный вариант поиска в комбобоксе все-таки присутствует. Если ввести какую-нибудь строку, а затем открыть выпадающий список, то курсор будет установлен на первом найденном пункте списка, который начинается с введенной строки. Я же хочу сделать так, чтобы в списке оставались только те пункты, в которых присутствует введенная строка, причем не только в начале, а вообще. Например, если я введу "Jo", то в списке должны остаться как "John Smith", так и "Patrick Joel".

Изменения поля ввода будем отлавливать штатными средствами в обработчике комбобокса. Это должно быть уведомление CBN_EDITUPDATE. После этого сохраняем введенную строку в сухом прохладном месте, очищаем список, а затем заполняем его, но уже только теми пунктами, где присутствует введенная строка.
  1.         cmp     [msg],WM_COMMAND
  2.         je      wmcommand
  3.         ...
  4.         ...
  5. wmcommand:
  6.         cmp     [wparam], CBN_EDITUPDATE shl 16 + ID_LIST
  7.         je      combobox_filter
Тут я использовал обработчик главного окна, но никто не запрещает воспользоваться субклассированием, а то и вовсе нарисовать какой-нибудь универсальный модуль для работы с комбобоксами.

Читать статью целиком »
Просмотров: 838 | Комментариев: 0

Как защитить приложение от снятия скриншота

17.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как защитить приложение от снятия скриншота

Про ценность информации в современном цифровом мире можно рассказывать долго, но я этого делать не буду. Только хочу упомянуть такую безобидную на первый взгляд штуку, как скриншот экрана. "Алло, техподдержка, у меня тут программа что-то пишет непонятно" - "Пришлите скриншот". Тык в PrintScreen, вставить в письмо, отправить. Знакомая ситуация? А то, что в это время на экране может быть служебная или вовсе конфиденциальная информация, и куда она пойдет дальше, об этом мало кто думает. Если данные, отображаемые в окнах приложения, даже случайно не должны быть переданы не по назначению, то разработчикам софта стоит об этом позаботиться. На скриншоте как раз пример скриншота окна с защитой от скриншота (извините). Само окно есть, но его содержимое не отображается.

Читать статью целиком »
Просмотров: 2120 | Комментариев: 12

Управление кнопками 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 регулируются манипуляциями со стилями окна:
  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. Также имейте в виду, что при одновременном отключении обеих кнопок, они просто исчезнут.

Читать статью целиком »
Просмотров: 1328 | Комментариев: 0

Переключение окна в полноэкранный режим и обратно

14.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Смотрел тут очередную киношку на своем любимом плеере Light Alloy и впервые за много лет обратил внимание, как он переключается в полноэкранный режим, а затем обратно. Нет, про само переключение, естественно, я знал и использовал, просто внезапно захотелось сделать что-нибудь подобное для оконного приложения на не менее любимом Ассемблере.

Вот обработчик переключения. Он будет двухпозиционный, то есть если окно уже находится в полноэкранном режиме, то вернет его к исходному виду, а иначе развернет на полный экран. Естественно, вы можете разделить его на два отдельных события или оставить только нужную часть, например, только переход в полноэкранный режим.
  1.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  2.         ; EBX - текущий стиль окна
  3.         mov     ebx,eax
  4.         test    ebx,WS_OVERLAPPEDWINDOW
  5.         jz      .fullscreen_off
  6.  
  7. .fullscreen_on:
  8.         and     ebx,not WS_OVERLAPPEDWINDOW
  9.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,ebx
  10.         invoke  ShowWindow,[hwnddlg],SW_MAXIMIZE
  11.         jmp     .processed
  12.  
  13. .fullscreen_off:
  14.         or      ebx,WS_OVERLAPPEDWINDOW
  15.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,ebx
  16.         invoke  ShowWindow,[hwnddlg],SW_RESTORE
  17.         jmp     .processed
При наличии нескольких мониторов окно будет развернуто на том, где оно в текущий момент находится. За видимость панели задач переживать не надо. Когда система обнаружит приложение, которое переключилось в полноэкранный режим, то панель задач будет спрятана автоматически. Дополнительных операций для этого выполнять не надо.

Читать статью целиком »
Просмотров: 922 | Комментариев: 0

Способы отправки сообщений в Windows

09.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Способы отправки сообщений в Windows

Любой разработчик программ под Windows наверняка так или иначе сталкивался с отправкой сообщений через функции SendMessage и PostMessage. При всей кажущейся простоте, у этих функций есть свои особенности, про которые будет полезно узнать, особенно начинающим программистам.

Читать статью целиком »
Просмотров: 1451 | Комментариев: 7

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.13 сек. / MySQL: 3 (0.0561 сек.) / Память: 5 Mb
Наверх