Blog. Just Blog

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

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

Окно с возможностью клика сквозь него

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

Окно с возможностью клика сквозь него

Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.

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

Как программно свернуть все окна

04.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Есть разные способы программно свернуть все открытые окна. Простой и топорный вариант решения - эмуляция нажатия клавиш Win+M, которые и выполняют команду "Свернуть все окна". Делается это через последовательность вызовов keybd_event.
  1.         ; Эмуляция нажатия клавиш Win+M
  2.         invoke  keybd_event,VK_LWIN,0,0,NULL
  3.         invoke  Sleep,1
  4.         invoke  keybd_event,'M',0,0,NULL
  5.         invoke  Sleep,1
  6.         invoke  keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Для обратного действия надо сэмулировать нажатие комбинации Win+Shift+M:
  1.         ; Эмуляция нажатия клавиш Win+Shift+M
  2.         invoke  keybd_event,VK_LWIN,0,0,NULL
  3.         invoke  Sleep,1
  4.         invoke  keybd_event,VK_LSHIFT,0,0,NULL
  5.         invoke  Sleep,1
  6.         invoke  keybd_event,'M',0,0,NULL
  7.         invoke  Sleep,1
  8.         invoke  keybd_event,VK_LSHIFT,0,KEYEVENTF_KEYUP,NULL
  9.         invoke  Sleep,1
  10.         invoke  keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Таким же образом эмулируется нажатие комбинации Win+D - "Показать рабочий стол". Решение, в принципе, рабочее, но целиком полагаться на программную эмуляцию клавиатуры нельзя. Нажатие клавиш может перехватить или переопределить другое приложение, может быть заполнена системная очередь ввода, да мало ли чего.

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

Создание выпадающего списка (Combobox) с иконками

20.08.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я рассказывал, как сделать простой комбобокс. Сейчас давайте усовершенствуем его, а точнее дополним строки списка иконками. Я уже делал подобное с меню, тут принцип точно такой же. К стилям комбобокса в ресурсах добавляется CBS_OWNERDRAWFIXED, что в дальнейшем позволит нам самостоятельно обрабатывать процесс отрисовки каждой строки выпадающего списка. Теорию и принцип работы вы можете почитать по приведенной ссылке, повторяться я не буду. В обработчик окна, в котором находится комбобокс, добавляется реакция на два события - это WM_MEASUREITEM, которое приходит перед отрисовкой строки, и WM_DRAWITEM, при котором мы будем рисовать эту строку.
  1.         cmp     [msg],WM_MEASUREITEM
  2.         je      wm_measure
  3.         cmp     [msg],WM_DRAWITEM
  4.         je      wm_drawitem
Начнем с первого обработчика. Тут система в параметре lParam сообщения передает нам структуру MEASUREITEMSTRUCT, в которой сообщает нашей программе тип объекта, который она планирует нарисовать, а также его идентификаторы и размеры прямоугольника, который он будет занимать.
  1. wm_measure:
  2.         ; Отрисовываем строку комбобокса?
  3.         mov     ebx,[lparam]
  4.         cmp     [ebx+MEASUREITEMSTRUCT.CtlType],ODT_COMBOBOX
  5.         jne     processed
  6.  
  7.         ; Высота строки комбобокса с учетом размера иконки
  8.         mov     [ebx+MEASUREITEMSTRUCT.itemHeight],26
  9.  
  10.         jmp     processed
Проверяем, если это комбобокс, то меняем его высоту на фиксированные 26 пикселов. Ширина остается без изменений. Обратите внимание, что тут не проверяется идентификатор комбобокса CtlID, так как в нашем примере он один единственный. В реальных проектах, когда на форме может быть более одного выпадающего списка, такие проверки надо выполнять в обязательном порядке.

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

Ограничение изменения размеров окна

10.06.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Подавляющее большинство программ под Windows имеют окна, размер которых можно менять. Это хорошо и правильно, это основа концепции системы. Но в некоторых случаях надо сделать так, чтобы окно приложения нельзя было уменьшить дальше определенного размера, например, чтобы всегда была видна строка меню или чтобы гарантированно оставалось место для других элементов интерфейса. Также теоретически могут быть ограничения и на максимальный размер окна, хотя мне на ум не приходят ситуации, когда это нужно.

Ограничение изменения размера окна реализуется через обработку сообщения WM_SIZING, которое приходит главному окну при попытке изменить его размер путем перетаскивания границ или нажатия на кнопку разворачивания окна. В lparam сообщения передаются новые координаты окна, которые будут установлены после изменения его размера. Здесь можно проверить, не выходят ли они за допустимые границы и, в случае необходимости, скорректировать их до нужных значений.
  1. ; Обработчик сообщений окна
  2.         cmp     [msg],WM_SIZING
  3.         je      resize_window
  4. ...
  5. ...
  6. ...
  7. resize_window:
  8.         ; Минимальные и максимальные размеры окна
  9.         MAX_X = 400
  10.         MIN_X = 200
  11.  
  12.         MAX_Y = 250
  13.         MIN_Y = 80
  14.  
  15.         ; В регистре EDI указатель на структуру координат окна
  16.         mov     edi,[lparam]
  17.  
  18.         ; Проверить максимальную ширину
  19.         mov     edx,[edi+RECT.right]
  20.         sub     edx,[edi+RECT.left]
  21.         cmp     edx,MAX_X
  22.         jbe     @f
  23.         ; Установить максимальную ширину
  24.         mov     eax,[edi+RECT.left]
  25.         add     eax,MAX_X
  26.         mov     [edi+RECT.right],eax
  27. @@:
  28.         ; Проверить минимальную ширину
  29.         cmp     edx,MIN_X
  30.         jae     @f
  31.         ; Установить минимальную ширину
  32.         mov     eax,[edi+RECT.left]
  33.         add     eax,MIN_X
  34.         mov     [edi+RECT.right],eax
  35. @@:
  36.         ; Проверить максимальную высоту
  37.         mov     edx,[edi+RECT.bottom]
  38.         sub     edx,[edi+RECT.top]
  39.         cmp     edx,MAX_Y
  40.         jbe     @f
  41.         ; Установить максимальную высоту
  42.         mov     eax,[edi+RECT.top]
  43.         add     eax,MAX_Y
  44.         mov     [edi+RECT.bottom],eax
  45. @@:
  46.         ; Проверить минимальную высоту
  47.         cmp     edx,MIN_Y
  48.         jae     @f
  49.         ; Установить минимальную высоту
  50.         mov     eax,[edi+RECT.top]
  51.         add     eax,MIN_Y
  52.         mov     [edi+RECT.bottom],eax
  53. @@:
  54.         jmp     processed
Если нужно, то можно проверять, например, только изменение до минимального размера по ширине. В этом случае остальные проверки надо просто убрать.

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

Обработка перетаскивания ссылок в окно приложения

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

Обработка перетаскивания ссылок в окно приложения

С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.

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

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