ФЭНДОМ


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

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

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

{$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

Выделить кодCLEOНа этом пункте всё, мы создали диалог. Изменение параметров диалога К параметрам диалога относятся: цвет, видимость, тип(свернутый/развернутый), позиция, размер. Т.к. в прошлом подпункте мы создали диалог и уже установили ему позицию и размер, то не буду описывать эти параметры, думаю по ним всё понятно. Видимость Данный параметр указывает, виден ли диалог. Данный параметр можно указать опкодом opcodes:0b86, а проверить видимость опкодом opcodes:0b87.​Фоновый цвет Цвет устанавливается опкодом opcodes:0b93 в виде ARGB(Alpha Red Green Blue), в HEX. Пример(используя прошлый код создания диалога): 0B93: dialog 0@ set_background_color 0xffff0000 // Установка непрозрачного красного цвета Выделить кодCLEOСвернуть/развернуть Диалог может быть свернут или развернут, обычно это свойство может применить нажав на заголовок диалога. Для управления данным параметром используется опкод 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  ​

Checkbox (переключатель) / opcodes:0b83При нажатии на него, происходит действие: установлен, не установлен. При статусе "установлен" внутри квадрата образуется крестик/флажок Доступные события: EVENT_CHECKBOX_CHANGEDID: 1025   ​Editbox (поле для ввода) / opcodes:0b88Доступные события: - EVENT_EDITBOX_STRINGID: 1537 - применен новый текст; - EVENT_EDITBOX_CHANGEID: 1538 - изменение текста (в данный момент).   ​Static (статический текст) / opcodes:0b91Обычная строка, не имеет событий.   ​Slider (горизонтальный ползунок) / opcodes:0b96Значение зависит от позиции ползунка. Доступные события: EVENT_SLIDER_VALUE_CHANGEDID: 1281   ​Listbox (список элементов) / opcodes:0b99Список с заданными элементами. Доступные события: - EVENT_LISTBOX_ITEM_DBLCLKID: 1793 - двойной клик по элементу из списка; - EVENT_LISTBOX_SELECTIONID: 1794 - выбор (клик левой кнопкой мыши) элемента из списка.  ​Обработка событий компонентов Обработка событий служит для обозначения целей компонентам. К примеру, нажав на кнопку, она скроется и выведет что нибудь в чат. Для этого используется опкод opcodes:0b81. Доступные события перечислены 'выше' для каждого компонента. Итак, я уже набросаю код в котором создаются все компоненты(думаю не составит труда его разобрать):

{$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

Выделить кодCLEOДанный код выводит всю информацию о событиях, которые произошли с компонентами

ИсточникиПравить

https://blast.hk/threads/17438/

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.