delphi中最大化表单的正确方法(无标题)

问题描述 投票:0回答:3

我有一个没有标题的表单,双击即可最大化:代码如下所示:

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 ...

正确的做法是什么?

谢谢。

delphi winapi
3个回答
10
投票

听起来不错,但就像 Drejc 指出的那样,任务栏可以出现在任何地方,其他停靠侧边栏(如 Google Desktop、Winamp 等)也可以出现。

也许可以使用 Screen.WorkAreaRect 之类的东西来获取屏幕的工作区。例如

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

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'; 如果我没记错的话。 所以深入研究这个库,也许某处有一些任务栏的信息。


0
投票

请使用这一行代码来最大化表单:

postmessage(handle,WM_SYSCOMMAND,SC_MAXIMIZE,0);
© www.soinside.com 2019 - 2024. All rights reserved.