我还将最小尺寸设置为原始尺寸.
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.
总结以上是内存溢出为你收集整理的表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?全部内容,希望文章能够帮你解决表单 – 如何使表单浮动在工作区中,因为它是屏幕(移动,大小,最大化,最小化)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)