Программирование в Delphi. Трюки и эффекты. Александр Чиртик
Чтение книги онлайн.

Читать онлайн книгу Программирование в Delphi. Трюки и эффекты - Александр Чиртик страница 12

СКАЧАТЬ перемещения и изменения размера элементов управления так, будто это обычные перекрывающиеся окна.

      Чтобы вас заинтересовать, сразу приведу результат работы примера. На рис. 1.13 показан внешний вид формы в начале работы примера.

      Рис. 1.13. Первоначальный вид формы

      После установки флажка Перемещение элементов управления получается результат, показанный на рис. 1.14.

      Рис. 1.14. Элементы управления можно перемещать (флажок не учитывается)

      В результате выполнеия произвольных перемещений, изменения размера окон, занявших место элементов управления, снятия флажка получаем измененный интерфейс формы (рис. 1.15).

      Рис. 1.15. Внешний вид формы после перемещения элементов управления

      Как же достигнут подобный эффект? Очень просто. Вы уже знаете, что элементы управления рисуются внутри своих собственных окон (дочерних по отношению к окну формы). Окна элементов управления отличает отсутствие в их стиле флагов (подробнее в гл. 2), позволяющих отображать рамку и изменять размер окна. Это легко изменить, самостоятельно задав нужные флаги в стиле окна с помощью API-функции SetWindowLong. Для удобства можно написать отдельную процедуру, которая будет дополнять стиль окна флагами, необходимыми для перемещения и изменения размера (как, собственно, и сделано в примере) (листинг 1.22).

Листинг 1.22. Разрешение перемещения и изменения размера

      procedure MakeMovable(Handle: HWND);

      var

      style: LongInt;

      flags: UINT;

      begin

      //Разрешаем перемещение элемента управления

      style:= GetWindowLong(Handle, GWL_STYLE);

      style:= style or WS_OVERLAPPED or WS_THICKFRAME or WS_CAPTION;

      SetWindowLong(Handle, GWL_STYLE, style);

      style:= GetWindowLong(Handle, GWL_EXSTYLE);

      style:= style or WS_EX_TOOLWINDOW;

      SetWindowLong(Handle, GWL_EXSTYLE, style);

      //Перерисуем в новом состоянии

      flags:= SWP_NOMOVE or SWP_NOSIZE or SWP_DRAWFRAME or SWP_NOZORDER;

      SetWindowPos(Handle, 0, 0, 0, 0, 0, flags);

      end;

      Как можно увидеть, дополнительные флаги задаются в два этапа. Сначала считывается старое значение стиля окна. Потом с помощью двоичной операции ИЛИ стиль (задается целочисленным значением) дополняется новыми флагами. Это делается для того, чтобы не пропали ранее установленные значения стиля окна.

      Вообще, процедура MakeMovable изменяет два стиля окна: обычный и расширенный. Расширенный стиль окна изменяется лишь для того, чтобы строка заголовка получившегося окна занимала меньше места (получаем так называемое окно панели инструментов). Полный перечень как обычных, так и расширенных стилей можно просмотреть в приложении 2.

      Логично также реализовать процедуру, обратную MakeMovable, запрещающую перемещение окон элементов управления (листинг 1.23).

Листинг 1.23. Запрещение перемещения и изменения размера

      procedure MakeUnmovable(Handle: HWND);

      var

      style: LongInt;

      flags: UINT;

      begin

      //Запрещаем перемещение элемента управления

      style:= GetWindowLong(Handle, GWL_STYLE);

      style:= style and not WS_OVERLAPPED and not СКАЧАТЬ