Информация Гайд Работа с DXUT диалогами с помощью SAMPFUNCS

Статус
В этой теме нельзя размещать новые ответы.

itsLegend

Фонд борьбы за жуков 🐞
Автор темы
Администратор
2,695
1,447
Введение
DXUT диалоги — пользовательские диалоги, которые могут иметь по несколько компонентов, а также имеют свои свойства(цвет, видимость...). Не путайте со стандартными диалогами SAMP'а!
Все доступные опкоды по ним Вы можете найти в разделе WIKI: Список опкодов SAMPFUNCS'а.
Созданием опкодов для управления такими типами диалогов занимался @MogAika.

Создание диалога
dxut_dialog_empty.png

Диалог создается опкодом opcodes:0b80.
После создания необходимо установить позицию и размер диалога, т.к. он не будет виден.
После создания, вернется указатель на структуру этого диалога, чтобы в будущем можно было ему менять различные параметры, а также добавлять компоненты, которые будут описаны ниже.

Код для создания диалога и установки ему позиции:
CLEO:
{$CLEO}

0000:

repeat
    wait 300
until 0AFA:  is_samp_available // Ожидаем инициализацию структур сампа.

0B80: dialog 0@ = create "User's dialog" // Создаем диалог с названием User's dialog
0B84: dialog 0@ set_pos_XY 500 500 size 300 225 // Устанавливаем позицию и размер, чтобы диалог стал виден

while true
    wait 0
end
На этом пункте всё, мы создали диалог.

Изменение параметров диалога
К параметрам диалога относятся: цвет, видимость, тип(свернутый/развернутый), позиция, размер.
Т.к. в прошлом подпункте мы создали диалог и уже установили ему позицию и размер, то не буду описывать эти параметры, думаю по ним всё понятно.

Видимость
Данный параметр указывает, виден ли диалог.
Данный параметр можно указать опкодом opcodes:0b86, а проверить видимость опкодом opcodes:0b87.​

Фоновый цвет
Цвет устанавливается опкодом opcodes:0b93 в виде ARGB(Alpha Red Green Blue), в HEX.
Пример(используя прошлый код создания диалога):
CLEO:
0B93: dialog 0@ set_background_color 0xffff0000 // Установка непрозрачного красного цвета

Свернуть/развернуть
Диалог может быть свернут или развернут, обычно это свойство может применить нажав на заголовок диалога.
Для управления данным параметром используется опкод opcodes:0ba1, а проверка скрытия диалога - opcodes:0ba2.​

Видимость заголовка
Также диалогу можно установить видимость заголовка.
Данная возможность предоставляется опкодом opcodes:0b9f, а проверка его видимости - opcodes:0ba0.​

Компоненты
Компоненты - основная часть DXUT диалогов. С помощью них можно делать интерфейсы для упрощения работы пользователям.
Операции с компонентами
Получение текста компонента - opcodes:0b89
Изменение видимости компонента - opcodes:0b90
Изменение текста компонента - opcodes:0b94
Проверка видимости компонента - opcodes:0b95
Установка размера компонента - opcodes:0ba6
Получение размера компонента - opcodes:0ba7
Установка позиции компонента - opcodes:0ba8
Получение позиции компонента - opcodes:0ba9


Доступные компоненты
Button (кнопка) / opcodes:0b82
Доступные события: EVENT_BUTTON_CLICKEDID: 257
dxut_dialog_button.png

Checkbox (переключатель) / opcodes:0b83
При нажатии на него, происходит действие: установлен, не установлен. При статусе "установлен" внутри квадрата образуется крестик/флажок:)
Доступные события: EVENT_CHECKBOX_CHANGEDID: 1025
dxut_dialog_checkbox.png

Editbox (поле для ввода) / opcodes:0b88
Доступные события:
- EVENT_EDITBOX_STRINGID: 1537 - применен новый текст;
- EVENT_EDITBOX_CHANGEID: 1538 - изменение текста (в данный момент).
dxut_dialog_editbox.png

Static (статический текст) / opcodes:0b91
Обычная строка, не имеет событий.
dxut_dialog_static.png

Slider (горизонтальный ползунок) / opcodes:0b96
Значение зависит от позиции ползунка.
Доступные события: EVENT_SLIDER_VALUE_CHANGEDID: 1281
dxut_dialog_slider.png

Listbox (список элементов) / opcodes:0b99
Список с заданными элементами.
Доступные события:
- EVENT_LISTBOX_ITEM_DBLCLKID: 1793 - двойной клик по элементу из списка;
- EVENT_LISTBOX_SELECTIONID: 1794 - выбор (клик левой кнопкой мыши) элемента из списка.
dxut_dialog_listbox.png

Обработка событий компонентов
Обработка событий служит для обозначения целей компонентам.
К примеру, нажав на кнопку, она скроется и выведет что нибудь в чат.
Для этого используется опкод opcodes:0b81.
Доступные события перечислены выше для каждого компонента.

Итак, я уже набросаю код в котором создаются все компоненты(думаю не составит труда его разобрать):
CLEO:
{$CLEO}
{$INCLUDE SF}

0000:

repeat
    wait 300
until 0AFA:  is_samp_available

wait 0

0B80: dialog 0@ = create "User's dialog"
0B84: dialog 0@ set_pos_XY 500 500 size 300 225

0B82: dialog 0@ add_button id 1 text "Добавить" pos_XY 0 0 size 100 30

0B83: dialog 0@ add_checkbox id 2 text "Выбрать" pos_XY 0 35 size 150 20

0B88: dialog 0@ add_editbox id 3 text "Ввести" pos_XY 2 60 size 100 40

0B91: dialog 0@ add_static id 4 text "Информация" pos_XY 2 105 size 150 20

0B96: dialog 0@ add_slider id 5 pos_XY 2 130 size 100 35 max 100

0B99: dialog 0@ add_listbox id 6 pos_XY 120 5 size 175 175

while true
    wait 0
    if 0B81: dialog 0@ pop_event_to 1@ control_id_to 2@ // Обработчик событий
    then

    end
end
Целый код, осталось добавить несколько строк и "действия" компонентов будут осуществляться.
Делаю пример для каждого компонента в одном коде, кроме стат. текста, конечно.
CLEO:
{$CLEO}
{$INCLUDE SF}

// Константы ид событий
const
EVENT_BUTTON_CLICKED                = 257
EVENT_COMBOBOX_SELECTION_CHANGED    = 513
EVENT_RADIOBUTTON_CHANGED           = 769
EVENT_CHECKBOX_CHANGED              = 1025
EVENT_SLIDER_VALUE_CHANGED          = 1281
EVENT_EDITBOX_STRING                = 1537
EVENT_EDITBOX_CHANGE                = 1538
EVENT_LISTBOX_ITEM_DBLCLK           = 1793
EVENT_LISTBOX_SELECTION             = 1794
end

0000:

repeat
    wait 300
until 0AFA:  is_samp_available

wait 0

0B80: dialog 0@ = create "User's dialog"
0B84: dialog 0@ set_pos_XY 500 500 size 300 225

0B82: dialog 0@ add_button id 1 text "Добавить" pos_XY 0 0 size 100 30

0B83: dialog 0@ add_checkbox id 2 text "Выбрать" pos_XY 0 35 size 150 20

0B88: dialog 0@ add_editbox id 3 text "Ввести" pos_XY 2 60 size 100 40

0B91: dialog 0@ add_static id 4 text "Информация" pos_XY 2 105 size 150 20

0B96: dialog 0@ add_slider id 5 pos_XY 2 130 size 100 35 max 100

0B99: dialog 0@ add_listbox id 6 pos_XY 120 5 size 175 175

while true
    wait 0
    if 0B81: dialog 0@ pop_event_to 1@ control_id_to 2@
    then
        // 0@ - указатель на структуру диалога ; 1@ - ид события ; 2@ - ид компонента
        if 1@ == EVENT_BUTTON_CLICKED
        then
            if 2@ == 1
            then
                0AF8: samp add_message_to_chat "Была нажата кнопка. Компонент №%d" color -1 params 2@

                0AC8: 3@ = allocate_memory_size 128
                0C11: memset destination 3@ value 0x0 size 128
                0B9B: dialog 0@ listbox 6 selected_element_to 0 elements_count_to 4@
                4@++
                0AD3: 3@ = format "Элемент №%d" 4@
                0B9A: dialog 0@ listbox 6 insert_element 3@ with_data 4@ after -1
                0AC9: free_allocated_memory 3@
            end
        end

        if 1@ == EVENT_CHECKBOX_CHANGED
        then
            if 2@ == 2
            then
                0AF8: samp add_message_to_chat "Значение чекбокса было изменено. Компонент №%d" color -1 params 2@

                if 0B92:  dialog 0@ checkbox 2@ is_checked
                then 0AF8: samp add_message_to_chat "Флажок в чекбоксе - виден" color -1
                else 0AF8: samp add_message_to_chat "Флажок в чекбоксе - не виден" color -1
                end
            end
        end

        if 2@ == 3
        then
            if 1@ == EVENT_EDITBOX_STRING
            then
                0AF8: samp add_message_to_chat "Было вызвано событие нажатие кнопки Enter при активном едитбоксе. Компонент №%d" color -1 params 2@
            end

            if 1@ == EVENT_EDITBOX_CHANGE
            then
                0AF8: samp add_message_to_chat "В поле едитбокса что-то изменилось. Компонент №%d" color -1 params 2@
            end

            0AC8: 3@ = allocate_memory_size 128
            0C11: memset destination 3@ value 0x0 size 128
            0B89: dialog 0@ get_control 2@ text_to 3@
            0AF8: samp add_message_to_chat "Содержимое поля едитбокса: %s" color -1 params 3@
            0AC9: free_allocated_memory 3@
        end

        if 1@ == EVENT_SLIDER_VALUE_CHANGED
        then
            if 2@ == 5
            then
                0AF8: samp add_message_to_chat "Ползунок слайдера был передвинут. Компонент №%d" color -1 params 2@

                0B97: dialog 0@ slider 2@ get_value_to 3@
                0AF8: samp add_message_to_chat "Текущее положение слайдера(значение): %d" color -1 params 3@
            end
        end

        if 2@ == 6
        then
            if 1@ == EVENT_LISTBOX_ITEM_DBLCLK
            then
                0AF8: samp add_message_to_chat "Вызвано событие двойного клика на элемент в листбоксе. Компонент №%d" color -1 params 2@

                0B9B: dialog 0@ listbox 2@ selected_element_to 3@ elements_count_to 4@
                0AF8: samp add_message_to_chat "Элемент: %d" color -1 params 3@

                0B9C: dialog 0@ listbox 2@ delete_element 3@
            end

            if 1@ == EVENT_LISTBOX_SELECTION
            then
                0AF8: samp add_message_to_chat "Элемент в листбоксе был выделен. Компонент №%d" color -1 params 2@

                0B9B: dialog 0@ listbox 2@ selected_element_to 3@ elements_count_to 0
                0AF8: samp add_message_to_chat "Выделенный элемент: %d" color -1 params 3@
            end
        end
    end
end
Данный код выводит всю информацию о событиях, которые произошли с компонентами.

В конечном результате у нас получилось:
dxut_dialog_result.png
 

Вложения

  • dxut_dialog_final.cs
    22.8 KB · Просмотры: 142
Последнее редактирование:

applethecandy

Now it's PHP time
Проверенный
253
328
Есть возможность изменить шрифт на monospace, или центрировать текст?
 
Статус
В этой теме нельзя размещать новые ответы.