Мне нужно перехватить "OnMouseEnter" и "0nMouseLeave" для определенной области компонента TPageControl .С этой конкретной областью я имею в виду весь прямоугольник "заголовка вкладки" .
Проблема в том, что элемент управления страницы не перехватывает сообщения (яперехват сообщений внутреннего контроля CM_MOUSEENTER и CM_MOUSELEAVE) в «пустом» пространстве .
Цель для меня - нарисовать маленькую стрелку в правом пустом местесторона, когда пользователь наводит курсор на область с красной рамкой (а рисунок - просто кусок торта) и стирает ее, когда покидает эту область.И меня не волнует переполнение вкладок (которое приводит к рисованию двойной кнопки прокрутки) - этого никогда не произойдет.
Вот рабочий фрагмент кода, , но это неясное решение и мне не нравится .Должен быть другой (более чистый) способ сделать это.
type
TPageControl = class(ComCtrls.TPageControl)
protected
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
procedure TPageControl.CMMouseLeave(var Message: TMessage);
begin
inherited;
Canvas.TextOut(Width - 130, 5, 'CMMouseLeave'); // display result
end;
procedure TPageControl.WMNCHitTest(var Message: TWMNCHitTest);
var TabHeaderRect: TRect;
begin
if Message.Result = 0 then // if Message.Result = HTNOWHERE ...
begin
TabHeaderRect := ClientRect;
TabHeaderRect.Bottom := Top + 21;
if PtInRect(TabHeaderRect, ScreenToClient(Point(Message.XPos, Message.YPos))) then
Canvas.TextOut(Width - 130, 5, 'WMNCHitTest '); // display result
Message.Result := HTCLIENT;
end
else
inherited;
end;