How to make a form float in the workspace, since it is a screen (move, size, maximize, minimize)?

I am trying the code published by Freddie Bell, What is the best way to make a Delphi application full screen? , like what I need.

I also set the minimum size as the original size.

with msg.MinMaxInfo^.ptMinTrackSize do begin // maximum size when maximised x := original_width; y := original_height; end; 

And in the Form OnShow event:

  original_width := Width; original_height := Height; 

But I have this problem: - Mainform has two panels, one of which is aligned as alRight, the other is alLeft; therefore work_area is the space between panels. Mainform has no boundaries and is fully maximized by the workspace using

 SystemParametersInfo(SPI_GETWORKAREA, 0, @working_desktop, 0); 
  • When I move the form, it is held inside the workspace between the panels.
  • When I change the form, it is stored inside this workspace.
  • But, when I change the shape in any case (left or right), passing along the edge of the workspace, the form increased its size to the other side. those. if the shape is on the left edge, and you select it to resize it, and you move left (toward the edge), the shape increases its width to the right (but it stops on the right edge!).

I'm trying to use some code (catching WMSIZE or WMSIZING), but can I prevent this behavior? Thank you all in advance!

EDIT (David Heffernan) : key code is in this device.

 unit uFormularios; interface uses Windows, Messages, Forms, DBGrids, StdCtrls, Menus, Graphics, ComCtrls; type TForm_en_ventana = class(TForm) private ancho_original, alto_original: integer; procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW; procedure WMWindowPosChanging(Var Msg: TWMWindowPosChanging); Message WM_WINDOWPOSCHANGING; procedure WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; end; TForm_en_ventana_centrado = class(TForm_en_ventana) private ancho_original, alto_original: integer; procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW; end; procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE); procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer); var ESPACIO_DE_TRABAJO, VENTANA_DE_TRABAJO : TRect; implementation procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE); begin LockWindowUpdate(TForm(F).Handle); TForm(F).Left := ESPACIO_DE_TRABAJO.Left; if MaximoAncho = 0 then TForm(F).Width := ESPACIO_DE_TRABAJO.Right else begin if ESPACIO_DE_TRABAJO.Right < MaximoAncho then TForm(F).Width := ESPACIO_DE_TRABAJO.Right else TForm(F).Width := MaximoAncho; end; TForm(F).Top := ESPACIO_DE_TRABAJO.Top; if MaximaAltura = 0 then TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom else begin if ESPACIO_DE_TRABAJO.Bottom < MaximaAltura then TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom else TForm(F).Height := MaximaAltura; end; if ((MaximoAncho <> 0) or (MaximaAltura <> 0)) and (Centrado) then begin TForm(F).Left := (ESPACIO_DE_TRABAJO.Right - TForm(F).Width ) div 2; TForm(F).Top := (ESPACIO_DE_TRABAJO.Bottom - TForm(F).Height) div 2; end; LockWindowUpdate(0); end; procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer); begin VENTANA_DE_TRABAJO.Left := izq; VENTANA_DE_TRABAJO.Right := der; VENTANA_DE_TRABAJO.Top := arr; VENTANA_DE_TRABAJO.Bottom := aba; end; procedure TForm_en_ventana.WMWindowPosChanging(var Msg: TWMWINDOWPOSCHANGING); begin with Msg.WindowPos^ do { x: int; The position of the left edge of the window. y: int; The position of the top edge of the window. cx: int; The window width, in pixels. cy: int; The window height, in pixels. } begin if x <= VENTANA_DE_TRABAJO.Left then x := VENTANA_DE_TRABAJO.Left; if x + cx >= VENTANA_DE_TRABAJO.Right then x := (VENTANA_DE_TRABAJO.Right) - cx; if y <= VENTANA_DE_TRABAJO.Top then y := VENTANA_DE_TRABAJO.Top; if y + cy >= VENTANA_DE_TRABAJO.Bottom then y := (VENTANA_DE_TRABAJO.Bottom) - cy; end; end; Procedure TForm_en_ventana.WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo); begin inherited; with msg.MinMaxInfo^.ptMaxPosition do begin // position of top when maximised x := VENTANA_DE_TRABAJO.Left; y := VENTANA_DE_TRABAJO.Top; end; with msg.MinMaxInfo^.ptMaxSize do begin // width and height when maximized x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left; y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top; end; with msg.MinMaxInfo^.ptMaxTrackSize do begin // maximum size when maximised x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left; y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top; end; with msg.MinMaxInfo^.ptMinTrackSize do begin // maximum size when maximised x := ancho_original; y := alto_original; end; end; procedure TForm_en_ventana.WMSysCommand(var Msg: TWMSysCommand); begin if Msg.CmdType and $FFF0 = SC_MINIMIZE then Application.Minimize else inherited; end; procedure TForm_en_ventana.WMShowWindow(var Message: TWMShowWindow); begin ancho_original := Width; alto_original := Height; end; procedure TForm_en_ventana_centrado.WMShowWindow(var Message: TWMShowWindow); begin ancho_original := Width; alto_original := Height; Left := (((VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left) - Width) div 2) + VENTANA_DE_TRABAJO.Left; Top := (((VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top) - Height) div 2) + VENTANA_DE_TRABAJO.Top; end; initialization SystemParametersInfo(SPI_GETWORKAREA, 0, @ESPACIO_DE_TRABAJO, 0); VENTANA_DE_TRABAJO := ESPACIO_DE_TRABAJO; end. 
+4
source share
1 answer

Your handler for WM_WINDOWPOSCHANGING great for move operations, but it should be different for calibration operations. You cannot find them inside this message handler, so you need an alternative. Instead, use WM_SIZING and WM_MOVING as follows:

 procedure WMSizing(Var msg: TMessage); message WM_SIZING; procedure WMMoving(Var msg: TMessage); message WM_MOVING; .... procedure TForm_en_ventana.WMSizing(var msg: TMessage); var R: PRect; begin R := PRect(msg.LParam); R.Left := Max(R.Left, VENTANA_DE_TRABAJO.Left); R.Right := Min(R.Right, VENTANA_DE_TRABAJO.Right); R.Top := Max(R.Top, VENTANA_DE_TRABAJO.Top); R.Bottom := Min(R.Bottom, VENTANA_DE_TRABAJO.Bottom); end; procedure TForm_en_ventana.WMMoving(var msg: TMessage); var R: PRect; dx, dy: Integer; begin R := PRect(msg.LParam); dx := 0; dy := 0; if R.Left<VENTANA_DE_TRABAJO.Left then dx := VENTANA_DE_TRABAJO.Left-R.Left; if R.Right>VENTANA_DE_TRABAJO.Right then dx := VENTANA_DE_TRABAJO.Right-R.Right; if R.Top<VENTANA_DE_TRABAJO.Top then dy := VENTANA_DE_TRABAJO.Top-R.Top; if R.Bottom>VENTANA_DE_TRABAJO.Bottom then dy := VENTANA_DE_TRABAJO.Bottom-R.Bottom; OffsetRect(R^, dx, dy); end; 

You will need to remove WM_WINDOWPOSCHANGING altogether.

+2
source

Source: https://habr.com/ru/post/1392570/


All Articles