Шаг 36.
Visual Prolog.
Создание окон

    На этом шаге мы рассмотрим создание окон.

    В приложениях Visual Prolog создание окна обычно производится в коде, сгенерированном экспертом окон и диалоговых окон. Для создания окон эксперт кода будет использовать вид окна и параметры, указанные в диалоговом окне Attribute.

    Создание окна, диалогового окна или элемента управления выполняется одним из предикатов VPI, имена этих предикатов начинаются с win_Create. Все они возвращают дескриптор созданного окна. Обратите внимание, что если созданное окно или диалоговое окно были модальными, то они уже будут закрыты, когда мы вернемся из вызванного предиката, так что возвращенный дескриптор окна в этих случаях не имеет смысла.

    При создании окна пользователь должен определить необходимую клиентскую область окна. Это координаты Тор (верх), Left (левый), Right (правый) и Bottom (низ) относительно клиентской области родительского окна.

    Вызов ни одного из VPI-предикатов для создания окон и диалоговых окон не завершится прежде, чем будет выполнено предложение для события e_Create, заданного по умолчанию обработчика. Код, который вызывает предикат win_Create, может применить этот механизм для косвенной передачи данных в обработчик событий, используя данные непосредственно как данные для создания окна (Creation Data), если они являются числовыми значениями типа long. Если нет, то более сложные данные можно передать, используя приведение типов, чтобы сохранить указатель на данные, и передавая указатель как значение типа long.

    Если в обработчике нет предложения для события e_Create или оно выполнится неуспешно, то будет вызван обработчик события e_Create по умолчанию - и в любом случае окно будет создано и отображено. Если инициализация выполнилась неуспешно, то на такой случай ваша программа должна иметь второе предложение события e_Create, которое отследит эту ситуацию и сможет принять соответствующие меры. Эксперт кода не может генерировать двойные предложения событий - они должны быть скопированы и вставлены вручную.


    Замечания:

Создание обычного окна

    Предикат win_Create используется для создания как окон верхнего уровня, так и дочерних окон:

   Window=win_Create(Windowtype,Rсt,Title,Menu,
       ParentWindow,WSFlags,EventHandler,CreationData)

    Параметр Windowtype определяет вид окна. Параметр Rct определяет размер нового клиентского окна. Значение параметра Title будет отображено в строке заголовка окна (если окно имеет строку заголовка). Для окон верхнего уровня параметр Menu может использоваться для определения, какое меню должно иметь окно. ParentWindow содержит дескриптор родительского окна, которое для окон верхнего уровня должно окном Screen или окном Task, а для дочерних окон - окном верхнего уровня другим дочерним окном. WSFlags - это список значений флагов, которые опреляют внешний вид и поведение окна. EventHandler определяет предикат, который должен быть вызван, когда приходит событие для окна. CreationData - значение которое будет передано обработчику событий как часть события e_Create.

Создание диалогового окна

    Предикат win_CreateResDialog создаст модальное или немодальное диалоговое окно в зависимости от параметра Windowtype:

   Window=win_CreateResDialog(Parentwindow,
      Windowtype,ResId,Eventhandler,CreationData)

    Существует два вида диалоговых окон: немодальные и модальные. Модальное диалоговое окно должно быть закрыто прежде, чем пользователь сможет активизировать любое другое окно, меню или элемент управления в приложении. С другой стороны, любое число немодальных диалоговых окон может одновременно быть отображено на экране. Каждое из этих окон в любой момент может быть активизировано пользователем.

Создание элемента управления

    Предикат win_CreateControl применяется для добавления нового элемента управления к любому окну. На некоторых платформах невозможно добавить элемент управления в диалоговое окно после его создания:

   Window=win_CreateControl(Windowtype,Rct,Title, 
     Parentwindow,WinStyleFlags,CtrlId)

    Windowtype используется для задания типа создаваемого элемента управления, win_StyleFlags - это список параметров для определения поведения элемента управления, CtrlId - константа целого типа, используемая для идентификации элемента управления внутри окна или диалогового окна.

Динамическое создание окон

    Существует возможность определить окно или диалоговое окно вместе с элементами управления в отдельной структуре языка Пролог из домена windef_list. Здесь можно указать информацию об элементах управления и шрифтах или определить, что вся информация должна быть получена из сегмента ресурсов. Дополнительно вы можете задать все координаты в диалоговых базовых единицах и сделать диалоговые окна независимыми от шрифта:

   global domains
      windef_list=windef* 
      windef =resdlg(resid,Windowtype);
                   dlg(wdef,wsflags);
                   dlg_font(wdef,string fontname,integer fontsize,wsflags);
                   topwin(wdef,menu,wsflags);
                   childwin(wdef,ctlid,wsflags);
                   icon(wdef,ctlid,resid,wsflags);
                   ctl(wdef,ctlid,wsflags);
                   customctl(wdef,classname,ctlid,wsflags) 
      wdef=wdef(Windowtype,rсt,string,unit_type) 
      unit_type=integer unit_type constants
      u_Pixels=0	    % выбор масштаба в пикселях
      u_DlgPlatform=1    % масштаб в диалоговых базовых единицах платформы
      u_DlgBase=2	    % масштаб в диалоговых базовых единицах Windows

    Окна и диалоговые окна могут быть построены динамически во время работы приложения из списка элементов управления. Этот способ предпочтительней, чем использование предварительно подготовленных ресурсов из сегмента ресурсов приложения. Первый элемент в списке должен определить окно, а остальные элементы -дочерние окна или элементы управления. Дескриптор созданного окна возвращается в любом случае.

    Чтобы построить и создать окно, используется такой предикат:

   Window=win_CreateDyn(Windef_list,ParentWindow,
     Ehandler,CreationData)

    Чтобы построить и создать диалоговое окно, используется следующий предикат:

   Window=win_CreateDynDialog(ParentWindow,Windef_list,
     Ehandler,CreationData)

    Чтобы создать множество элементов управления (которые могут или пока не могут быть отображены) в созданном окне или диалоговом окне, используется нижеприведенный предикат:

   Window=win_CreateDynControl(Windef_list,ParentWindow)

    Этот предикат возвращает дескриптор первого из созданных элементов управления.

    На следующем шаге мы рассмотрим уничтожение окон.




Предыдущий шаг Содержание Следующий шаг