Область вкладки TPageControl OnMouseEnter События OnMouseLeave - PullRequest
2 голосов
/ 28 декабря 2010

Мне нужно перехватить "OnMouseEnter" и "0nMouseLeave" для определенной области компонента TPageControl .С этой конкретной областью я имею в виду весь прямоугольник "заголовка вкладки" .

Проблема в том, что элемент управления страницы не перехватывает сообщения (яперехват сообщений внутреннего контроля CM_MOUSEENTER и CM_MOUSELEAVE) в «пустом» пространстве .

screenshot

Цель для меня - нарисовать маленькую стрелку в правом пустом местесторона, когда пользователь наводит курсор на область с красной рамкой (а рисунок - просто кусок торта) и стирает ее, когда покидает эту область.И меня не волнует переполнение вкладок (которое приводит к рисованию двойной кнопки прокрутки) - этого никогда не произойдет.

Вот рабочий фрагмент кода, , но это неясное решение и мне не нравится .Должен быть другой (более чистый) способ сделать это.

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;

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Очевидно, что пустое пространство не принадлежит клиентской области элемента управления, поэтому элемент управления не получает никаких сообщений Windows, связанных с мышью, для этой области. Вам придется использовать события мыши формы. Или поместите элемент управления страницы внутри панели (используя alClient) и используйте события мыши на панели.

Если вам нужно это более одного раза, вы можете создать новый компонент, который будет делать именно это (объедините панель и элемент управления страницы для достижения желаемого поведения).

0 голосов
/ 28 декабря 2010

Вы уверены, что обрабатываете OnMouseEnter / OnMouseLeave для самого элемента управления страницы, а не для экземпляра TTabSheet, который он содержит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...