Blog. Just Blog

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

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

Обработка нажатия на BUTTON разными кнопками мыши

03.01.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обычно элементы управления типа BUTTON в окне приложения реагируют только на обычное нажатие. При клике левой кнопкой мыши на кнопке или при нажатии на клавиатуре клавиши пробел, окну отправляется сообщение WM_COMMAND с параметром BN_CLICKED и идентификатором нажатой кнопки. На этом все. Но иногда надо сделать так, чтобы кнопки реагировали на клик не только левой кнопки мыши, а, например, правой кнопки или колесика. Этого можно добиться через субклассирование обработчика кнопки, ведь по сути она является самостоятельным окном. При инициализации основного окна повесим субклассированный обработчик на нужную нам кнопку:
  1.         ; Субклассировать кнопку
  2.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  3.         mov     ebx,eax
  4.         ; Установить наш собственный обработчик
  5.         invoke  SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
  6.         ; Сохранить хэндл предыдущего обработчика
  7.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
Еще нам понадобятся идентификатор сообщения, которое будет отправляться из обработчика родительскому окну и текстовые строчки, при помощи которых родительское окно будет реагировать на это сообщение.
  1. ; Пользовательское сообщение от обработчика кнопки
  2. WM_BUTTON_CLICK = WM_USER + 275
  3.  
  4. szMsg1  db     'Left mouse Button',0
  5. szMsg2  db     'Right mouse Button',0
  6. szMsg3  db     'Middle mouse Button',0
Общую структуру субклассированного обработчика я повторять здесь не буду, на сайте выложена уже не одна статья, где он используется. Но теперь нам надо определиться со списком сообщений, которые он должен обрабатывать. Обычная кнопка срабатывает от клавиатуры и от мышки, значит нам надо обрабатывать как минимум сообщения WM_KEYDOWN и WM_LBUTTONDOWN. А раз мы хотим отлавливать нажатия и других кнопок мыши, то к этому списку добавляются WM_MBUTTONDOWN и WM_RBUTTONDOWN.

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

Добавление пунктов в системное меню окна

05.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:
  1.         ; Получить хэндл системного меню окна
  2.         invoke  GetSystemMenu,[hwnddlg],0
  3.         mov     ebx,eax
  4.  
  5.         ; Добавить в меню полосу разделителя
  6.         invoke  InsertMenu,ebx,2,MF_BYPOSITION,0,0
  7.  
  8.         ; Идентификаторы сообщений при выборе пунктов меню
  9.         IDM_MENU1 = 101
  10.         IDM_MENU2 = 102
  11.  
  12.         ; Добавить свои пункты меню
  13.         invoke  InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
  14.         invoke  InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
  15.         ...
  16.         ...
  17. szMenu1 db 'About',0
  18. szMenu2 db 'Exit',0
В этом примере используется функция InsertMenu, так как нам надо просто добавить пункты в меню. Если планируется использование дополнительных спецэффектов, то эту функцию можно заменить на более современную InsertMenuItem.

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

Как менять цвета элементов диалогового окна на Ассемблере

03.12.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
По умолчанию цвета диалоговых окон и элементов управления в приложениях соответствуют установленной палитре Windows. Но иногда бывает необходимо выделить другим цветом какой-нибудь текст в диалоговом окне, или же вообще раскрасить все окно в нужный вам цвет. Это сделать очень легко, надо лишь знать порядок вывода на экран диалоговых окон и их содержимого. При отрисовке каждого элемента диалогового окна ему обязательно передается одно из следующих сообщений: WM_CTLCOLORDLG - отрисовка самого окна, WM_CTLCOLORBTN - отрисовка кнопок, WM_CTLCOLOREDIT - отрисовка полей редактирования, WM_CTLCOLORSTATIC - отрисовка статических элементов, WM_CTLCOLORLISTBOX - отрисовка комбобоксов и выпадающих списков, WM_CTLCOLORMSGBOX - вывод окна сообщений и WM_CTLCOLORSCROLLBAR - отрисовка полосы прокрутки. Обработчик для всех этих сообщений может быть один. Главное, чтобы на этапе инициализации окна был создан объект "кисть" с фоновым цветом главного окна. Именно это значение должен всегда возвращать обработчик сообщение изменения цвета. Предварительный каркас такого приложения выглядит примерно так:
  1. ; Обработчик диалогового окна
  2. proc DialogProc hwnddlg,msg,wparam,lparam
  3.         ...
  4.         ; Обработка сообщения инициализации окна
  5.         cmp     [msg],WM_INITDIALOG
  6.         je      wminitdialog
  7.  
  8.         ; Обработка всех сообщений, связанных с установкой цвета
  9.         cmp     [msg],WM_CTLCOLORDLG
  10.         je      color
  11.         cmp     [msg],WM_CTLCOLORBTN
  12.         je      color
  13.         cmp     [msg],WM_CTLCOLOREDIT
  14.         je      color
  15.         cmp     [msg],WM_CTLCOLORSTATIC
  16.         je      color
  17.         cmp     [msg],WM_CTLCOLORLISTBOX
  18.         je      color
  19.         cmp     [msg],WM_CTLCOLORMSGBOX
  20.         je      color
  21.         cmp     [msg],WM_CTLCOLORSCROLLBAR
  22.         je      color
  23.         ...
  24.  
  25.         ; Обработка инициализации окна
  26. wminitdialog:
  27.         ; Основной цвет фона окна в формате RGB
  28.         clrMain = 0012FFFFh
  29.         ; Создать объект фоновой кисти для всего окна
  30.         invoke  CreateSolidBrush,clrMain
  31.         mov     [hBrushBack], eax
  32.  
  33.         jmp     processed
В этом примере все обработчики заданы по максимуму, в вашем приложении можно оставить только необходимое, например, только обработку статических элементов. При написании обработчиков учтите следующие особенности: для read-only или отключенных элементов EDIT сообщение WM_CTLCOLOREDIT не посылается, вместо него посылается сообщение WM_CTLCOLORSTATIC. Цвет текста для кнопок BS_AUTOCHECKBOX и BS_AUTORADIOBUTTON применяется только к их тексту, а флажок кнопок закрашен системно-определенным цветом (обычно черным). Цвет текста для BS_GROUPBOX применяется только к тексту заголовка, но не к линии границы элемента. Также обратите внимание, что цвет задается значениями RGB в трех младших байтах DWORD, при этом оставшийся байт игнорируется.

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

Вертикальный скроллер на Ассемблере

04.10.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Я уже ранее приводил код горизонтального скроллера на Ассемблере, теперь пришло время вертикального скроллера. Такой эффект очень часто используется в различных кейгенах, окнах "О программе", демо-роликах, просмотрщиках текстовых файлов и подобных программах. Код основан на аналогичной процедуре от Av0id, я добавил в него несколько усовершенствований. Для настройки размеров и внешнего вида скроллера в сегменте данных определяются вспомогательные константы и структуры, не описанные в FASM:
  1. ; Настройки внешнего вида скроллера
  2. SCROLL_FONT_WIDTH  = 8          ; Ширина символов текста
  3. SCROLL_FONT_HEIGHT = 8          ; Высота символов текста
  4. SCROLL_WIDTH       = 430        ; Ширина окна скроллера
  5. SCROLL_HEIGHT      = 350        ; Высота окна скроллера
  6. SCROLL_BACKCOLOR   = 0808080h   ; Цвет фона
  7. SCROLL_TEXTCOLOR   = 000FFFFh   ; Цвет текста
  8. SCROLL_SHADOWCOLOR = 0          ; Цвет тени
  9. SCROLL_SLEEP       = 40         ; Скорость скроллирования
  10. SCROLL_SHADOW      = FALSE      ; Рисовать тень TRUE/FALSE  
  11.  
  12. ; Структуры для создания виртуального BMP-файла
  13. struct  RGBQUAD
  14.     rgbBlue      db ?
  15.     rgbGreen     db ?
  16.     rgbRed       db ?
  17.     rgbReserved  db ?
  18. ends
  19.  
  20. struct  BITMAPINFO
  21.     bmiHeader     BITMAPINFOHEADER
  22.     bmiColors     RGBQUAD
  23. ends
А также переменные и другие данные, необходимые для его работы:
  1. section '.data' data readable writeable
  2.  
  3. hThread         dd ?    ; Хэндл потока скроллера
  4. exit_flag       dd ?    ; Флаг завершения потока
  5. active_flag     dd ?    ; Флаг активности скроллера
  6.  
  7. szTerminalFont  db 'Terminal',0 ; Шрифт скроллера
  8.                 ; Файл с текстом скроллера
  9. szScrollerText  file 'scroller.txt'
  10.                 db 0
Если в скроллере используется псевдографика, то желательно оставить шрифт "Terminal", а если будет только текст, то можете выбрать любой другой системный шрифт, лишь бы он был установлен у пользователя на компьютере. Текст скроллера можно создавать в любом редакторе, поддерживающем псевдографику. При использовании рамок или рисунков из символов, они обязательно должны быть дополнены пробелами до правой границы текста. Ширина и высота символов задается в настройках, но имейте в виду, что размеры должны поддерживаться свойствами самого шрифта. Поэкспериментируйте.

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

Раскраска строк ListView на Ассемблере

23.07.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Элемент диалоговых окон ListView (или SysListView32) - очень удобный элемент, особенно для табличного отображения данных или ведения логов. При всем своем удобстве, у него есть недостаток, что при заполнении списка нельзя указывать цвета текста и фона для отдельных строк. Но способ раскрасить строки ListView все-таки есть. При отрисовке списка окну приложения посылается сообщение WM_NOTIFY, которое можно перехватить и самостоятельно обработать. В lParam сообщения передается указатель на структуру NMLVCUSTOMDRAW, в которой и описаны все подробности об отрисовываемой строке. Это составная структура и ее составляющие зависят от версии библиотеки Comctl32, но описываемый способ не сработает разве что на Windows 95, если вы его где-то откопаете. Однако компилятор FASM тоже ни сном, ни духом про структуру NMLVCUSTOMDRAW, придется сделать описание самостоятельно:
  1. ; Структура для обработки сообщений
  2. struct NMLVCUSTOMDRAW
  3.         ; NMHDR
  4.         hwndFrom        dd ?
  5.         idFrom          dd ?
  6.         code            dd ?
  7.  
  8.         ; NMCUSTOMDRAWINFO
  9.         dwDrawStage     dd ?
  10.         hdc             dd ?
  11.         left            dd ?
  12.         top             dd ?
  13.         right           dd ?
  14.         bottom          dd ?
  15.         dwItemSpec      dd ?
  16.         uItemState      dd ?
  17.         lItemlParam     dd ?
  18.  
  19.         ; NMLVCUSTOMDRAW
  20.         clrText         dd ?
  21.         clrTextBk       dd ?
  22. ends
Теперь разберем значения полей структуры. В hwndFrom должен быть хэндл списка ListView, в code - уведомление NM_CUSTOMDRAW. Если эти два условия выполняются, то требуется задействовать наш обработчик. А вот дальше есть важные особенности. Отрисовка строки выполняется в два этапа: сперва в dwDrawStage приходит уведомление CDDS_PREPAINT, на которое окно приложения должно ответить установкой статуса CDRF_NOTIFYITEMDRAW, то есть надо сообщить системе, что мы хотим самостоятельно внести коррективы в процесс отрисовки. В этом случае система посылает еще одно уведомление - CDDS_ITEMPREPAINT, и именно на этом втором этапе мы можем указать цвет фона и текста для строки. Цвет текста задается в clrText, а цвет фона - в clrTextBk. Весь этот процесс описан в MSDN, но как-то слишком разрозненно.

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

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