Home

Page 103
Page 103
background image

96 Глава 3

Здесь запускается цикл, где переменная i изменяется от о до отрицательного

значения ширины экрана. Это означает, что все окна сдвигаются влево.

В этой строке очень интересным является ключевое слово

 to. Обычно

всегда используют просто to, при котором значение переменной увеличивает-

ся. Если указано

 переменная i наоборот будет уменьшается.

Внутри цикла первым делом очищается список видимых окон
и заполняется новыми значениями. Это необходимо, потому что состояние
видимых окон с момента последнего выполнения цикла могло измениться.

Мы же делаем задержку после каждого сдвига в 10 секунд, чего более чем

достаточно на запуск простых программ.

Для поиска видимых окон используется функция

 которая может

искать все окна, включая главные и подчиненные. Указатель найденного

окна сохраняется в переменной w. Видимость окна можно проверить с по-

мощью вызова функции

 передав в качестве параметра

указатель на него. Если функция возвращает true, значит, то окно видимо,

и его можно будет двигать. Если нет, то окно или невидимо, или свернуто,
а такие окна двигать бесполезно.

Теперь о самом сдвиге. Он начинается с вызова API-функции
BeginDeferWindowPos. Эта функция выделяет память для нового окна рабо-

чего стола, куда мы и будем сдвигать все видимые окна. В качестве парамет-

ра нужно указать, сколько окон мы будем двигать.

Если предыдущие шаги выполнены успешно, то начинается перебор всех

окон из подготовленного списка и их сдвиг. Для сдвига окна в подготовлен-

ную область памяти используется функция

 В данный

момент не происходит никаких реальных перемещений окон, а изменяется

только информация о позиции и размерах.

После перемещения всех окон вызывается API-функция

Вот тут окна реально перескакивают в новое место. Это происходит практи-

чески моментально. Если бы вы использовали простую API-функцию

setwindowPos для установки позиции каждого окна в отдельности, то про-

рисовка происходила бы намного медленнее.

Я всегда вам говорил, что все переменные типа объектов должны инициали-

зироваться и уничтожаться. Во время

 выделяется память,

а во время уничтожения память освобождается. В моем примере я создал

переменную windowsList типа TList, но нигде не уничтожаю. Почему?

Ведь

 — это объект, и я расходую понапрасну память. Все очень про-

сто — программа выполняется бесконечно, и ее работа может прерваться

только по двум причинам.

1. Выключили компьютер. В этом случае, даже если я буду освобождать па-

мять, то она никому не понадобится, потому что компьютер выключат ;).

2. Кто-то умный закончил процесс. То есть программа закончит выполне-

ние аварийно, и память все равно не освободится.


Copyright © 2020 Файлообменник files.d-lan.dp.ua

Использование любых материалов сайта возможно только с разрешения автора.