Проблема в том, что вы устанавливаете свойство DockSite
элемента управления страницы (хотя оно не упоминается в вопросе). Когда установлен DockSite, при перетаскивании левой кнопки мыши создается объект перетаскивания, а затем этот объект захватывает мышь (это делается для того, чтобы можно было автоматически перетаскивать форму). Таким образом, именно этот объект обрабатывает сообщения мыши до тех пор, пока захват не будет освобожден, что делается в случае WM_LBUTTONUP
в TDragObject.WndProc
.
Переопределение WndProc, получение нового класса, размещение обработчика сообщений и т. Д. Не будут работать, поскольку элемент управления страницей не доставляет никаких сообщений мыши, пока мышь захватывается объектом перетаскивания. Даже использование Application.OnMessage в лучшем случае будет неуклюжим, поскольку Msg.hwnd будет указывать на другое окно при каждом щелчке мыши.
То, что вы можете сделать, например, так или иначе подклассить элемент управления страницы, чтобы иметь возможность перехватывать WM_LBUTTONDOWN
, выполнить там тест и освободить захват, если щелчок находится на кнопке вкладки. Очень грязный быстрый пример, основанный на связанном вопросе:
type
TPageControl = class(comctrls.TPageControl)
private
procedure WmLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
end;
TMainfrm = class(TForm)
..
procedure TPageControl.WmLButtonDown(var Msg: TWMLButtonDown);
var
I: Integer;
begin
inherited; // mouse will be captured here
for I := 0 to Length(Mainfrm.FCloseButtonsRect) - 1 do
begin
if PtInRect(Mainfrm.FCloseButtonsRect[I], SmallPointToPoint(Msg.Pos)) then
begin
ReleaseCapture; // and released here
Break;
end;
end;
end;