На этом шаге мы рассмотрим перемещение и изменение размеров окон и изменение состояния окна.
После того как окно создано, приложение может изменять размер окна и его позицию вызовом предиката win_Move. В примере, рассмотренном ниже, показано, как переместить окно на 10 пикселей вправо и вниз щелчком мыши.
win_event_handler(Window,e_MouseUp(PNT, ShiftCtlAlt, Button),0):-!, OuterRCT=win_GetOuterRect(Window), WsFlags=win_GetState(Window), ClientRCT=rect_GetClient(WsFlags,const_HasMenu,OuterRCT), NewClient=rect_Offset(ClientRCT,10,10), win_Move(Window, NewClient).
Обратите внимание, что нельзя просто использовать rect_Offset для прямоугольника, возвращенного win_GetClientRect, потому что этот прямоугольник имеет начало координат (0,0).
При создании окно получает набор флагов стиля. Эти флаги определяют начальное состояние окна, а именно: является ли окно видимым, заблокированным или свернутым в пиктограмму. Возможные стили окна приведены ранее в таблице 1 шага 32. Состояние окна можно изменить вызовом предиката win_SetState, а текущее состояние окна получить вызовом предиката win_GetState.
SetState(Window,wsflags WinStateList) Wsflags=win_GetState(Window)
Заблокированное окно не получает данных с клавиатуры или мыши, но оно может получать сообщения от других окон, от иных приложений и от операционной системы Windows. Приложение обычно отключает такое окно, чтобы не допустить его использования пользователем. Например, приложение может отключить кнопку ОК в диалоговом окне, чтобы пользователь не мог нажать на нее, пока не будут введены требуемые данные в другом элементе управления. Приложение может активизировать заблокированное окно в любое время (обычно активизируется при создании). Для создания заблокированного окна можно определить стиль wsf_Disabled.
Когда дочернее окно заблокировано, Windows передает сообщения мыши от дочернего окна родительскому, как будто нет никакого дочернего окна, покрывающего данную область.
Для блокировки и активизации окон используются следующие предикаты:
win_SetState(Window,[wsf_Disabled]) win_SetState(Window,[wsf_Enabled])
Окно или элемент управления могут быть сделаны полностью невидимыми. В этом случае пользователю они будут недоступны, однако программа может работать с ними как с видимыми. Диалоговые окна могут содержать невидимые элементы управления, которые будут отображены после выполнения каких-либо действий.
Чтобы скрыть или сделать видимыми окна, используйте следующие предикаты:
win_SetState(Window,[wsf_Invisible]) win_SetState(Window,[wsf_Visible])
Окно может быть свернуто, развернуто или восстановлено к его предыдущему размеру из первых двух состояний. Эти действия может выполнять пользователь, если окно создано с надлежащими флагами стиля, или их можно выполнить программно вызовом предиката win_SetState.
Чтобы свернуть, развернуть или восстановить окна, используйте следующие предикаты:
win_SetState(Window,[wsf_Minimized]) win_SetState(Window,[wsf_Maximized]) win_SetState(Window,[wsf_Restored])
На следующем шаге мы рассмотрим изменения пиктограммы, текста или заголовка окна и обработчика событий.