![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 компонента?
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#3
|
||||
|
||||
|
Таким методом раньше не пользовался (нехватка знаний и опыта
)...Если можно, опишите вкратце, какие преимущества это даёт, а дополнительные сведения по этой теме уже постараюсь найти самостоятельно ) |
|
#4
|
||||
|
||||
|
Будут доступны ВСЕ сообщения приходящие окну и их не потребуется дополнительно описывать.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#5
|
||||
|
||||
|
Понял, развернусь в этом направлении ))
Но всё же - почему контрол может не реагировать на WM_MOUSELEAVE? |
|
#6
|
||||
|
||||
|
Нужно видеть код компонента, чтобы сказать это.
|
|
#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
|
||||
|
||||
|
Я говорил про код компонента, а не процедуры в него входящей.
|
|
#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, но там нужные мышинные события уже реализованы. Можно взять его за основу или посмотреть сам принцип реализации.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#11
|
||||
|
||||
|
Да, TSpeedButton удобен в этом случае, но мои тараканы в голове требуют именно круглый контрол
С моим скудным опытом проще всего реализовать круглую кнопку на базе TImage...Раньше я уже использовал подобный подход в самодельной игрушке; там, как ни странно, контролы прекрасно реагировали на все действия мышью... хотя код тот же самый ![]() Словом, буду разбираться с внутренностями TSpeedButton, авось наткнусь на решение своей задачи Спасибо за совет ) |
|
#12
|
||||
|
||||
|
Не изобретайте велосипед, посмотрите архив.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#13
|
||||
|
||||
|
Преогромнейшее Вам спасибо
![]() |