在delphi中最大化形式的正确方法(无标题)

时间:2008-12-19 06:08:00

标签: delphi winapi

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

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 个答案:

答案 0 :(得分:10)

听起来不错,但就像Drejc指出的那样,任务栏可以出现在任何地方,因此Google桌面,Winamp等其他停靠边栏也可以出现。

而是使用像Screen.WorkAreaRect这样的东西来获取屏幕的客户区域。 E.g。

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

答案 1 :(得分: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'; 如果我没有误会。 所以深入了解这个库,也许在某处有一些TaskBar的信息。