Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Создание GUI


Guest Solmir
 Share

Recommended Posts

Guest Solmir

Всем доброго времени суток!

У меня возникло желание заняться разработкой аддонов, но столкнулся вот с какой проблемой. В документации по написанию аддонов (от Нивал) не нашел ничего касательно создания GUI. Поковырял другие аддончики, но опять куча вопросов. Если с самим LUA и API клиента вроде бы все понятно, но вот касательно создания GUI.

1. Все файлы *.xdb это по сути XML файлы. И в связи с этим возникает вопрос по их составлению. (неизвестен перечень разделов и ключей)

2. Существует ли какая то типизация контролов? (кнопки, списки, комбобоксы...) Либо все контролы однотипны?

Link to comment
Share on other sites

Guest mehael
Quote:
1. Все файлы *.xdb это по сути XML файлы. И в связи с этим возникает вопрос по их составлению. (неизвестен перечень разделов и ключей)

Тут посмотрите:
"..\Allods Online\data\Mods\Docs\ModdingDocuments\ResourceSystem\"
Quote:
2. Существует ли какая то типизация контролов? (кнопки, списки, комбобоксы...) Либо все контролы однотипны?

Смотрите там же :) или в другом любом аддоне.. Естественно все контролы имеют общие и различные свойства.
Как правило в AddonDesc.(UIAddon).xdb дается ссылка на MainForm.(WidgetForm).xdb, у которого обычно имеется пару детей-Панелей, например MainPanel.(WidgetPanel).xdb..
А панели в свою очередь содержат ссылки на все остальное.. хотя если аддон простой панель не используется, т. е. все элементы являются детьми MainForm...
>_<
Link to comment
Share on other sites

Всё верно, у нас нет совершенно НИКАКОЙ официальной документации по GUI, пришлось разбираться самим... Эх, и всё таки он нужен, этот мой давным-давно обещанный учебник по созданию аддонов :) Ну что ж, напишу по-быстрому каркас одной из его частей, пока кратко, и пока без иллюстраций:

(очень) Краткое введение в создание графических интерфейсов (GUI) для аддонов АО

Вообще, на самом деле, GUI нужен НЕ каждому аддону. Есть такие аддоны, которые вообще ничего на экране не пишут и не рисуют, например AutoResurrect и AutoSellGreyAddon - им никакой GUI не нужен, они и без него прекрасно работают. Но для большинства аддонов, нужно что-то рисовать и/или писать на экране игры, поэтому GUI нужен, причём нужен сразу, на стадии начала разработки аддона. Именно поэтому, разработку аддона приходится начинать именно с разработки GUI, а уже потом, наполнять его функционалом на LUA.

Структура GUI аддонов

Элементы GUI в аддонах АО, называются виджетами. Каждый виджет - это отдельный XDB-файл. Все шаблоны виджетов (шаблоны XDB-файлов) находятся в архиве ModdingDocuments.zip, в папке ResourceSystem. А также, имеется несколько примеров их использования в SampleAddons. Виджеты (XDB-файлы) в аддонах образуют иерархию. Иерархия GUI каждого аддона начинается с "особого" виджета WidgetForm. Его рекомендую вообще не трогать, оставить всё как есть, просто вписать в него дочерние виджеты.

Лирическое отступление о WidgetForm: Хотите знать, что особенного в этом виджете? Как раз то, что если вы послушаетесь моего совета, и НЕ станете в нём ковыряться, то, скорее всего, сэкономите несколько часов собственной жизни, которые сможете потратить на что-нибудь полезное :) Иерархическая связка MainForm -> MainPanel, которую можно наблюдать не только во всех аддонах, но даже в ниваловских примерах (см. SampleAddons), очень смахивает на "масло масляное". Такое ощущение, что один из этих двух виджетов лишний... Но сколько я ни пытался использовать WidgetForm вместо "главной панели" MainPanel.(WidgetPanel).xdb, что-то получалось, а что-то нет. Например, drag&drop (перетаскивание) работает для WidgetPanel, но НЕ для WidgetForm. Казалось бы, в чём тогда логика WidgetForm, зачем он нужен, если его нельзя использовать как главный контейнер аддона? А вот не знаю, но даже сами разработчики используют её ТУПО как контейнер для MainPanel.(WidgetPanel).xdb (посмотрите их примеры в SampleAddons). Возможно, программисты Нивала что-то не доделали в WidgetForm, раз уж даже дизайнеры Нивала используют её "через задницу". Ну, приходится и нам делать то же самое. В общем, забудьте копаться в WidgetForm, делайте как все, "через задницу" - вписал в MainForm дочернюю MainPanel, и всё, дальше играйтесь с MainPanel. UPD: Эх, век живи, век учись :) Кажется, знаю, зачем нужен MainForm - чтобы можно было показывать/скрывать ВСЕ панели аддона одновременно (например, по Alt+Z), гениально простым способом - просто показывая/скрывая MainForm.

Типы виджетов

Всё гораздо проще, чем кажется :) ПОЧТИ ВСЕ аддоны построены, в основном, из всего ТРЁХ типов виджетов:

1) WidgetPanel - Самые основные виждеты, из которых можно слепить почти все детали графического оформления аддона (окна, всякие графические элементы, и даже прогрессбары). Он представляет из себя прямоугольный контейнер, с указанным размером и координатами (которые можно менять программно из LUA). У WidgetPanel всего два практических применения - ему можно назначить фоновую текстуру, И/ИЛИ внутри него может находиться дочерняя иерархия других виджетов. Обычно, иерархия аддона начинается именно с такой панели, её часто называют MainPanel.(WidgetPanel).xdb. Короче говоря, WidgetPanel очень смахивает по смыслу на элемент <div> в HTML'е.

2) WidgetTextView - Пустой контейнер для текста, он необходим для того, чтобы написать в GUI какой-нибудь статический или динамический текст. Кстати, сами тексты хранятся отдельно от этих контейнеров, в TXT-файлах, и обязательно в кодировке UTF16-LE.

3) WidgetButton - Полноценная кнопка, имеющая 3 текстуры - для нормального, подсвеченного, и нажатого состояния.

Ах да, есть ещё пара НЕвизуальных виджетов - UIRelatedTexts и UIRelatedTextures - это "коллекции" текстов и текстур соответственно, которыми можно пользоваться в LUA, программно применяя их к WidgetTextView и WidgetPanel соответственно.

Конечно, в ResourceSystem лежит ещё куча типов виджетов, из которых освоены только несколько. Но ничто никому не мешает освоить их, методом проб и ошибок.

Кстати, каждый раз, меняя что-то в LUA-файлах, достаточно только перезагрузить сам аддон (с помощью специального аддона AddonManager), а все ошибки LUA, в реальном времени, пишутся в файл Mods.txt.

А меняя что-то в XDB-файлах, приходится каждый раз ПОЛНОСТЬЮ ПЕРЕЗАГРУЖАТЬ ИГРУ (!), и накаких ошибок никуда не пишется! В связи с этим, подозреваю, у разработчиков есть какой-то специальный IDE для разработки GUI аддонов, но с нами они им не поделились.

Теги XDB-файлов

У всех виджетов, структура XDB-файла очень похожая, и различается только несколькими "специфическими" для разных типов виджетов тегами. Подавляющее же большинство xml-тегов присутствуют в каждом типе виджета, их я опишу ниже.

Кстати, половина из этих тегов НЕ ВАЖНЫ, потому что описывают какие-то второстепенные свойства, или "значения по умолчанию". Я, например, сторонник того, чтобы "минимизировать" кол-во тегов, выкинув все лишние. (Правда, выкидывая некоторые теги из виджетов, я столкнулся с тем, что нельзя выкидывать всё подряд, т.к. если, например, выкинуть <Placement>/<X>/<Align>, то вместо него становится НЕ "значение по умолчанию", а ОН НАСЛЕДУЕТСЯ от материнского виджета!)

В качестве хорошего примера, где XDB-файлы здорово упрощены для лучшего понимания устройства GUI, советую посмотреть мой аддон TargetOfTarget - аддон СПЕЦИАЛЬНО написанный как пример по созданию GUI (правда, этот аддон написан очень давно, и сейчас я бы написал этот аддон совсем иначе).

А вот значения основных тегов:

<Name> - Имя виджета. Нужно указать, чтобы иметь из LUA доступ к виджету, и/или его дочерним виджетам.

<Priority> - Число от нуля до ... . Приоритет виджета, как слоя. Это, как бы, Z-order виджета в материнском контейнере. То есть если в каком-то материнском контейнере существует несколько дочерних виджетов (все на одном уровне логической иерархии), то визуально они будут располагаться в соответствии с их <Placement> - чем число больше, тем выше.

ВАЖНО: Приоритет главной панели аддона - это особый случай. Выше неё в иерархии нет никаких материнских виджетов, поэтому, в качестве её материнского виджета выступает сам экран игры, на котором разные встроенные элементы интерфейса имеют разный <Priority> в диапазоне наверное от 1 до 2000. Но вы не промахнётесь, если будете в своих аддонах указывать приоритет главной панели = 4000. (UPD: До версии АО 1.1.04, нужно было указывать 1000).

<Children> - Список дочерних виджетов, если они есть.

<BackLayer> - Ссылка на фоновую текстуру виджета, если она нужна. (Именно так делается почти всё графическое оформление аддона - ставится панель, и указывается её фоновый рисунок.)

<Placement> - Расположение и размеры виджета. Очень интересная часть, напишу про неё отдельно, ниже.

Далее идут менее важные теги:

<Visible> - true/false - Видимый виджет или не видимый. Включать/отключать видимость виждета можно также и из LUA.

<TransparentInput> - Если true, то виджет будет "прозрачен" для нажатий мыши. Настоятельно рекомендую выставлять true для всех текстовых контейнеров (WidgetTextView)!

<reactionOnPointing> - название реакции, которая срабатывает при наведении мыши на виджет, и при уводе мыши с него. На все эти т.н. реакции можно реагировать в LUA.

<Variants> / <Item> / <Reaction> - Только у кнопки (WidgetButton). Название реакции, срабатывающее при нажатии на кнопку.

Далее идёт ещё куча редко употребляемых тегов, смысл большинства из них мне известен, но лень их сейчас описывать :) Если интересно, спрашивай.

Виртуальная система координат экрана

Перед тем, как рассказывать про <Placement>, придётся рассказать про "виртуальную" систему координат экрана, которая используется в игре. В зависимости от выставленной пользователем резолюции экрана (или окна игры, в оконном режиме), ВСЕ элементы встроенных и пользовательских аддонов, вся графика, все шрифты, все расстояния АВТОМАТИЧЕСКИ увеличиваются/уменьшаются пропорционально высоте экрана. Базовая резолюция, под которую "заточены" все GUI, и вся графика в игре, запомните - 1280x1024.

В двух словах: КАКАЯ БЫ РЕЗОЛЮЦИЯ ЭКРАНА У ВАС НИ БЫЛА, выставляете в игре резолюцию 1280x1024, делаете скриншот, и дальше, уже в Фотошопе, отмеряете все расстояния, и делаете всю графику аддона именно по этому скриншоту, под резолюцию 1280x1024. Такая графика будет как раз КАК НАДО выглядеть в игре, при любой резолюции экрана, какую бы пользователь ни выставил.

Придумано всё это как раз для того, чтобы нам НЕ приходилось ломать головы с тем, как располагать элементы GUI, и как измерять расстояния... Просто делаете всё под резолюцию 1280x1024, и всё :)

Если интересно, расскажу подробнее, что такое "виртуальная" система координат, хотя, это не так уж важно: В этой системе, всегда предполагается, что высота экрана - 1024 пикселя, а ширина зависит от пропорций экрана. Если реальная резолюция экрана 1280x1024, то она полностью совпадает с "виртуальной" - 1280x1024. А если, например, у пользователя, резолюция экрана 1920x1200, то "виртуальная" система координат будет такая: 1638x1024. Как так? Просто пропорции экрана в этой резолюции не 4:3, а 16:10. Поэтому, "виртуальная" ВЫСОТА всегда остаётся 1024, а "виртуальная" ШИРИНА вычисляется, если кому интересно, по такой формуле: РеальнаяШиринаЭкрана / РеальнаяВысотаЭкрана * 1024.

Расположение и размеры виджета (<Placement>)

И теперь, самое загадочное место - <Placement>. Оно описывает координаты И/ИЛИ размеры виджета, как по X, так и по Y, ОТНОСИТЕЛЬНО МАТЕРИНСКОГО ВИДЖЕТА. Можно придумать множество разных комбинаций тегов <Size>, <Align>, <Pos>, <HighPos> (Не обязательно указывать все эти теги, можно выборочно. Но имейте ввиду, если вы убрали тег <Aligh>, то он наследуется от родительского виджета), и каждая комбинация будет иметь разный эффект. Примеры использования будут ниже.

<Size> - Размер виджета в "виртуальных" пикселях. (Ширина для <X> или высота для <Y>).

<Align> - Привязка координат (описанных в <Pos> или <HighPos>) к какому-нибудь краю материнского виджета (или экрана, если этот виждет - главная панель). Значения:

WIDGET_ALIGN_LOW - отсчёт координат от ЛЕВОГО (для <X>) или ВЕРХНЕГО (для <Y>) края материнского виджета.

WIDGET_ALIGN_HIGH - отсчёт координат от ПРАВОГО (для <X>) или НИЖНЕГО (для <Y>) края материнского виджета.

WIDGET_ALIGN_BOTH - привязка одновременно к ЛЕВОМУ и к ПРАВОМУ (для <X>) или одновременно к ВЕРХНЕМУ и к НИЖНЕМУ (для <Y>) краям материнского виджета. Т. о., такой виджет будет менять свой размер пропорционально с материнским - это ОЧЕНЬ удобно.

WIDGET_ALIGN_CENTER - позиционирование виджета просто в центре материнского виджета (по выбранной оси - <X> или <Y>).

<Pos> или <HighPos> - позиция в "виртуальных" пикселях, от того края, что указан в <Align>. Если <Align> = WIDGET_ALIGN_LOW, то нужно указать только координату <Pos>, а если <Align> = WIDGET_ALIGN_HIGH, то нужно указать только координату <HighPos>.

Приведу несколько примеров, какие сочетания этих параметров могут быть на практике. Кстати, <X> и <Y> совершенно НЕзависимы друг от друга, и могут иметь совершенно разные сочетания параметров. Поэтому, в примерах будем считать, что я пишу про координату <X>:

<Align>WIDGET_ALIGN_LOW</Align>

<Pos>30</Pos>

<Size>100</Size>

Виджет шириной 100 пикселей, с отступом 30 пикселей от левого края материнского виджета.

<Align>WIDGET_ALIGN_HIGH</Align>

<HighPos>30</HighPos>

<Size>100</Size>

Аналогично, только отступ от правого края материнского виджета.

<Align>WIDGET_ALIGN_BOTH</Align>

<Pos>30</Pos>

<HighPos>50</HighPos>

Размер виджета НЕ указан, но он относительный, так как привязан к размеру материнского виджета (т.е. зависит от размера материнского виджета). Отступ слева - 30 пикселей, отступ справа - 50 пикселей.

<Align>WIDGET_ALIGN_CENTER</Align>

<Size>150</Size>

Виджет шириной 150 пикселей, по цен

Link to comment
Share on other sites

Quote:
очень смахивает на "масло масляное". Такое ощущение, что один из этих двух виджетов лишний...

Для каждого аддона создается слой, задается приоритет. Дальше для каждого ребенка выставляется относительная высота. В случае с громоздким многооконным(многопанельным) аддоном, если потребуется скрыть все элементы, достаточно просто погасить слой, а не выставлять параметры видимости всем панелям отдельно. По-моему, это жутко удобно =)
Хотя, может, я пересидел за САПРами о_0

Quote:
< Align > - Привязка координат (описанных в <Pos> или <HighPos>) к какому-нибудь краю материнского виджета (или экрана, если этот виждет - главная панель). Значения:

WIDGET_ALIGN_LOW - отсчёт координат от ЛЕВОГО (для <X>) или ВЕРХНЕГО (для <Y>) края материнского виджета.
WIDGET_ALIGN_HIGH - отсчёт координат от ПРАВОГО (для <X>) или НИЖНЕГО (для <Y>) края материнского виджета.
WIDGET_ALIGN_CENTER - позиционирование виджета просто в центре материнского виджета (по выбранной оси - <X> или <Y>).

А как же WIDGET_ALIGN_BOTH. Шикарная вещь. Задаются отступы от краев родителя параметрами <Pos> и <HighPos>, <Size> -- не указываем (считается автоматически). Таки образом, при изменении размеров родителя, изменяются размеры ребенка!

Думается мне, от WidgetPanel можно вовсе отказаться. WidgetButton умеет все тоже, и даже больше -)
Link to comment
Share on other sites

Guest mehael

SLA, огромное спасибо тебе от меня и от пользователей MagicianMessage :)

Теперь виджеты рисуются всегда в середине экрана >_>

Link to comment
Share on other sites

2 Duvodas

Да, очень важный пример с WIDGET_ALIGN_BOTH. Я про него забыл, т.к. писал по памяти :)

2 mehael

Не за что :) Кстати, MagicianMessage - очень нестандартный и оригинальный аддон :)

Link to comment
Share on other sites

Guest mehael

MagicianMessage .. я в него влюблен)) помогает передамаживать суровых фулфиолов))

жалко что про него мало кто знает.. и за границей не работает.. хотя у меня есть идеи как эту проблему можно решить, и заставить мои аддоны работать в иностранных версиях :)

В Евро версии можно попробовать выслеживать бафф пр дебугнейму .. жалко не имею возможности тестить..

Link to comment
Share on other sites

  • 5 months later...

Смотря куда собираетесь выводить текст. Если вы правильно создали ресурс(например WidgetTextView) и получили на него в коде ссылку, а WidgetTextView ссылается на txt файл с таким к примеру содержанием

Code:
<header alignx="center" shadow="1"><rs class="class"><tip_white><r name="time"/></tip_white></rs></header>

то изменить текст в <r name="time"/> можно таким кодом:

Code:
Widget:SetVal( "time", userMods.ToWString( String )

Соединение строк в луа

Code:
string = "1." .. string2 .. " " .. string3
Link to comment
Share on other sites

Насколько я знаю в аддонах этим еще никто никогда не пользовался.. Но есть надежда что кто-нибудь копался..

Link to comment
Share on other sites

Code:

<?xml version="1.0" encoding="UTF-8" ?>
<WidgetEditLine>
<Name>Input1</Name>
<Priority>1000</Priority>
<Children />
<BackLayer href="" />
<FrontLayer href="" />
<textureMask href="" />
<pickMask href="" />
<Placement>
<QuantumScale>false</QuantumScale>
<sizingWidget href="" />
<sizingWidgets />
<X>
<Align>WIDGET_ALIGN_LOW</Align>
<Sizing>WIDGET_SIZING_DEFAULT</Sizing>
<Pos>0</Pos>
<HighPos>50</HighPos>
<Size>100</Size>
</X>
<Y>
<Align>WIDGET_ALIGN_LOW</Align>
<Sizing>WIDGET_SIZING_DEFAULT</Sizing>
<Pos>0</Pos>
<HighPos>100</HighPos>
<Size>200</Size>
</Y>
</Placement>
<Visible>true</Visible>
<Enabled>true</Enabled>
<TabOrder>0</TabOrder>
<bindSections />
<TransparentInput>false</TransparentInput>
<PickChildrenOnly>false</PickChildrenOnly>
<IgnoreDblClick>false</IgnoreDblClick>
<fade>1</fade>
<Cursor1Layer href="" />
<Cursor2Layer href="" />
<CursorWidth>2</CursorWidth>
<CursorChangeTimeMs>500</CursorChangeTimeMs>
<ReactionEsc />
<ReactionEnter />
<ReactionChanged />
<TextStyle>
<multiline>false</multiline>
<wrapText>true</wrapText>
<showClippedSymbol>false</showClippedSymbol>
<showClippedLine>true</showClippedLine>
<lineSpacing>0</lineSpacing>
<ellipsis>true</ellipsis>
<Align>ALIGNY_DEFAULT</Align>
</TextStyle>
<isPassword>false</isPassword>
<maxSymbolsCount>-1</maxSymbolsCount>
<filterAlias />
<globalClassName />
<selectionClassName />
<selectionLayer href="" />
</WidgetEditLine>


я так понимаю надо вот сюда что-то вставить или правильно указать положение на экране
Link to comment
Share on other sites

Да, конечно, нужно указать координаты и размер WidgetEditLine. Это делается точно так же, как и для всех остальных типов виджетов - в <Placement>.

Никто никогда ещё не сделал ни одного WidgetEditLine. Хотя, пора человек пробовали. Плохо пробовали, наверное, потому, что разгадать, как это работает, МОЖНО.

Имхо, здесь нужно прописать какой-то слой. Вероятно, слой для курсора, или сам курсор:

<Cursor1Layer href="" />

<Cursor2Layer href="" />

Имхо, здесь тоже нужно что-то указать. Не знаю, что.

<selectionLayer href="" />

Но, для начала, можно попробовать ничего не указывать в этих тегах. САМЫЙ ГЛАВНЫЙ тег - вот этот, его обязательно нужно заполнить:

<ReactionEnter />

например, так:

<ReactionEnter>enter</ReactionEnter>

Затем, в Lua-коде, пишем функцию-реакцию на событие "enter", и не забываем зарегистрировать эту реакцию (как всё это делается, можно посмотреть в ниваловском примере SampleReactionHandler). В коде реакции, можно взять значение Editline'а примерно так:

local wsGotIt = wtEditLine:GetText()

Если нужен не WString, а string, тогда так:

local strGotIt = userMods.FromWString( wtEditLine:GetText() )

Link to comment
Share on other sites

да без

<Cursor1Layer href="" />

<Cursor2Layer href="" />

поле работает но курсора в нем нету (( в слепую тыкаю мышкой и ввожу данные.

туда видимо нужно картинки вставить для мигания курсора... как бы их из игры (в чате) выцепить??

Link to comment
Share on other sites

Добрый день, у меня нубский вопрос)

Надо нарисовать прямоугольник определенного цвета. Посмотрел как это сделано в других аддонах. Используется WidgetPanel с какой-то простенькой текстурой, а цвет задается методом :SetBackgroundColor({r,g,b,a}).

Допустим, мне нужно сделать простой непрозрачный прямоугольник некого цвета RGB. Но если не указать текстуру в поле BackLayer, то происходит ошибка при выполнении SetBackgroundColor.

Собственно вопрос - можно ли сделать панель просто залитой цветом, без текстуры?

Если нет, то какой должна быть текстура, что бы цвет панели был ровным и точно соответствовал заданным значениям RGB?

Link to comment
Share on other sites

Not a "нубский вопрос", just create a simple low memory texture as the background layer, usually a couple shades of white/gray.

Google Translate:

Не "нубский вопрос", просто создать простой, дешевый текстурной памяти в качестве фонового слоя, как правило, пару оттенков белого / серого цвета.

Link to comment
Share on other sites

для поля ввода <WidgetEditLine> можно сделать проще - просто для его выделения добавить

<Item href="Input1Panel.(WidgetPanel).xdb#xpointer(/WidgetPanel)" />

в потомки главной апнели и позицию совместить с WidgetEditLine

Link to comment
Share on other sites

Пока нет.

Хотя, Tycere, автор аддона "QuestTracker", сделал какой-то инструмент для ускоренной разработки графических интерфейсов. Надо бы потросить его, чтобы поделился :) Мне тоже очень интересно посмотреть, что это такое.

Link to comment
Share on other sites

You CAN make it without the texture itself, but you CAN'T make it without a layer for this texture. So, you can delete this texture, but you have to leave the *.(WidgetLayerSimpleTexture).xdb file with an empty <textureItem> tag:

Code:
<textureItem href="" />
Link to comment
Share on other sites

EN:

I published this library with sample project, so the project from the quest tracker, on that side already. I just add few buttons and see how fast and easy it is. :)

I am glad that I've done my work. If I can think of a good description and a guide, then I'll make it purely in this forum.

So you can find it here:

http://ui9.ru/forum/questtracker/topic/1049/t1049-QuestTracker-Tool-Sourcecode

It requires Visual C # 2010 and perhaps experience in C-Sharp.

RU: (Google Translate)

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

Я рад, что я сделал свою работу. Если я могу думать о хорошем описание и руководство, то я сделаю это чисто в этом форуме.

Таким образом, вы можете посмотреть здесь:

http://ui9.ru/forum/questtracker/topic/1049/t1049-QuestTracker-Tool-Sourcecode

Она требует Visual C # 2010 и, возможно, опыт работы в C-Sharp.

Link to comment
Share on other sites

как я сделала WidgetEditLine

взяла окантовку стандартную от MainPanel:

Code:
<BackLayer href="MainFrame.(WidgetLayerTiledTexture).xdb#xpointer(/WidgetLayerTiledTexture)" />

и создала панель WidgetPanel с этой окантовкой и расположением как у WidgetEditLine :

Code:
<?xml version="1.0" encoding="UTF-8" ?>

<WidgetPanel>

<Name></Name>

<Priority>0</Priority>

<Children />

<BackLayer href="MainFrame.(WidgetLayerTiledTexture).xdb#xpointer(/WidgetLayerTiledTexture)" />

<Placement>

<X>

<Align>WIDGET_ALIGN_LOW</Align>

<Pos>78</Pos>

<Size>100</Size>

</X>

<Y>

<Pos>35</Pos>

<Size>45</Size>

</Y>

</Placement>

</WidgetPanel>

затем эту панель поставила под WidgetEditLine:

Code:
<Item href="Input1.(WidgetEditLine).xdb#xpointer(/WidgetEditLine)" />

<Item href="Input1Panel.(WidgetPanel).xdb#xpointer(/WidgetPanel)" />

а текстуры взяла стандартные.

полный пример использования в AucEDSman

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use