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

6vl6ewon  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(100)

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

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 ...
正确的方法是什么?
谢谢.

rnmwe5a2

rnmwe5a21#

听起来不错,但就像Drejc指出的那样,插件可以出现在任何地方,所以也可以附加停靠的侧边栏,如谷歌桌面,Winamp等。
相反,也许可以使用类似于Screen.WorkAreaRect的东西来获取屏幕的工作区。

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

字符串

6ju8rftf

6ju8rftf2#

一个额外的提示。任务栏也可以位于屏幕的右侧或左侧(不仅是顶部和底部)。所以你必须额外弄清楚任务栏在哪里。
我建议你看看SetWidnowState的 Delphi 实现。在Delphi 7中,它是代码的这一部分:

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';


where * user 32 = 'user32.dll';* 如果我没有弄错的话。所以深入研究这个库,也许在某个地方有一些任务栏的信息。

mm9b1k5b

mm9b1k5b3#

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

postmessage(handle,WM_SYSCOMMAND,SC_MAXIMIZE,0);

字符串

相关问题