#windows #delphi #delphi_7
Как известно, панель задач можно закрепить слева\справа, снизу\сверху. У меня панель задач находится сверху и при Form1.Create отображается за ней. Можно ли в Delphi узнать, в какой из сторон находится панель задач?
Ответы
Ответ 1
У объекта Screen есть два свойства - DesktopRect и WorkAreaRect. В первом показываются координаты всего экрана, во втором - координаты "рабочей области" - это как раз экран за минусом таскбара. Если нужно расположить окно так, чтобы оно не перекрывалось с таскбаром, то проверяем координаты прямоугольника окна и корректируем их так, чтобы оно не выходило за пределы WorkAreaRect. В простейшем случае поможет функция IntersectRect(). Вот Вам примерчик, в котором окно ограничивается в размерах, чтобы не вылезать за пределы рабочей области. Работает при любом выравнивании таскбара. procedure TForm1.Button1Click(Sender: TObject); var da, wa, r, clip, me: TRect; s: string; begin da := Screen.DesktopRect; wa := Screen.WorkAreaRect; s := Format('Screen.DesktopRect = { left: %d, top: %d, right: %d, bottom: %d }', [da.Left, da.Top, da.Right, da.Bottom]) + sLineBreak + Format('Screen.WorkAreaRect = { left: %d, top: %d, right: %d, bottom: %d }', [wa.Left, wa.Top, wa.Right, wa.Bottom]); Self.Left := 0; Self.Top := 0; Self.Width := Screen.Width; Self.Height := Screen.Height; Application.ProcessMessages(); ShowMessage(s); // раскомментировать фрагменты, чтобы получить отступы от границ рабочей области clip := Rect(wa.Left {+ 25}, wa.Top {+ 25}, wa.Right {- 25}, wa.Bottom {- 25}); me := Rect(Self.Left, Self.Top, Self.Left + Self.Width, Self.Top + Self.Height); if (IntersectRect(r, clip, me)) then begin Self.Left := r.Left; Self.Width := r.Right - r.Left; Self.Top := r.Top; Self.Height := r.Bottom - r.Top; end; end; Если необходима работа приложения в конфигурациях с несколькими мониторами, обращайтесь к свойству Screen.Monitors: в классе TMonitor имеются свойства BoundsRect и WorkAreaRect, с помощью которых тоже можно делать всё то же самое. P.S.: если всё-таки необходимо узнать выравнивание таскбара: можно заметить, что где у Screen.WorkAreaRect отличается координата (Left/Top/Right/Bottom) от соответствующей координаты в Screen.DesktopRect, там и лежит таскбар :)Ответ 2
На мой взгляд, эффективнее воспользоваться стандартной функцией API SHAppBarMessage. Без FindWindow нам тоже не обойтись. Вот, набросал консольный пример, пока вспоминал, как работать с этой функцией. Работает в любом положении панели задач, не важно, скрытая она или нет. program taskbarpos; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Windows, shellapi; function FindTaskBarPos(var ARect: TRect): integer; / найти положение панели задач // ARect - координаты, результат - положение, см. константы ниже var AppData: TAppBarData; begin AppData.Hwnd := FindWindow('Shell_TrayWnd', nil); if AppData.Hwnd = 0 then RaiseLastWin32Error; // на всякий случай :) AppData.cbSize := SizeOf(TAppBarData); if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) = 0 then raise Exception.Create('SHAppBarMessage возвратило ошибку при попытке обращения к позиции Панели задач'); Result := AppData.uEdge; ARect := AppData.rc; end; var tr:TRect; edge:integer; begin edge:=FindTaskBarPos(tr); case edge of ABE_BOTTOM: Writeln('Снизу'); ABE_LEFT: Writeln('Слева'); ABE_RIGHT: Writeln('Справа'); ABE_TOP: Writeln('Сверху'); end; Writeln('Правая координата:' + IntToStr(tr.Right)+' нижняя координата:' + IntToStr(tr.Bottom)); end. tr.Left и tr.Top вернут, соответственно, координаты левой части и верхней.
Комментариев нет:
Отправить комментарий