如何使用 Delphi 隐藏由 WS_SIZEBOX 创建的边框?
How to hide borders created by WS_SIZEBOX using Delphi?
我创建了具有运行时调整大小功能的自定义面板 (TMyPanel)。有什么方法可以隐藏边框而不丢失调整大小的功能吗?
type
TMyPanel = class(TPanel)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
...
procedure TMyPanel.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or WS_SIZEBOX;
end;
...
var
MyPanel1: TMyPanel;
begin
MyPanel1:=TMyPanel.Create(self);
MyPanel1.Parent:=self;
...
end;
从你的问题可以看出,即使没有非客户端边界,你也想实现 TPanel
的重新设置。如果我猜对了,我可以与您分享一种解决方案。对于我的一些控件,我使用了这种技术并且它有效。
实际上,这里不需要 WS_SIZEBOX
样式。
unit PanelEx;
interface
uses
Windows,
Messages,
ExtCtrls;
type
TPanelEx = class(TPanel)
protected
procedure WMNCHITTEST(var Message: TMessage); message WM_NCHITTEST;
end;
implementation
procedure TPanelEx.WMNCHITTEST(var Message: TMessage);
const
BorderSize = 10;
var
P: TPoint;
begin
Inherited;
if not Assigned(Parent) then
Exit;
P.X := LOWORD(Message.LParam);
P.Y := HIWORD(Message.LParam);
// Convert screen coordinates into client
P := Parent.ScreenToClient(P);
// Decide what result message should have
if (Abs(Left + Width - P.X) < BorderSize) and (Abs(Top + Height - P.Y) < BorderSize) then
Message.Result := HTBOTTOMRIGHT
else
if (Abs(Left - P.X) < BorderSize) and (Abs(Top + Height - P.Y) < BorderSize) then
Message.Result := HTBOTTOMLEFT
else
if (Abs(Left + Width - P.X) < BorderSize) and (Abs(Top - P.Y) < BorderSize) then
Message.Result := HTTOPRIGHT
else
if (Abs(Left - P.X) < BorderSize) and (Abs(Top - P.Y) < BorderSize) then
Message.Result := HTTOPLEFT
else
if Abs(Left - P.X) < BorderSize then
Message.Result := HTLEFT
else
if Abs(Top - P.Y) < BorderSize then
Message.Result := HTTOP
else
if Abs(Left + Width - P.X) < BorderSize then
Message.Result := HTRIGHT
else
if Abs(Top + Height - P.Y) < BorderSize then
Message.Result := HTBOTTOM;
end;
end.
我创建了具有运行时调整大小功能的自定义面板 (TMyPanel)。有什么方法可以隐藏边框而不丢失调整大小的功能吗?
type
TMyPanel = class(TPanel)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
...
procedure TMyPanel.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or WS_SIZEBOX;
end;
...
var
MyPanel1: TMyPanel;
begin
MyPanel1:=TMyPanel.Create(self);
MyPanel1.Parent:=self;
...
end;
从你的问题可以看出,即使没有非客户端边界,你也想实现 TPanel
的重新设置。如果我猜对了,我可以与您分享一种解决方案。对于我的一些控件,我使用了这种技术并且它有效。
实际上,这里不需要 WS_SIZEBOX
样式。
unit PanelEx;
interface
uses
Windows,
Messages,
ExtCtrls;
type
TPanelEx = class(TPanel)
protected
procedure WMNCHITTEST(var Message: TMessage); message WM_NCHITTEST;
end;
implementation
procedure TPanelEx.WMNCHITTEST(var Message: TMessage);
const
BorderSize = 10;
var
P: TPoint;
begin
Inherited;
if not Assigned(Parent) then
Exit;
P.X := LOWORD(Message.LParam);
P.Y := HIWORD(Message.LParam);
// Convert screen coordinates into client
P := Parent.ScreenToClient(P);
// Decide what result message should have
if (Abs(Left + Width - P.X) < BorderSize) and (Abs(Top + Height - P.Y) < BorderSize) then
Message.Result := HTBOTTOMRIGHT
else
if (Abs(Left - P.X) < BorderSize) and (Abs(Top + Height - P.Y) < BorderSize) then
Message.Result := HTBOTTOMLEFT
else
if (Abs(Left + Width - P.X) < BorderSize) and (Abs(Top - P.Y) < BorderSize) then
Message.Result := HTTOPRIGHT
else
if (Abs(Left - P.X) < BorderSize) and (Abs(Top - P.Y) < BorderSize) then
Message.Result := HTTOPLEFT
else
if Abs(Left - P.X) < BorderSize then
Message.Result := HTLEFT
else
if Abs(Top - P.Y) < BorderSize then
Message.Result := HTTOP
else
if Abs(Left + Width - P.X) < BorderSize then
Message.Result := HTRIGHT
else
if Abs(Top + Height - P.Y) < BorderSize then
Message.Result := HTBOTTOM;
end;
end.