|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Нестыковка в обработке сообщений
Всем привет
Есть графический компонент, изображающий круглую кнопку. Нужно добиться того, чтобы он реагировал на такие события, как: 1) нажатие левой кнопки мыши, 2) отпускание той же кнопки, 3) наведение и 4) снятие указателя. Код:
procedure DoMouseOver(var Msg: TWMMouse); message WM_MOUSEMOVE; procedure DoMouseLeft(var Msg: TWMMouse); message WM_MOUSELEAVE; procedure DoMouseDown(var Msg: TWMMouse); message WM_LBUTTONDOWN; procedure DoMouseUp(var Msg: TWMMouse); message WM_LBUTTONUP; В процедуре DoMouseLeft проверяется, находится ли указатель мыши в пределах окружности - контура кнопки: Код:
if ((sqrt(sqr(Width div 2 - Msg.XPos) + sqr(Height div 2 - Msg.YPos))) <= Width div 2) then {... указатель находится в пределах контура} else {... "притворяемся", что указатель не наведён на кнопку} При тестировании программы обнаружил, что кнопка вообще не реагирует на сообщение WM_MOUSELEAVE, ЗАТО прекрасно слушается сообщения WM_MOUSEMOVE, когда указатель мыши выходит за пределы круга, обозначающего кнопку. В чём может быть дело? Подскажите, пожалуйста, в чём моя ошибка. Заранее благодарен за Ваше внимание |
#2
|
||||
|
||||
Не проще обработать все сообщения в WndProc компонента?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#3
|
||||
|
||||
Таким методом раньше не пользовался (нехватка знаний и опыта )...
Если можно, опишите вкратце, какие преимущества это даёт, а дополнительные сведения по этой теме уже постараюсь найти самостоятельно ) |
#4
|
||||
|
||||
Будут доступны ВСЕ сообщения приходящие окну и их не потребуется дополнительно описывать.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#5
|
||||
|
||||
Понял, развернусь в этом направлении ))
Но всё же - почему контрол может не реагировать на WM_MOUSELEAVE? |
#6
|
||||
|
||||
Нужно видеть код компонента, чтобы сказать это.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
||||
|
||||
Код:
procedure TRoundBtn.DoMouseLeft(var Msg: TWMMouse); begin if fActive then begin Picture.Bitmap.Assign(fFace); end; end; fActive - переменная, эквивалентна fEnabled (но контрол остаётся Enabled постоянно, просто изменяется его внешний вид). fFace - вид кнопки в "состоянии покоя". Края залиты синим цветом RGB 0,0,255, он установлен как прозрачный цвет и невидим (мы видим лишь круглую область) |
#8
|
||||
|
||||
Я говорил про код компонента, а не процедуры в него входящей.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
||||
|
||||
Извиняюсь
Код:
TRoundBtn = class (TImage) private fFace, fOver, fDown, fDisb: TBitmap; fPath: ShortString; fActive: boolean; protected procedure DoMouseOver(var Msg: TWMMouse); message WM_MOUSEMOVE; procedure DoMouseLeft(var Msg: TWMMouse); message WM_MOUSELEAVE; procedure DoMouseDown(var Msg: TWMMouse); message WM_LBUTTONDOWN; procedure DoMouseUp(var Msg: TWMMouse); message WM_LBUTTONUP; procedure SetActive(V: boolean); procedure SetPath(V: ShortString); public constructor New(AOwner: TWinControl; ThePath: ShortString); procedure Kill; property Active: boolean read fActive write SetActive; property Path: ShortString read fPath write SetPath; end; Графика кнопки загружается из res-файла. Кнопки различаются цветовой гаммой, которая указывается в свойстве Path (например, 'RBT_RED'). |
#10
|
||||
|
||||
Контрол TSpeedButton также как и TImage основан на классе TGraphicControl, но там нужные мышинные события уже реализованы. Можно взять его за основу или посмотреть сам принцип реализации.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#11
|
||||
|
||||
Да, TSpeedButton удобен в этом случае, но мои тараканы в голове требуют именно круглый контрол С моим скудным опытом проще всего реализовать круглую кнопку на базе TImage...
Раньше я уже использовал подобный подход в самодельной игрушке; там, как ни странно, контролы прекрасно реагировали на все действия мышью... хотя код тот же самый Словом, буду разбираться с внутренностями TSpeedButton, авось наткнусь на решение своей задачи Спасибо за совет ) |
#12
|
||||
|
||||
Не изобретайте велосипед, посмотрите архив.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#13
|
||||
|
||||
Преогромнейшее Вам спасибо
|