У меня есть форма без подписи, которую можно развернуть двойным щелчком: Код выглядит так:
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-реализацию SetWidnowState. В 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.
Звучит нормально, но, как указал Дрейк, панель задач может появляться где угодно, как и дополнительные пристыкованные боковые панели, такие как Google Desktop, Winamp и т. д.
Вместо этого, возможно, используйте что-то вроде Screen.WorkAreaRect, чтобы получить клиентскую область экрана. Например.
with Screen.WorkAreaRect do
Form1.SetBounds(Left, Top, Right - Left, Bottom - Top);
Хорошо, но это работает только для основного монитора. Чтобы развернуть его на текущем мониторе, вам необходимо сделать следующее: с Screen.MonitorFromWindow (Form1.Handle) .WorkAreaRect do Form1.SetBounds (Left, Top, Right - Left, Bottom - Top);