我有一个没有标题的表单,使用双击最大化:代码如下所示:
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 ...
的位置这样做的正确方法是什么?
感谢。
答案 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的信息。