在Delphi中最大化窗体的正确方法(不带标题)

5

我有一个没有标题的表单,在双击时可以最大化:代码如下:

procedure xxxxxx; 
begin
    if Form1.WindowState=wsNormal then
       begin
        Form1.WindowState:=wsMaximized;
        Form1.SetBounds(0,0,screen.Width,screen.Height-getHeightOfTaskBar);
       end
       else
       begin
         Form1.WindowState:=wsNormal;
       end;

       ShowTrayWindow;
end;
function getHeightOfTaskBar : integer;
var hTaskBar:HWND;
    rect : TRect;
begin
     hTaskbar := FindWindow('Shell_TrayWnd', Nil );
     if hTaskBar<>0 then
        GetWindowRect(hTaskBar, rect);

     Result:=rect.bottom - rect.top;
end;

这个方法挺好用的,但是我需要找到任务栏的位置来重置SetBounds...

有什么正确的做法吗?

谢谢。

2个回答

10

听起来不错,但像Drejc指出的那样,任务栏可以出现在任何地方,而其他停靠的侧边栏如谷歌桌面、Winamp等也可能存在。

因此,最好使用类似于Screen.WorkAreaRect这样的东西来获取屏幕的客户区域。例如:

with Screen.WorkAreaRect do
  Form1.SetBounds(Left, Top, Right - Left, Bottom - Top);

3
好的,但这仅适用于主监视器。要在当前监视器上最大化它,您需要执行以下操作:使用Screen.MonitorFromWindow(Form1.Handle).WorkAreaRect,然后执行Form1.SetBounds(Left, Top, Right - Left, Bottom - Top)。 - Name

0

另一个提示。任务栏也可以位于屏幕的右侧或左侧(不仅仅是顶部和底部)。因此,您还必须确定任务栏的位置。

我建议您查看SetWidnowState的Delphi实现。在Delphi7中,它是代码的这一部分:

procedure TCustomForm.SetWindowState(Value: TWindowState);
const
  ShowCommands: array[TWindowState] of Integer =
    (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED);
begin
  if FWindowState <> Value then
  begin
    FWindowState := Value;
    if not (csDesigning in ComponentState) and Showing then
      ShowWindow(Handle, ShowCommands[Value]);
  end;
end;

ShowWindow是一个Win32库调用:

function ShowWindow; external user32 name 'ShowWindow';

如果我没记错的话,user32 = 'user32.dll';。所以深入研究这个库,也许会在某个地方找到任务栏的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接