我有一个没有标题的表单,双击即可最大化:代码如下所示:
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 ...
正确的做法是什么?
谢谢。
听起来不错,但就像 Drejc 指出的那样,任务栏可以出现在任何地方,其他停靠侧边栏(如 Google Desktop、Winamp 等)也可以出现。
也许可以使用 Screen.WorkAreaRect 之类的东西来获取屏幕的工作区。例如
with Screen.WorkAreaRect do
Form1.SetBounds(Left, Top, Right - Left, Bottom - Top);
一个额外的提示。任务栏也可以位于屏幕的右侧或左侧(不仅是顶部和底部)。所以你还必须弄清楚任务栏在哪里。
我建议您研究一下 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'; 如果我没记错的话。 所以深入研究这个库,也许某处有一些任务栏的信息。
请使用这一行代码来最大化表单:
postmessage(handle,WM_SYSCOMMAND,SC_MAXIMIZE,0);