表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?

表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?,第1张

概述我尝试了Freddie Bell在 What is the best way to make a Delphi Application completely full screen?问题上发布的代码,正如我所需要的那样. 我还将最小尺寸设置为原始尺寸. with msg.MinMaxInfo^.ptMinTrackSize do begin // maximum size w 我尝试了FreddIE Bell在 What is the best way to make a Delphi Application completely full screen?问题上发布的代码,正如我所需要的那样.

我还将最小尺寸设置为原始尺寸.

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

并在Form OnShow活动中:

original_wIDth  := WIDth;  original_height := Height;

但我有这个问题:
– Mainform有两个面板,其中一个面板为alRight,另一个面板为alleft;所以working_area是面板之间的空间. Mainform没有边框,它完全最大化到工作区域

SystemParametersInfo(SPI_GETWORKAREA,@working_desktop,0);

>当我移动表单时,它保持在面板之间的working_area内.
>当我调整表单大小时,它会保留在working_area中.
>但是,当我通过work_area的边缘以任一方式(左或右)调整表格时,表格将其大小增加到另一侧.即,如果表单位于左边缘,并且您选择它以调整它的大小并向左移动(朝向边缘),则表单将其宽度向右增加(但它在右边缘处停止!).

我尝试使用一些代码(捕获WMSIZE或WMSIZING),但我可以阻止这种行为?
提前谢谢大家!

编辑(DavID Heffernan):关键代码似乎在这个单元中.

unit uFormularios;interfaceuses 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;implementationprocedure 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,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,@ESPACIO_DE_TRABAJO,0);  VENTANA_DE_TRABAJO := ESPACIO_DE_TRABAJO;end.
解决方法 WM_WINDOWPOSCHANGING的处理程序适用于移动 *** 作,但对于大小调整 *** 作需要不同.您无法从该消息处理程序中检测到这些内容,因此您需要替代方法.而是像这样使用WM_SIZING和WM_MOVING:

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;

您将需要完全删除WM_WINDOWPOSCHANGING.

总结

以上是内存溢出为你收集整理的表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?全部内容,希望文章能够帮你解决表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存