AROS/Zune: различия между версиями

Содержимое удалено Содержимое добавлено
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 76:
Попробуем запросить данные объекта MUI String:
 
<sourcesyntaxhighlight lang="cpp">
void f(Object *string)
{
Строка 84:
printf("String содержит: %s\n", (STRPTR)result);
}
</syntaxhighlight>
</source>
 
* <code>Object *</code> — тип объектов BOOPSI.
Строка 92:
В интерфейсах Zune чаще используются макросы <code>get()</code> и <code>XGET()</code>. Например:
 
<sourcesyntaxhighlight lang="cpp">
get(string, MUIA_String_Contents, &result);
 
result = XGET(string, MUIA_String_Contents);
</syntaxhighlight>
</source>
 
 
Строка 103:
Рассмотрим изменение данных полученной строки:
 
<sourcesyntaxhighlight lang="cpp">
SetAttrs(string, MUIA_String_Contents, (IPTR)"превед", TAG_DONE);
</syntaxhighlight>
</source>
 
* Указатели передаваемые в качестве аргументов должны иметь тип IPTR (это значит, указатель на целую переменную, может содержать адрес значений типа int) чтобы не читать потом предупреждения компилятора.
Строка 112:
Вы можете решить, что вам полезен макрос <code>set()</code>:
 
<sourcesyntaxhighlight lang="cpp">
set(string, MUIA_String_Contents, (IPTR)"превед");
</syntaxhighlight>
</source>
 
Однако, только вызовом <code>SetAttrs()</code> вы сможете установить несколько атрибутов за один раз:
 
<sourcesyntaxhighlight lang="cpp">
SetAttrs(string,
MUIA_Disabled, TRUE,
MUIA_String_Contents, (IPTR)"Гммм...",
TAG_DONE);
</syntaxhighlight>
</source>
 
=== Вызов метода ===
Строка 129:
Методы в интерфейсах Zune, как правило, вызываются из тела цикла приложения, при обработке событий:
 
<sourcesyntaxhighlight lang="cpp">
result = DoMethod(obj, MUIM_Application_NewInput, (IPTR)&sigs);
</syntaxhighlight>
</source>
 
* Эти параметры не являются taglist, и следовательно не заканчиваются тегом <code>TAG_DONE</code>.
Строка 144:
Рассмотрим наш первый реальный пример :
 
<sourcesyntaxhighlight lang="cpp">
// gcc hello.c -lmui
#include <exec/types.h>
Строка 209:
return 0;
}
</syntaxhighlight>
</source>
 
=== Комментарии ===
Строка 221:
Для облегчения программирования интерфейса используются макросы. Интерфейс Zune всегда имеет 1 (и только 1) объект Приложения:
 
<sourcesyntaxhighlight lang="cpp">
app = ApplicationObject,
</sorce>
Строка 227:
Приложение может иметь 0, 1 или больше объектов Окна. Чаще всего окно одно единственное:
 
<sourcesyntaxhighlight lang="cpp">
SubWindow, wnd = WindowObject,
</syntaxhighlight>
</source>
 
Будет хорошо, если заголовок окна будет содержать название приложения:
 
<sourcesyntaxhighlight lang="cpp">
MUIA_Window_Title, "Hello world!",
</syntaxhighlight>
</source>
 
Окно может иметь 1 (и только 1) дочерний объект (Child), обычно это группа. Наша группа будет "вертикальной" (<code>VGroup</code>), это означает что все входящие в неё дочерние объекты будут группироваться по вертикали:
 
<sourcesyntaxhighlight lang="cpp">
WindowContents, VGroup,
</syntaxhighlight>
</source>
 
Группа должна иметь, как минимум 1 дочерний объект. В нашем случае, это будет обыкновенный текст (TextObject):
 
<sourcesyntaxhighlight lang="cpp">
Child, TextObject,
</syntaxhighlight>
</source>
 
Zune поддерживаются различные escape-коды (ниже, через \33c производится центрование текста) и перевод каретки ( \n ):
 
<sourcesyntaxhighlight lang="cpp">
MUIA_Text_Contents, "\33cHello world!\nHow are you?",
</syntaxhighlight>
</source>
 
Макрос <code>End</code> должен завершать описание любого макроса вида xxxObject (в нашем случае, </code>TextObject</code>):
 
<sourcesyntaxhighlight lang="cpp">
End,
</syntaxhighlight>
</source>
 
Теперь добавим в нашу группу второй дочерний объект, кнопку! Помимо мыши, она будет откликаться на комбинацию клавиш RAmiga + o (укажем на это символом подчёркивания до буквы "O")
 
<sourcesyntaxhighlight lang="cpp">
Child, but = SimpleButton("_Ok"),
</syntaxhighlight>
</source>
 
Завершаем описание группы:
 
<sourcesyntaxhighlight lang="cpp">
End,
</syntaxhighlight>
</source>
 
Завершаем описание окна:
 
<sourcesyntaxhighlight lang="cpp">
End,
</syntaxhighlight>
</source>
 
Завершаем описание интерфейса:
 
<sourcesyntaxhighlight lang="cpp">
End;
</syntaxhighlight>
</source>
 
И что, вы всё ещё нуждаете в графических построителях интерфейсов? :-)
Строка 291:
Если любой из объектов в структуре описанной нами выше, не сможет быть создан, Zune уничтожит все объекты (включая те, которые удалось создать) и возвратит код ошибки. В противном случае, вы получите полностью рабочий интерфейс приложения:
 
<sourcesyntaxhighlight lang="cpp">
if (app != NULL)
{
...
</syntaxhighlight>
</source>
 
Когда мы завершаем работу приложения, необходимо вызвать метод <code>MUI_DisposeObject()</code>, передав ему указатель на созданную структуру приложения. Это необходимо для уничтожения всех созданных объектов и освобождения всех использованных ресурсов:
 
<sourcesyntaxhighlight lang="cpp">
...
MUI_DisposeObject(app);
}
</syntaxhighlight>
</source>
 
==== Обработка сообщений ====
Строка 309:
Обработка сообщений является простым путём создания реакций интерфейса на возникающие события (такие как, нажатие кнопки). Принцип: мы получаем сообщение, когда определённый атрибут, определённого объекта, будет установлен в определённое значение:
 
<sourcesyntaxhighlight lang="cpp">
DoMethod(wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
</syntaxhighlight>
</source>
 
Здесь, мы ожидаем когда атрибут MUIA_Window_CloseRequest нашего объекта Окна (wnd) будет установлен в <code>TRUE</code> (значит, пользователь нажал кнопку). Когда сообщение будет получено, мы предписываем нашему объекту приложения вернуть код <code>MUIV_Application_ReturnID_Quit</code> на следующей итерации цикла приложения:
 
<sourcesyntaxhighlight lang="cpp">
(IPTR)app, 2,
MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
</syntaxhighlight>
</source>
 
Поскольку требуется определить, что же именно произошло, необходимо указать число параметров передаваемых MUIM_Notify: 2 параметра.
Строка 324:
В случае кнопки «Ok», мы ожидаем когда атрибут <code>MUIA_Pressed</code> окажется установленным в <code>FALSE</code>, что будет означать нажатую и ''отпущенную'' пользователем кнопку «Ok» (реакция на простое нажатие кнопки является плохой практикой, т.к. вы можете захотеть отпустить кнопку мыши вне кнопки интерфейса, и таким образом отказаться от действия. К тому же, мы можем просто захотеть увидеть, как она выглядит в нажатом состоянии). В остальном, всё полностью аналогично предыдущему примеру:
 
<sourcesyntaxhighlight lang="cpp">
DoMethod(but, MUIM_Notify, MUIA_Pressed, FALSE,
(IPTR)app, 2,
MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
</syntaxhighlight>
</source>
 
==== Открытие окна ====
Строка 334:
Окно не будет открыто, пока вы не «попросите» Zune об этом:
 
<sourcesyntaxhighlight lang="cpp">
set(wnd, MUIA_Window_Open, TRUE);
</syntaxhighlight>
</source>
 
Если объекты согласно структуре описанной нами выше были созданы удачно, вы увидете окно. Но эта операция может завершиться с ошибкой! Таким образом, мы никогда не должны забывать проверять атрибут объекта окна, который должен быть установлен в TRUE:
 
<sourcesyntaxhighlight lang="cpp">
if (XGET(wnd, MUIA_Window_Open))
</syntaxhighlight>
</source>
 
==== Цикл приложения ====
Строка 348:
Дорогие друзья, позвольте представить вам идеальный цикл интерфейса Zune:
 
<sourcesyntaxhighlight lang="cpp">
ULONG sigs = 0;
</syntaxhighlight>
</source>
 
Никогда не забывайте обнулять сигналы (<code>sigs</code>) ... Тестовый цикл приложения с использованием метода <code>MUIM_Application_NewInput</code> :
 
<sourcesyntaxhighlight lang="cpp">
...
while((LONG) DoMethod(app, MUIM_Application_NewInput, (IPTR)&sigs)
!= MUIV_Application_ReturnID_Quit)
</syntaxhighlight>
</source>
 
Обнуление <code>sigs</code> необходимо, т.к. первые же сигналы обрабатываемых событий (возвращающие <code>Wait()</code>, или 0), должны будут изменить <code>sigs</code>, поместив туда ожидаемые Zune сигналы (до следующего <code>Wait()</code>), и вернув полученное значение. Описанный здесь механизм возврата значений, исторически был единственным способом реакции на события. Но, поскольку, он «неудобоварим» в программировании, впоследствии от него стали отказываться в пользу создания собственных классов и объектно-ориентированной структуры приложения.
Строка 364:
Тело цикла приложения. Ожидание сигналов и обработка нажатия Ctrl + С, для принудительного выхода из цикла:
 
<sourcesyntaxhighlight lang="cpp">
{
if (sigs)
Строка 373:
}
}
</syntaxhighlight>
</source>
 
==== Резюме ====