{ **** UBPFD *********** by delphibase.endimus.com ****
>>
Зависимости: Windows
Автор: Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright: Dimka Maslov
Дата: 4 ноября 2002 г.
***************************************************** }function GetDesktopRect: TRect;
var
RgnDesktop, RgnTrayWnd: HRGN;
function CreateWindowRgn(Handle: HWND): HRGN;
var
R: TRect;
begin
GetWindowRect(Handle, R);
with R do
Result := CreateRectRgn(Left, Top, Right, Bottom);
end;
begin
RgnDesktop := CreateWindowRgn(GetDesktopWindow);
try
RgnTrayWnd := CreateWindowRgn(FindWindow('Shell_TrayWnd', ''));
try
CombineRgn(RgnDesktop, RgnDesktop, RgnTrayWnd, RGN_DIFF);
GetRgnBox(RgnDesktop, Result);
finally
DeleteObject(RgnTrayWnd);
end;
finally
DeleteObject(RgnDesktop);
end;
end;
Перевод контента на русский язык:
Функция Delphi под именем GetDesktopRect получает координаты области рабочего стола, исключая область системной панели (также известную как область уведомлений). Функция использует Windows API для достижения этого.
Вот разбивка того, что код делает:
Он определяет две переменные: RgnDesktop и RgnTrayWnd, которые являются handle-ами объектов региона.
Он определяет вложенную функцию под именем CreateWindowRgn, которая принимает handle окна в качестве входного параметра и возвращает объект региона, созданный из прямоугольника окна.
Основная функция GetDesktopRect создает объект региона для окна рабочего стола с помощью CreateWindowRgn.
Затем она создает объект региона для окна системной панели с помощью FindWindow, чтобы найти окно системной панели, и CreateWindowRgn, чтобы создать объект региона из его прямоугольника.
Функция комбинирует два объекта региона с помощью CombineRgn с флагом RGN_DIFF, который вычитывает область системной панели из области рабочего стола.
Она получает рамку bounding box результата региона с помощью GetRgnBox и возвращает ее как объект TRect.
Вот некоторые предложения по улучшению:
Обработка ошибок: Функция использует блоки try-finally для обеспечения удаления объектов региона, даже если возникает ошибка. Однако лучше было бы обрабатывать ошибки явно, а не полагаться на finally-블лок.
Организация кода: Вложенная функция CreateWindowRgn не является необходимой и может быть встроена в основную функцию.
Имя переменных: Некоторые имена переменных, такие как RgnDesktop и RgnTrayWnd, несколько неясны. Рекомендуется использовать более описательные имена для улучшения читаемости кода.
Вот альтернативное решение, которое адресует эти предложения:
В этом альтернативном решении я убрал вложенную функцию и встроил ее код в основную функцию. Я также использовал более описательные имена переменных и добавил явную обработку ошибок с помощью блока try-except.
В статье Dimka Maslov описывается функция GetDesktopRect, позволяющая получить координаты области Рабочего стола, не скрытой панелью задач в Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS