私はは、TPageControlコンポーネントの特定の領域に対してと「0nMouseLeave」「OnMouseEnter」をキャッチする必要があります。その特定の領域で私は全体の "タブヘッダー"の矩形を意味します。は、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;
私はそれが確実に可能であることを知っています。パネルコントロールの下に適切な高さのパネルを配置し、ページコントロールのOnMouseEnterとOnMouseLeaveとパネルの同じイベントを共有しますが、これを真剣に1つのコンポーネントで囲む必要があります。 –