Изменение размера формы, даже если она без полей - Удалить край скоса

Использование следующего кода для изменения размера формы без полей прекрасно работает:

type
 TForm1 = class(TForm)
 protected
   procedure CreateParams(var Params: TCreateParams); override;
 end;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 BorderStyle := bsNone;
 inherited;
 Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE;
 Params.Style := Params.Style or WS_SIZEBOX;
end;

Но посмотрите на изображение:

Почему сверху есть скос по краю? Любые предложения, чтобы удалить это?

3 ответа

Здесь абсолютный ответ. работает на win 7,8 win10. также странные тонкие верхние панели, которые появляются, исчезли.

(примечание: не забудьте установить для formmain.borderstyle значение bsNone;)

 protected
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;

..

procedure Tfmmain.WMNCHitTest(var Message: TWMNCHitTest);
const
  EDGEDETECT = 7; // adjust
var
  deltaRect: TRect;
begin
  inherited;
  if BorderStyle = bsNone then
    with Message, deltaRect do
    begin
      Left := XPos - BoundsRect.Left;
      Right := BoundsRect.Right - XPos;
      Top := YPos - BoundsRect.Top;
      Bottom := BoundsRect.Bottom - YPos;
      if (Top < EDGEDETECT) and (Left < EDGEDETECT) then
        Result := HTTOPLEFT
      else if (Top < EDGEDETECT) and (Right < EDGEDETECT) then
        Result := HTTOPRIGHT
      else if (Bottom < EDGEDETECT) and (Left < EDGEDETECT) then
        Result := HTBOTTOMLEFT
      else if (Bottom < EDGEDETECT) and (Right < EDGEDETECT) then
        Result := HTBOTTOMRIGHT
      else if (Top < EDGEDETECT) then
        Result := HTTOP
      else if (Left < EDGEDETECT) then
        Result := HTLEFT
      else if (Bottom < EDGEDETECT) then
        Result := HTBOTTOM
      else if (Right < EDGEDETECT) then
        Result := HTRIGHT
    end;
end;

Добавить 5 панелей

pnlTop

pnlRight

pnlLeft

pnlBottom

pnlRSZ

        procedure Tfrmmain.FormCreate(Sender: TObject);
          begin
            BorderStyle := bsNone;
            pnlTop.height:=1;
            pnlTop.Align:=alTop;
            pnlBottom.height:=1;
            pnlBottom.Align:=alBottom;
            pnlRight.width:=1;
            pnlRight.Align:=alRight;
            pnlLeft.width:=1;
            pnlLeft.Align:=alLeft;
            pnlRSZ.width:=3;
            pnlRSZ.height:=3;
            pnlRSZ.left:=frmmain.width-3;
            pnlRSZ.top:=frmmain.height-3;
            pnlRSZ.anchors:=[akRight,akBottom];


            pnlTop.Cursor:=crSizeNS;
            pnlBottom.Cursor:=crSizeNS;
            pnlRight.Cursor:=crSizeWE;
            pnlLeft.Cursor:=crSizeWE;
            pnlRSZ.Cursor:=crSizeNWSE;

            pnlTop.color:=frmmain.color;
            pnlBottom.color:=frmmain.color;
            pnlRight.color:=frmmain.color;
            pnlLeft.color:=frmmain.color;
            pnlRSZ.color:=frmmain.color;
          End;


    procedure Tfrmmain.pnlTopMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        ReleaseCapture;
        TForm(FrmMain).Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Top, 0);
      end;
    end;

    procedure Tfrmmain.pnlRightMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        ReleaseCapture;
        TForm(FrmMain).Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_RIGHT, 0);
      end;
    end;

    procedure Tfrmmain.pnlLeftMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        ReleaseCapture;
        TForm(FrmMain).Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Left, 0);
      end;
    end;

    procedure Tfrmmain.pnlBottomMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        ReleaseCapture;
        TForm(FrmMain).Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Bottom, 0);
      end;
    end;

    procedure Tfrmmain.pnlRSZMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        ReleaseCapture;
        TForm(FrmMain).Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_BOTTOMRIGHT, 0);
      end;
    end;

Этот код создает форму без полей с изменяемым размером и исправляет максимизацию панели задач:

      protected
     procedure CreateParams(var Params: TCreateParams); override;

...

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  BorderStyle := bsNone;
  inherited;
  if WindowState = TWindowState.wsNormal then begin
    Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE;
    Params.Style := Params.Style or WS_SIZEBOX;
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if WindowState = TWindowState.wsMaximized then begin
    SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and (not WS_SIZEBOX));
    SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) and (not WS_EX_STATICEDGE));
  end
  else begin
    SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) or WS_SIZEBOX);
    SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_STATICEDGE);
  end;
end;
    
procedure TForm1.BtnMaximaizeClick(Sender: TObject);
begin
  if WindowState = TWindowState.wsNormal then begin
    WindowState:= TWindowState.wsMaximized;
    SetBounds(Screen.WorkAreaRect.Left, Screen.WorkAreaRect.Top, Screen.WorkAreaRect.Width, Screen.WorkAreaRect.Height);
  end else
    WindowState:= TWindowState.wsNormal;
end;
Другие вопросы по тегам