Предлагаю отдельно обсудить.
arisu писал(а):
ещё не хватает штатных сообщений MouseEnter/MouseLeave, чтобы сделать нормальный hover.
Предлагаю для этой задачи использовать сообщение Controllers.TraceMsg:
Код:
Controllers.TraceMsg* = RECORD (Controllers.CursorMessage)
(* (.x, .y) is the obsolete mouse point; it may coincide with actual, i.e (x,y) ≍ (gx,gy), when mouse has just 'moved inside'. Mind that x.y is frame coordinates, while gx,gy is global *)
modifiers*: SET; (*** IN *)
cursor*: INTEGER; (** OUT; Iff pointer position defined (.gx # MAX(INTEGER)), .cursor is preset to -1; it may be assigned a desired cursor index. Doing so enables (but does not bind) the framework to *not* send another PollCursorMsg *)
gx*, gy*: INTEGER; (** IN; global actual mouse coordinates (as opposed to .x, .y, the obsolete mouse coordinates). .gx = MAX(INTEGER) => new mouse point is undefined (i.e. mouse has moved out of host window) *)
END;
(** Sent along the point path (i.e. the path in frame forest of all frames that encompass a point) when mouse movement occurs. (x,y) is the obsolete mouse point in frame coords, while (gx,gy) is the actual mouse point in global coords, or MAX(INTEGER), if the latter is undefined *)
Вместо "мышь вошла" "мышь вышла", которые потребовали бы определенных вычислений со стороны ФВ, я предлагаю одно, оч похожее на TrackMsg. Оно означает "мышь покинула точку x,y (отн. кадра) и вошла в точку gx,gy в глобальных координатах". Отправляется оно из StdWindows, и, будучи расширением CursorMessage, 1) обеспечивает приведение координат при передаче ко вложенным кадрам и 2) доставляется без усилий со стороны контейнера до оконечных видов.
Виды, которые хотят изменять свое изображение, делают это штатным образом: обрабатывают TraceMsg
в HandleCtrlMsg и, если необходимо, запрашивают отрисовку посредством Views.Update.
Я опробовал его на простом крестике-закрывателе и на оконечном виде в приложении. Пока не опробовал, каково им пользоваться в контейнере, который хочет реагировать на прохождение мыши.