Как скрыть границы, созданные WS_SIZEBOX с помощью Delphi? - PullRequest
0 голосов
/ 31 октября 2018

Я создаю пользовательские панели (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;

1 Ответ

0 голосов
/ 31 октября 2018

Как я вижу из вашего вопроса, вы хотите добиться отдыха 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.
...