С Новым Годом! С Новым Годом!
Blog. Just Blog

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

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

Графический курсор (каретка) в поле EDIT

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

Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
  1.         ; Загрузить из ресурсов картинку
  2.         invoke  GetModuleHandle,0
  3.         invoke  LoadBitmap,eax,1
  4.         mov     [hСaret],eax
  5.  
  6.         ; Выбрать картинку для холста поля ввода
  7.         invoke  GetDlgItem,[hwnddlg],ID_EDIT
  8.         invoke  GetDC,eax
  9.         mov     [hDC],eax
  10.         invoke  CreateCompatibleDC,[hDC]
  11.         mov     [hСaretDC],eax
  12.         invoke  SelectObject,[hСaretDC],[hСaret]
  13.  
  14.         ; Получить цвет угловой точки картинки
  15.         invoke  GetPixel,[hСaretDC],0,0
  16.         mov     [bColor],eax
  17.         ; Создать кисть с этим цветом
  18.         invoke  CreateSolidBrush,[bColor]
  19.         mov     [hBrush],eax
  20.  
  21.         ; Прибраться за собой
  22.         invoke  DeleteObject,[hСaret]
Для простоты реализации рисунок текстового курсора будет храниться в ресурсах. Загружаем его стандартными функциями, затем получаем холст поля ввода и добавляем к нему загруженный рисунок. Теоретически рисунок каретки может быть любого размера, но практически он должен хотя бы по вертикали соответствовать высоте поля ввода, а лучше высоте шрифта.

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

Работа с кнопкой Help в заголовке окна

28.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.

Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
  1. struct HELPINFO
  2.         cbSize       dd ?
  3.         iContextType dd ?
  4.         iCtrlId      dd ?
  5.         hItemHandle  dd ?
  6.         dwContextId  dd ?
  7.         MousePos     POINT
  8. ends
Суть контекстной справки заключается в том, чтобы при выборе пользователем какого-либо элемента диалогового окна, ему была предоставлена информация именно по этому элементу. Для персонализации справки можно назначить конкретному элементу окна контекстный идентификатор справки при помощи функции SetWindowContextHelpId. Это один из вариантов, с помощью которого в дальнейшем можно будет персонализировать справку.
  1. .wminitdialog:
  2.         ; Назначить контекстный идентификатор справки элементу окна
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON_1
  4.         invoke  SetWindowContextHelpId,eax,777
При нажатии кнопки справки в заголовке окна и выборе какого-нибудь элемента диалогового окна, родительскому окну отправляется сообщение WM_HELP, которое мы должны обработать.

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

Системные генераторы случайных чисел

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

Системные генераторы случайных чисел

На сайте уже выложено несколько различных алгоритмов генераторов псевдослучайных чисел. Какие-то генераторы лучше, какие-то похуже. Но когда надо сгенерировать всего пару-тройку чисел или результаты генерации не используются в критических участках кода, можно воспользоваться системными источниками псевдослучайных чисел.

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

Генератор xoshiro128 на Ассемблере

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

Генератор xoshiro128 на Ассемблере

Семейство xoshiro (xoroshiro) - это высокоскоростные и очень эффективные алгоритмы генерации псевдослучайных чисел общего назначения с хорошим распределением. Свое название генераторы получили от используемых в них операций XOR/Shift/Rotate. Разные варианты генераторов используют для рабочего буфера разные объемы памяти, а также реализованы как в 64-битной, так и в 32-битной версии. У меня тут будет 32-битный вариант xoshiro128 с периодом 2128.

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

Обработка изменения иконок в системном трее

19.06.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
С обновлением иконок в системном трее разобрались, теперь давайте разберем, как можно отслеживать изменения в трее. Причем изменения касаются не только добавления-удаления иконок, но также изменения всплывающих подсказок и изменения иконки с сохранением ее индекса.
  1. CLSCTX_LOCAL_SERVER = 0x04
  2. S_OK = 0
  3.  
  4. struct NOTIFYITEM
  5.     pszExeName   dd ?
  6.     pszTip       dd ?
  7.     hIcon        dd ?
  8.     hWnd         dd ?
  9.     dwPreference dd ?
  10.     uID          dd ?
  11.     guidItem     rd 4
  12. ends
  13.  
  14. ; GUID {D782CCBA-AFB0-43F1-94DB-FDA3779EACCB}
  15. IID_INotificationCB dd 0D782CCBAh
  16.                     dw 0AFB0h
  17.                     dw 043F1h
  18.                     db 094h, 0DBh, 0FDh, 0A3h, 077h, 09Eh, 0ACh, 0CBh
  19.  
  20. ; INotificationCB interface
  21. struct INotificationCB
  22.         QueryInterface dd ?
  23.         AddRef         dd ?
  24.         Release        dd ?
  25.         ; INotificationCB
  26.         Notify         dd ?
  27. ends
  28.  
  29. ; GUID {FB852B2C-6BAD-4605-9551-F15F87830935}
  30. IID_ITrayNotify dd 0FB852B2Ch
  31.                 dw 06BADh
  32.                 dw 04605h
  33.                 db 095h, 051h, 0F1h, 05Fh, 087h, 083h, 009h, 035h
  34.  
  35. ; ITrayNotify interface
  36. struct ITrayNotify
  37.         QueryInterface   dd ?
  38.         AddRef           dd ?
  39.         Release          dd ?
  40.         ; ITrayNotify
  41.         RegisterCallback dd ?
  42.         SetPreference    dd ?
  43.         EnableAutoTray   dd ?
  44. ends
  45.  
  46. ; GUID {25DEAD04-1EAC-4911-9E3A-AD0A4AB560FD}
  47. CLSID_TrayNotify dd 025DEAD04h
  48.                  dw 01EACh
  49.                  dw 04911h
  50.                  db 09Eh, 03Ah, 0ADh, 00Ah, 04Ah, 0B5h, 060h, 0FDh
  51.  
  52. ; GUID {00000000-0000-0000-C000-000000000046}
  53. IID_IUnknown dd 000000000h
  54.              dw 00000h
  55.              dw 00000h
  56.              db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Практически все, что тут используется, относится к недокументированным функциям Windows, поэтому внимательно смотрите примеры и описания. И да, работает оно только на современных системах, начиная с Windows Vista.

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

01 ... 24 25 26 27 28 29 30 ... 77
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.12 сек. / MySQL: 3 (0.0226 сек.) / Память: 4.5 Mb
Наверх