Ru/Understanding VGUI2 Resource Files: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
(Created page with "{{otherlang2 |title=Устройство файлов ресурсов в VGUI2 |en=Understanding_VGUI2_Resource_Files }} = Введение = Я стал свидетелем...")
 
m (obsolete language category)
 
(16 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar|title = Устройство файлов ресурсов в VGUI2}}
|title=Устройство файлов ресурсов в VGUI2
 
|en=Understanding_VGUI2_Resource_Files
}}
= Введение =
= Введение =
Я стал свидетелем большого замешательства, когда спросил других программистов, как система VGUI2 взаимодействует с файлами ресурсов, и я не нашел полной справки по их использованию, так что вот.
Я стал свидетелем большого замешательства, когда спросил других программистов, как система VGUI2 взаимодействует с файлами ресурсов, и я не нашел полной справки по их использованию, так что вот.
Line 12: Line 10:


= Дизайн =
= Дизайн =
Файлы ресурсов представляют собой простые [[KeyValues]], которые анализируются сверху вниз: каждый элемент управления, указанный в файле, создается с помощью фабрики элементов управления, и его настройки применяются в иерархическом порядке..
Файлы ресурсов представляют собой простые {{L|KeyValues}}, которые анализируются сверху вниз: каждый элемент управления, указанный в файле, создается с помощью фабрики элементов управления, и его настройки применяются в иерархическом порядке..


== При создании новой внутриигровой панели ==
== При создании новой внутриигровой панели ==
Line 25: Line 23:


=== Изменение элементов управления, сгенерированных файлом ресурсов, в коде ===
=== Изменение элементов управления, сгенерированных файлом ресурсов, в коде ===
Let's say you've made your own panel and put some ImagePanels in the resource file. If you wish to modify an automatically generated control, you only need to do a few things:
Допустим, вы создали свою собственную панель и поместили несколько ImagePanels в файл ресурсов. Если вы хотите изменить автоматически созданный элемент управления, вам нужно сделать только несколько вещей:
* Create a pointer for the control in your header file:
* Создайте указатель для элемента управления в файле заголовка:
<source lang="cpp">
<source lang="cpp">
vgui::ImagePanel* m_pTestImage;
vgui::ImagePanel* m_pTestImage;
</source>
</source>
* Populate the control in your constructor:
* Заполните элемент управления в своем конструкторе:
<source lang="cpp">
<source lang="cpp">
m_pTestImage = dynamic_cast<ImagePanel*>( FindChildByName( "NameOfPanelInResourceFile", true ) );
m_pTestImage = dynamic_cast<ImagePanel*>( FindChildByName( "NameOfPanelInResourceFile", true ) );
</source>
</source>
If you're using Source SDK 2013, you can use the shorter template method instead:
Если вы используете Source SDK 2013, вы можете вместо этого использовать более короткий метод шаблона.:
<source lang="cpp">
<source lang="cpp">
m_pTestImage = FindControl<ImagePanel>( "NameOfPanelInResourceFile", true );
m_pTestImage = FindControl<ImagePanel>( "NameOfPanelInResourceFile", true );
</source>
</source>
{{Warning|Make sure you call this line '''after''' you've loaded the resource file, or you'll always get a NULL pointer back!}}
{{warning|Убедитесь, что вы вызываете эту строку '''после''' загрузки файла ресурсов, иначе вы всегда получите обратно NULL-указатель!}}
* Done! You can now access the ImagePanel (don't forget to check for null pointers!)
* Готово! Теперь вы можете получить доступ к ImagePanel (не забудьте проверить нулевые указатели!)


Don't worry about having to clean up the auto-generated panels; they do that themselves.
Не беспокойтесь о необходимости очистки автоматически созданных панелей; они делают это сами.


== When creating a new type of control ==
== При создании нового типа контроля ==
=== Factory ===
=== Завод (с утра на него) ===
The system needs to know which controls can be built using a factory method. This is necessary to automatically create controls when reading a resource file. It uses the following macro for this:
Системе необходимо знать, какие элементы управления можно создать с использованием заводского метода. Это необходимо для автоматического создания элементов управления при чтении файла ресурсов. Для этого используется следующий макрос:
<source lang="cpp">
<source lang="cpp">
DECLARE_BUILD_FACTORY( Label );
DECLARE_BUILD_FACTORY( Label );
Line 60: Line 58:
</source>
</source>


If you want to pass other parameters, or you have non-nullable parameters that require a default value, you can use '''DECLARE_BUILD_FACTORY_CUSTOM''':
Если вы хотите передать другие параметры или у вас есть параметры, не допускающие значения NULL, для которых требуется значение по умолчанию, вы можете использовать '''DECLARE_BUILD_FACTORY_CUSTOM''':


<source lang="cpp">
<source lang="cpp">
Line 71: Line 69:
}
}


// Takes the class name and the method name. Ensure that the method is defined before this line!
// Принимает имя класса и имя метода. Убедитесь, что метод определен перед этой строкой!
DECLARE_BUILD_FACTORY_CUSTOM( ComboBoxNew, ComboBoxNew_Factory );
DECLARE_BUILD_FACTORY_CUSTOM( ComboBoxNew, ComboBoxNew_Factory );
</source>
</source>


=== Applying Settings ===
=== Применение настроек ===
The method '''ApplySettings( KeyValues* inResourceData )''' is what does the heavy lifting when laying out your control. Because of the hierarchical structure of the controls (A inherits from B, B inherits from C, etc), it is very easy to create a new control whose particular settings can be data-driven (that is, initialized from the resource file). Here is an example:
Метод '''ApplySettings( KeyValues* inResourceData )''' это то, что делает тяжелый подъем при выкладывании вашего контроля. Из-за иерархической структуры элементов управления (A наследуется от B, B наследуется от C и т. Д.) Очень легко создать новый элемент управления, конкретные настройки которого могут управляться данными (то есть инициализироваться из файла ресурсов). Вот пример:


Say your control, '''ImagePanelBetter''', inherits from '''ImagePanel'''. You would then override the virtual '''ApplySettings()''' function and read things for your control:
Скажите, что ваш элемент управления, '' 'ImagePanelBetter' '', наследуется от '' 'ImagePanel' ''. Затем вы переопределите виртуальную функцию '' 'ApplySettings ()' '' и прочтите что-нибудь для своего контроля:
<source lang="cpp">
<source lang="cpp">
void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
Line 104: Line 102:
</source>
</source>


Pretty simple, no?
Довольно просто, не так ли?


Because resource files are simply KeyValues, you can also nest items:
Поскольку файлы ресурсов представляют собой просто KeyValues, вы также можете вкладывать элементы:
<source lang="cpp">
<source lang="cpp">
void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
Line 120: Line 118:
</source>
</source>


= Hierarchical overview of keys in resource files =
= Иерархический обзор ключей в файлах ресурсов =
This is an overview of which keys are defined where in code and what their function is.
Это обзор того, какие ключи определены в коде и каковы их функции.
== Panel ==
== Панель ==
'''Description:''' A simple control that is the basis for all other VGUI controls. Contains many overrideable functions.
'''Описание:''' Простой элемент управления, который является основой для всех других элементов управления VGUI. Содержит множество переопределяемых функций.


'''Inherits from:''' ''None''
'''Наследуется от:''' ''None''


* '''fieldName:''' Determines the name of the control.
* '''fieldName:''' Определяет имя элемента управления.
* '''xpos:''' Determines the horizontal offset from the top left (by default) of the parent panel.
* '''xpos:''' Определяет горизонтальное смещение от верхнего левого угла (по умолчанию) родительской панели.
* '''ypos;''' Determines the vertical offset from the top left (by default) of the parent panel.
* '''ypos;''' Определяет вертикальное смещение от верхнего левого угла (по умолчанию) родительской панели.
* '''wide:''' Determines the width of the control.
* '''wide:''' Определяет ширину элемента управления.
* '''tall:''' Determines the height of the control.
* '''tall:''' Определяет высоту элемента управления.
{{Tip|You can [[VGUI_Position_and_Size_Flags|apply an offset to these four position/size variables by using a position or size flag.]]}}
{{tip|Вы можете {{L|VGUI_Position_and_Size_Flags|применить смещение к этим четырем переменным положения / размера с помощью флага положения или размера.}}}}
* '''zpos:''' Determines the depth of the panel. Deeper panels are drawn first. Lower numbers = deeper.
* '''zpos:''' Определяет глубину панели. Сначала рисуются более глубокие панели. Меньшие числа = глубже.
* '''visible:''' Determines if the control will be drawn.
* '''visible:''' Определяет, будет ли отображаться элемент управления.
{{Tip|Any controls that have this control as a parent will also be hidden/shown.}}
{{tip|Любые элементы управления, у которых этот элемент управления является родительским, также будут скрыты / показаны.}}
* '''enabled:''' Determines if the control is enabled. Used by controls higher up the chain (like Buttons).
* '''enabled:''' Определяет, включен ли элемент управления. Используется элементами управления выше по цепочке (например, кнопками).
* '''tabPosition:''' Determines the tab order of the control.
* '''tabPosition:''' Определяет порядок табуляции элемента управления.
* '''tooltiptext:''' Determines the tooltip text to show when you hover over this control.
* '''tooltip:rutext:''' Определяет текст всплывающей подсказки, отображаемый при наведении курсора на этот элемент управления.
* '''paintbackground:''' Paint the background color of this control?
* '''paintbackground:''' Нарисуйте цвет фона этого элемента управления?
* '''paintborder:''' Paint the border of this control?


There are also a number of '''overridable colors''' defined in several controls. '''Panel''' checks the ones of itself and its children and has the following defined:
Есть также ряд '''переопределяемых цветов''', определенных в нескольких элементах управления. '''Panel''' проверяет себя и своих дочерних элементов и имеет следующие определения:
* '''fgcolor_override:''' Overrides the color of the foreground (for Labels, this is the text color).
* '''fgcolor_override:''' Переопределяет цвет переднего плана (для надписей это цвет текста).
* '''bgcolor_override:''' Overrides the color of the background.
* '''bgcolor_override:''' Переопределяет цвет фона.
{{Tip|Write color values as follows: "R G B A" or "ColorNameInScheme". Example: "fgcolor_override" "255 0 0 255" or "fgcolor_override" "My.Custom.Color"}}
{{tip|Запишите значения цвета следующим образом: "R G B A" or "ColorNameInScheme". Пример: "fgcolor_override" "255 0 0 255" or "fgcolor_override" "My.Custom.Color"}}


== Label ==
== Label ==
'''Description:''' A control that can display (wrapped) text.
'''Описание:''' Элемент управления, который может отображать (переносить) текст.


'''Inherits from:''' ''Panel''
'''Наследуется от:''' ''Panel''


* '''labelText:''' Determines the text that the label will display.
* '''labelText:''' Определяет текст, который будет отображаться на метке.
{{Tip|Putting text between a percentage sign will make it a localized variable. For example, the string '''%test%''' will create a localized string '''#var_test'''. See [[VGUI_Documentation#Localization|VGUI Localization]] for more info on localized strings.}}
{{tip|Помещение текста между знаком процента сделает его локализованной переменной. Например, строка '''% test%''' создаст локализованную строкуg '''#var_test'''. Смотрите [[VGUI_Documentation#Localization|VGUI Localization]] для получения дополнительной информации о локализованных строках.}}
{{Tip|You can also just assign a non-changing localized string by adding the control sign, '''#''', in front of a string: '''#test''' will get looked up in the list of tokens, and the localized text will be displayed in its place.}}
{{tip|Вы также можете просто назначить неизменяемую локализованную строку, добавив знак управления, '''#''' перед строкой: '''#test''' будет искать в списке токенов, а локализованный текст будет отображаться на его месте.}}
* '''textAlignment:''' Determines the alignment of the label.
* '''textAlignment:''' Определяет выравнивание метки.
{{Tip|Valid values are '''north-west''', '''north''', '''north-east''', '''west''', '''center''', '''east''', '''south-west''', '''south''' and '''south-east'''.}}
{{tip|Допустимые значения: '''north-west''', '''north''', '''north-east''', '''west''', '''center''', '''east''', '''south-west''', '''south''' and '''south-east'''.}}
* '''associate:''' Allows the label to be associated with another control. {{Todo|See what uses this has.}}
* '''associate:''' Позволяет связать метку с другим элементом управления. {{Todo|Посмотрите, для чего это нужно.}}
* '''dulltext:''' A boolean that determines if text should be displayed in a dull manner.
* '''dulltext:''' Логическое значение, определяющее, должен ли текст отображаться скучно.
* '''brighttext:''' A boolean that determines if text should be displayed in a bright manner.
* '''brighttext:''' Логическое значение, определяющее, должен ли текст отображаться ярко.
{{Tip|You can only have one of these two active. The one that is defined first is chosen.}}
{{tip|У вас может быть только один из этих двух активных. Выбирается тот, который определен первым.}}
* '''font:''' Determines the font used by the label. Use the font name as defined in the '''SourceScheme.res''' file.
* '''font:''' Определяет шрифт, используемый меткой. Используйте имя шрифта, как определено в файле '''SourceScheme.res'''.
* '''wrap:''' Determines if your label wraps around the available space.
* '''wrap:''' Определяет, охватывает ли Ваш Label доступное пространство.
* '''centerwrap:''' Same as above, except it also works for centered text.
* '''centerwrap:''' То же, что и выше, за исключением того, что это также работает для центрированного текста.
* '''textinsetx:''' Additional horizontal offset space from whichever side it is aligned.
* '''textinsetx:''' Дополнительное пространство смещения по горизонтали с какой бы стороны оно ни было выровнено.
* '''textinsety:''' Additional vertical offset space from whichever side it is aligned.
* '''textinsety:''' Дополнительное пространство вертикального смещения с какой бы стороны оно ни было выровнено.


== Button ==
== Кнопка ==
'''Description:''' A control that can display (wrapped) text and act as a button.
'''Описание:''' Элемент управления, который может отображать (переносить) текст и действовать как кнопка.


'''Inherits from:''' ''Label''
'''Наследуется от:''' ''Label''


* '''command:''' Determines which command to fire to the '''OnCommand''' handler when pressed.
* '''command:''' Определяет, какая команда запускается в обработчике '''OnCommand''' при нажатии.
* '''default:''' A boolean that determines if this button is to be activated when the user presses the enter or space bar keys. Only one such button can exist.
* '''default:''' Логическое значение, определяющее, должна ли эта кнопка активироваться, когда пользователь нажимает клавиши Enter или пробела. Может существовать только одна такая кнопка.
* '''selected:''' A boolean that determines if this button appears to have been selected.
* '''selected:''' Логическое значение, определяющее, была ли выбрана эта кнопка.
* '''sound_armed:''' Determines what sound the button makes when hovered over.
* '''sound_armed:''' Определяет, какой звук издает кнопка при наведении курсора.
* '''sound_depressed:''' Determines what sound the button makes when pressed upon.
* '''sound_depressed:''' Определяет, какой звук издает кнопка при нажатии.
* '''sound_released:''' Determines what sound the button makes when released.
* '''sound_released:''' Определяет, какой звук будет издавать кнопка при отпускании.
== ImagePanel ==
== ImagePanel ==
'''Description:''' Essentially an image.
'''Описание:''' По сути, образ.


'''Inherits from:''' ''Panel''
'''Наследуется от:''' ''Panel''


* '''scaleImage:''' A boolean that determines whether to scale the image to its specified width and height.
* '''scaleImage:''' Логическое значение, определяющее, масштабировать ли изображение до указанной ширины и высоты.
* '''scaleAmount:''' A float that determines how much the image should scale.
* '''scaleAmount:''' Поплавок, определяющий масштаб изображения.
* '''tileImage:''' A boolean that determines whether to tile the image.
* '''tileImage:''' Логическое значение, определяющее, размещать ли изображение мозаикой.
* '''tileHorizontally:''' A boolean that determines whether to tile the image horizontally.
* '''tileHorizontally:''' Логическое значение, определяющее, размещать ли изображение мозаикой по горизонтали.
* '''tileVertically:''' A boolean that determines whether to tile the image vertically.
* '''tileVertically:''' Логическое значение, определяющее, размещать ли изображение вертикально.
* '''image:''' The actual image. Expects a path to a .VMT file in the '''/materials/vgui''' folder.
* '''image:''' Tреальное изображение. Ожидает путь к файлу .VMT в папке '''/materials/vgui'''.
{{Tip|Example: Say that your .VMT file is called '''example1.vmt''' and is located in '''/materials/vgui/examples''', then the path you should put here would be '''examples/example1'''.}}
{{tip|Пример: допустим, что ваш файл .VMT называется '''example1.vmt''' и расположен в '''/materials/vgui/examples''', тогда путь, который вы должны указать здесь, будет '''examples/example1'''».}}
{{Tip|'''Confirmed on Windows machine - '''You can go up a folder by including ../ in your file path. For example, to access '''example.vmt''' in '''/materials/images''', use '''../images/example''' as your path.}}
{{tip|'''Подтверждено на компьютере с Windows -''' Вы можете перейти по папке вверх, включив ../ в путь к файлу. Например, чтобы получить доступ к '''example.vmt''' в '''/materials/images''', используйте '''../images/example''' в качестве пути.}}
* '''fillcolor:''' Determines the background color behind the image. Only painted if the alpha is higher than 0 (duh)
* '''fillcolor:''' Определяет цвет фона за изображением. Окрашивается, только если альфа больше 0 (да)
{{Tip|You can specify a color in both RGBA format or refer to a color in the scheme files by just putting its name as the value.}}
{{tip|Вы можете указать цвет как в формате RGBA, так и обратиться к цвету в файлах схемы, просто указав его имя в качестве значения.}}
* '''border:''' Determines the border around the image. You can only refer to colors defined in the scheme files here using the names of the colors!
* '''border:''' Определяет границу вокруг изображения. Вы можете ссылаться только на цвета, определенные в файлах схемы, используя названия цветов!


== EditablePanel ==
== EditablePanel ==
'''Description:''' A window-like control that can house other controls, which can be edited using the [[VGUI_Documentation#Build_mode|VGUI Build Mode]].
'''Описание:''' Окно-подобный элемент управления, который может содержать другие элементы управления, которые можно редактировать с помощью [[VGUI_Documentation#Build_mode|VGUI Build Mode]].


'''Inherits from:''' ''Panel''
'''Наследуется от:''' ''Panel''


== Frame ==
== Frame ==
'''Description:''' A dynamically resizeable control that can be dragged around. Has a title bar, close and minimization buttons, etc.
'''Описание:''' Элемент управления с динамически изменяемым размером, который можно перетаскивать. Имеет строку заголовка, кнопки закрытия и сворачивания и т.Д.


'''Inherits from:''' ''EditablePanel''
'''Наследуется от:''' ''EditablePanel''


{{Note|the Frame control overrides the '''"visible"''' key defined in ''Panel''.}}
{{Note|элемент управления Frame имеет приоритет над ключом '''"visible"''', определенным в ''Panel''.}}
*'''title:''' Determines the title of the frame.
*'''title:''' Определяет заголовок кадра.
*'''title_font:''' Determines what font the title of the frame will use.
*'''title_font:''' Определяет, какой шрифт будет использоваться в заголовке фрейма.
*'''clientinsetx_override:''' Overrides the default horizontal offset from the left side of the panel.
*'''clientinsetx_override:''' Переопределяет горизонтальное смещение по умолчанию от левой стороны панели.
Color overrides:
Цвет отменяет:
*'''infocus_bgcolor_override:''' Override for the background color of the panel when it is in focus.
*'''infocus_bgcolor_override:''' Переопределить цвет фона панели, когда она находится в фокусе.
*'''outoffocus_bgcolor_override:''' Override for the background color of the panel when it is out of focus.
*'''outoffocus_bgcolor_override:''' Переопределить цвет фона панели, когда она не в фокусе.
*'''titlebarbgcolor_override:''' Override for the background color of the title bar when it is in focus.
*'''titlebarbgcolor_override:''' Переопределение цвета фона строки заголовка, когда она находится в фокусе.
*'''titlebardisabledbgcolor_override:''' Override for the background color of the title bar when it is out of focus.
*'''titlebardisabledbgcolor_override:''' Переопределение цвета фона строки заголовка, когда она не в фокусе.
*'''titlebarfgcolor_override:''' Override for the foreground color of the title bar when it is in focus.
*'''titlebarfgcolor_override:''' Переопределение цвета переднего плана строки заголовка, когда она находится в фокусе.
*'''titlebardisabledfgcolor_override:''' Override for the foreground color of the title bar when it is out of focus.
*'''titlebardisabledfgcolor_override:''' Переопределить цвет переднего плана строки заголовка, когда он не в фокусе.


{{Todo|Not done yet!}}
{{Todo|Это ещё не конец!}}


[[Category:Programming]]
{{ACategory|Programming}}
[[Category:VGUI]]
{{ACategory|VGUI}}

Latest revision as of 04:08, 22 August 2024

English (en)Русский (ru)Translate (Translate)

Введение

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

Что они делают

Файлы ресурсов используются для автоматического создания элементов управления (= панелей), которые можно поместить в родительский элемент управления. Таким образом, сделать макет панели намного проще. Следовательно, файлы ресурсов очень удобны, когда вы создаете собственную внутриигровую панель и хотите, чтобы тяжелый подъем макета выполнялся автоматически.

Note.pngПримечание:Файлы ресурсов не имеют ничего общего с (автоматическим) созданием новых «типов» элементов управления: они просто дайджест того, какие элементы управления размещаются, где и как они инициализируются.

Дизайн

Файлы ресурсов представляют собой простые KeyValues(en), которые анализируются сверху вниз: каждый элемент управления, указанный в файле, создается с помощью фабрики элементов управления, и его настройки применяются в иерархическом порядке..

При создании новой внутриигровой панели

Загрузка .res файла

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

LoadControlSettings( "Path/To/Resource/File.res" );

Настройка управления в игре

Смотрите The VGUI Build Mode чтобы получить больше информации.

Изменение элементов управления, сгенерированных файлом ресурсов, в коде

Допустим, вы создали свою собственную панель и поместили несколько ImagePanels в файл ресурсов. Если вы хотите изменить автоматически созданный элемент управления, вам нужно сделать только несколько вещей:

  • Создайте указатель для элемента управления в файле заголовка:
vgui::ImagePanel* m_pTestImage;
  • Заполните элемент управления в своем конструкторе:
m_pTestImage = dynamic_cast<ImagePanel*>( FindChildByName( "NameOfPanelInResourceFile", true ) );

Если вы используете Source SDK 2013, вы можете вместо этого использовать более короткий метод шаблона.:

m_pTestImage = FindControl<ImagePanel>( "NameOfPanelInResourceFile", true );
Warning.pngПредупреждение:Убедитесь, что вы вызываете эту строку после загрузки файла ресурсов, иначе вы всегда получите обратно NULL-указатель!
  • Готово! Теперь вы можете получить доступ к ImagePanel (не забудьте проверить нулевые указатели!)

Не беспокойтесь о необходимости очистки автоматически созданных панелей; они делают это сами.

При создании нового типа контроля

Завод (с утра на него)

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

DECLARE_BUILD_FACTORY( Label );

This method will attempt to create an instance of the control with a constructor with two parameters, which are both NULL:

#define DECLARE_BUILD_FACTORY( className )										\
	static vgui::Panel *Create_##className##( void )							\
		{																		\
			return new className( NULL, NULL );									\
		};																		\
		static vgui::CBuildFactoryHelper g_##className##_Helper( #className, Create_##className## );\
	className *g_##className##LinkerHack = NULL;

Если вы хотите передать другие параметры или у вас есть параметры, не допускающие значения NULL, для которых требуется значение по умолчанию, вы можете использовать DECLARE_BUILD_FACTORY_CUSTOM:

// Example: ComboBoxNew inherits from ComboBox

// Custom ComboBoxNew method
vgui::Panel *ComboBoxNew_Factory()
{
	return new ComboBoxNew( NULL, NULL, 5, true );
}

// Принимает имя класса и имя метода. Убедитесь, что метод определен перед этой строкой!
DECLARE_BUILD_FACTORY_CUSTOM( ComboBoxNew, ComboBoxNew_Factory );

Применение настроек

Метод ApplySettings( KeyValues* inResourceData ) это то, что делает тяжелый подъем при выкладывании вашего контроля. Из-за иерархической структуры элементов управления (A наследуется от B, B наследуется от C и т. Д.) Очень легко создать новый элемент управления, конкретные настройки которого могут управляться данными (то есть инициализироваться из файла ресурсов). Вот пример:

Скажите, что ваш элемент управления, 'ImagePanelBetter' , наследуется от 'ImagePanel' . Затем вы переопределите виртуальную функцию 'ApplySettings ()' и прочтите что-нибудь для своего контроля:

void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
{
	// VERY IMPORTANT: ALWAYS CALL THE BASE CLASS!
	BaseClass::ApplySettings( inResourceData );

	const char *value = NULL;
	value = inResourceData->GetString("normalImage", "");
	if (*value)
		UpdateNormalImage( value );

	value = inResourceData->GetString("mouseoverImage", "");
	if (*value)
		UpdateMouseOverImage( value );

	value = inResourceData->GetString("mouseclickImage", "");
	if (*value)
		UpdateMouseClickImage( value );

	value = inResourceData->GetString("command", "");
	if (*value)
		UpdateCommand( value );
}

Довольно просто, не так ли?

Поскольку файлы ресурсов представляют собой просто KeyValues, вы также можете вкладывать элементы:

void ImagePanelBetter::ApplySettings(KeyValues *inResourceData)
{
	// VERY IMPORTANT: ALWAYS CALL THE BASE CLASS!
	BaseClass::ApplySettings( inResourceData );

	KeyValues* nestedItem;
	nestedItem = inResourceData->FindKey( "NameOfNestedItemInResourceFile" );
	if (nestedItem )
		DoStuff( nestedItem );
}

Иерархический обзор ключей в файлах ресурсов

Это обзор того, какие ключи определены в коде и каковы их функции.

Панель

Описание: Простой элемент управления, который является основой для всех других элементов управления VGUI. Содержит множество переопределяемых функций.

Наследуется от: None

  • fieldName: Определяет имя элемента управления.
  • xpos: Определяет горизонтальное смещение от верхнего левого угла (по умолчанию) родительской панели.
  • ypos; Определяет вертикальное смещение от верхнего левого угла (по умолчанию) родительской панели.
  • wide: Определяет ширину элемента управления.
  • tall: Определяет высоту элемента управления.
Tip.pngСовет:Вы можете применить смещение к этим четырем переменным положения / размера с помощью флага положения или размера.(en)
  • zpos: Определяет глубину панели. Сначала рисуются более глубокие панели. Меньшие числа = глубже.
  • visible: Определяет, будет ли отображаться элемент управления.
Tip.pngСовет:Любые элементы управления, у которых этот элемент управления является родительским, также будут скрыты / показаны.
  • enabled: Определяет, включен ли элемент управления. Используется элементами управления выше по цепочке (например, кнопками).
  • tabPosition: Определяет порядок табуляции элемента управления.
  • tooltip:rutext: Определяет текст всплывающей подсказки, отображаемый при наведении курсора на этот элемент управления.
  • paintbackground: Нарисуйте цвет фона этого элемента управления?

Есть также ряд переопределяемых цветов, определенных в нескольких элементах управления. Panel проверяет себя и своих дочерних элементов и имеет следующие определения:

  • fgcolor_override: Переопределяет цвет переднего плана (для надписей это цвет текста).
  • bgcolor_override: Переопределяет цвет фона.
Tip.pngСовет:Запишите значения цвета следующим образом: "R G B A" or "ColorNameInScheme". Пример: "fgcolor_override" "255 0 0 255" or "fgcolor_override" "My.Custom.Color"

Label

Описание: Элемент управления, который может отображать (переносить) текст.

Наследуется от: Panel

  • labelText: Определяет текст, который будет отображаться на метке.
Tip.pngСовет:Помещение текста между знаком процента сделает его локализованной переменной. Например, строка % test% создаст локализованную строкуg #var_test. Смотрите VGUI Localization для получения дополнительной информации о локализованных строках.
Tip.pngСовет:Вы также можете просто назначить неизменяемую локализованную строку, добавив знак управления, # перед строкой: #test будет искать в списке токенов, а локализованный текст будет отображаться на его месте.
  • textAlignment: Определяет выравнивание метки.
Tip.pngСовет:Допустимые значения: north-west, north, north-east, west, center, east, south-west, south and south-east.
  • associate: Позволяет связать метку с другим элементом управления.
    Нужно сделать: Посмотрите, для чего это нужно.
  • dulltext: Логическое значение, определяющее, должен ли текст отображаться скучно.
  • brighttext: Логическое значение, определяющее, должен ли текст отображаться ярко.
Tip.pngСовет:У вас может быть только один из этих двух активных. Выбирается тот, который определен первым.
  • font: Определяет шрифт, используемый меткой. Используйте имя шрифта, как определено в файле SourceScheme.res.
  • wrap: Определяет, охватывает ли Ваш Label доступное пространство.
  • centerwrap: То же, что и выше, за исключением того, что это также работает для центрированного текста.
  • textinsetx: Дополнительное пространство смещения по горизонтали с какой бы стороны оно ни было выровнено.
  • textinsety: Дополнительное пространство вертикального смещения с какой бы стороны оно ни было выровнено.

Кнопка

Описание: Элемент управления, который может отображать (переносить) текст и действовать как кнопка.

Наследуется от: Label

  • command: Определяет, какая команда запускается в обработчике OnCommand при нажатии.
  • default: Логическое значение, определяющее, должна ли эта кнопка активироваться, когда пользователь нажимает клавиши Enter или пробела. Может существовать только одна такая кнопка.
  • selected: Логическое значение, определяющее, была ли выбрана эта кнопка.
  • sound_armed: Определяет, какой звук издает кнопка при наведении курсора.
  • sound_depressed: Определяет, какой звук издает кнопка при нажатии.
  • sound_released: Определяет, какой звук будет издавать кнопка при отпускании.

ImagePanel

Описание: По сути, образ.

Наследуется от: Panel

  • scaleImage: Логическое значение, определяющее, масштабировать ли изображение до указанной ширины и высоты.
  • scaleAmount: Поплавок, определяющий масштаб изображения.
  • tileImage: Логическое значение, определяющее, размещать ли изображение мозаикой.
  • tileHorizontally: Логическое значение, определяющее, размещать ли изображение мозаикой по горизонтали.
  • tileVertically: Логическое значение, определяющее, размещать ли изображение вертикально.
  • image: Tреальное изображение. Ожидает путь к файлу .VMT в папке /materials/vgui.
Tip.pngСовет:Пример: допустим, что ваш файл .VMT называется example1.vmt и расположен в /materials/vgui/examples, тогда путь, который вы должны указать здесь, будет examples/example1».
Tip.pngСовет:Подтверждено на компьютере с Windows - Вы можете перейти по папке вверх, включив ../ в путь к файлу. Например, чтобы получить доступ к example.vmt в /materials/images, используйте ../images/example в качестве пути.
  • fillcolor: Определяет цвет фона за изображением. Окрашивается, только если альфа больше 0 (да)
Tip.pngСовет:Вы можете указать цвет как в формате RGBA, так и обратиться к цвету в файлах схемы, просто указав его имя в качестве значения.
  • border: Определяет границу вокруг изображения. Вы можете ссылаться только на цвета, определенные в файлах схемы, используя названия цветов!

EditablePanel

Описание: Окно-подобный элемент управления, который может содержать другие элементы управления, которые можно редактировать с помощью VGUI Build Mode.

Наследуется от: Panel

Frame

Описание: Элемент управления с динамически изменяемым размером, который можно перетаскивать. Имеет строку заголовка, кнопки закрытия и сворачивания и т.Д.

Наследуется от: EditablePanel

Note.pngПримечание:элемент управления Frame имеет приоритет над ключом "visible", определенным в Panel.
  • title: Определяет заголовок кадра.
  • title_font: Определяет, какой шрифт будет использоваться в заголовке фрейма.
  • clientinsetx_override: Переопределяет горизонтальное смещение по умолчанию от левой стороны панели.

Цвет отменяет:

  • infocus_bgcolor_override: Переопределить цвет фона панели, когда она находится в фокусе.
  • outoffocus_bgcolor_override: Переопределить цвет фона панели, когда она не в фокусе.
  • titlebarbgcolor_override: Переопределение цвета фона строки заголовка, когда она находится в фокусе.
  • titlebardisabledbgcolor_override: Переопределение цвета фона строки заголовка, когда она не в фокусе.
  • titlebarfgcolor_override: Переопределение цвета переднего плана строки заголовка, когда она находится в фокусе.
  • titlebardisabledfgcolor_override: Переопределить цвет переднего плана строки заголовка, когда он не в фокусе.
Нужно сделать: Это ещё не конец!