Гайд Продолжение. панорама - меню и кд абилок врагов

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Liberalist зацени


Создавал первый раз в своей жизни что-либо на языке html( ну если что оно не двигается оно просто в одной позиции стоит )
Получается всё должно быть так: создается 1 большая панель, к которой крепятся другие маленькие панельки( допустим хп бар и и мана бар ) Я пытался найти команду progress как в html, но её видимо нету в панораме.

В нашем чите, там где цикл основной мы делаем проверку, если сущность герой то мы создаем ей панель и загружаем ей вот этот вот(ниже) лейаут
и делаем:
C++:
int xPositionScreen;
int yPositionScreen;
entity->GetMainCUIPanel->GetPanel2D->GetChild(0)---> /*0 это типа самая самая главная панель, как я понял, да?*/-->SetStyle("position:{%d} px {%d}px",xPositionScreen,yPositionScreen);
C++:
Я правильно понял?

///entity->GetMainCUIPanel->GetPanel2D->GetChild(0)--->GetChild(0) это Label hero name
///entity->GetMainCUIPanel->GetPanel2D->GetChild(0)--->GetChild(1) это Panel
///entity->GetMainCUIPanel->GetPanel2D->GetChild(0)--->GetChild(2) это Panel ->GetChild(0) это Label Cur Health
///entity->GetMainCUIPanel->GetPanel2D->GetChild(0)--->GetChild(3) это Panel
///entity->GetMainCUIPanel->GetPanel2D->GetChild(0)--->GetChild(4) это Panel -> GetChild(0) это Label Cur mana

Нам ведь нужно только раз создать панельки такие в игре, при входе в катку, тоесть в начале матча, а не каждый раз когда итерирует?
html panoram
C++:
<root>
    <Panel hittest="false" style="position: 800px 500px 0px;background-color: none;width:180px;height:80px;">
        <Label style="text-shadow: 4px 4px 16px 3.0 #333333b0;font-weight:bold;position:7% 0% 0%;" text="npc_dota_hero_pudge"/>
        <Panel style="position: 5% 30% 0%;border: 2px solid #111111FF;background-color:#cc352d;width:160px;height:19px;"> <!-- MAX HEALTH -->
        </Panel>
       
        <Panel style="position: 5% 30% 0%;border: 2px solid #111111FF;background-color: red;width:160px;height:20px;"><!-- CUR HEALTH -->
        <Label style="position: 0% 10% 0%;color:white;font-size: 16px;" text="267/267"/>
        </Panel>
       
        <Panel style="position: 5% 55% 0%;border: 2px solid #111111FF;background-color: #0565a6;width:160px;height:20px;"> <!-- MAX MANA -->
        </Panel>
       
        <Panel style="position: 5% 55% 0%;border: 2px solid #111111FF;background-color: blue;width:160px;height:20px;"> <!-- CUR MANA -->
        <Label style="position: 0% 10% 0%;color:white;font-size: 16px;" text="267/267"/>
        </Panel>
    </Panel>
</root>
Пожалуйста, авторизуйтесь для просмотра ссылки.
прячешь показываешь когда надо панельки просто
для прогресса делаешь 123456px width черную панель, поверх нее x% width синюю/красную панель(где x это процент маны/хп)
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Пожалуйста, авторизуйтесь для просмотра ссылки.
прячешь показываешь когда надо панельки просто
для прогресса делаешь 123456px width черную панель, поверх нее x% width синюю/красную панель(где x это процент маны/хп)
Пожалуйста, авторизуйтесь для просмотра ссылки.

готовый бар, который можно себе спиздить
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
662
Реакции[?]
104
Поинты[?]
67K
если что, xml в панораме имеет такой вид:
<root>
<Panel>//та самая CPanel2D которую возвращает CreatePanel
...
</Panel>
</root>
также почитайте
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.

так как тутор получился немного говно, то буду дописывать.
начать вам стоит просто с создания панельки:
(кстати разница CUIPanel и CPanel2D в том, что CUIPanel это абстрактный элемент который мы просто называем "любая панелька", а CPanel2D это конкретный - кнопка, картинка, надпись и т.д.)
C++:
DOTAHud = FindPanelById("Hud");//при входе в матч

//после входа в матч когда уже игра более менее загрузилась(GameState > DOTA_GAMERULES_STATE_INIT)
GetPanelTypeF(&PanelType, "Panel");
Pointer<CPanel2D> Panel2D = Panorama2->VirtualCall<30>(&PanelType, "MyPanel", DOTAHud);
CUIPanel* PanelUI = Panel2D->CUIPanel;
PanelUI->LoadLayoutFromString("<root><Panel style=\"background-color:black;width:400px;height:400px;\"></Panel></root>");
и если все получилось то вам должно нарисовать черный квадрат малевича на экране.
дальше попробуйте изменить стиль уже созданной панельки:
C++:
WORD StyleOffset = 0;
StyleOffset = *(WORD*)(GetAbsoluteAddress(PanelUI->VirtualMethod(307) + 0x3f7, 3, 7));
//для StyleOffset PanelUI это любая панель, тот же DOTAHud, или же ваша только что созданная панель. в данном случае нам нужна лишь вмтха а на саму панельку пофигу.
//а в случае с изменением стиля нам естественно нужна сама изменяемая панель в rcx(this). она у меня передается под колпаком в VirtualCall
PanelUI->VirtualCall<307>(&StyleOffset, "background-color:white;");//квадрат стал белым. остальные параметры стиля(width,height) не изменились так как мы их не указали в строке, что очень удобно потому что мы можем изменить один параметр не парясь о других
дальше заходите в libclient.dylib и ищете OnMouseButtonDown/Up(это CPanel2D)

12 индекс в dylibе, значит ставим брейкпоинты в этом радиусе(10-14 для начала потом увеличиваем если не нашли) в функциях вмтхи нашей недавно созданной панельки, кликаем и смотрим кто из бпшек сработает. но тут одна проблемка, клики по панелькам(<Panel>) так почему-то не обрабатываются, поэтому я в своем xml везде впиндюрил Button style="width:100%;height:100%;". сделайте также, потом найдите вашу CButton(дочерний класс от CPanel2D) через GetChild(индексы для GetChild работают так:
<Panel>//вот панелька у которой хотим получить детей, Обозначим ее our_panel
<Button/>//our_panel->GetChild(0)
<Label/>//our_panel->GetChild(1)
<Image/>//our_panel->GetChild(2)
<Panel>//our_panel->GetChild(3)
<Label/>//our_panel->GetChild(3)->GetChild(0)//то есть нулевой ребенок третьего ребенка
</Panel>
</Panel>
)
и у этой CButton уже ставьте брейкпоинты и найдете что индексы такие:
CButtonVMT->Hook(14, CButton_MDOWN);
CButtonVMT->Hook(15, CButton_MUP);
чето я не пойму где найти этот setstyle? его даже в дилибе нету
1663068060517.png

в обычной длл прочекал индексы от 300 до 339 тож ниче интересного не нашёл

ещё не очень пойму как мне например переменные из с++ получать в панораме(например для настроек) у лвсс на конварах сделано но это хуйня + там поменяли конвары
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
чето я не пойму где найти этот setstyle? его даже в дилибе нету
Посмотреть вложение 220830

в обычной длл прочекал индексы от 300 до 339 тож ниче интересного не нашёл

ещё не очень пойму как мне например переменные из с++ получать в панораме(например для настроек) у лвсс на конварах сделано но это хуйня + там поменяли конвары
SetStyle = SetAttribute("style", blablabla)
про переменные не понял подробнее опиши что ты хочешь.
если ты хочешь чтобы условно при нажатии кнопки в твоей менюшке у тебя чтото происходило, хукай мауздаун/маузап у CButton/CSlider и тд и тп
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
662
Реакции[?]
104
Поинты[?]
67K
про переменные не понял подробнее опиши что ты хочешь.
ну как в имгуе сделать хочу типо чтобы чекбокс панорамы менял мне чото в переменной(ImGui::Checkbox("Draw bar", &this->Bars);), либо допустим фпс рисовать(я из ImGui::GetIO().Framerate хочу брать и рисовать кол-во фпс через панораму)
раньше же в разы проще это можно было делать, т.к. можно было из строки грузить, а щас надо ебатся с компиляцией и файлами всякими
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
ну как в имгуе сделать хочу типо чтобы чекбокс панорамы менял мне чото в переменной
ImGui::Checkbox("Draw bar", &this->Bars);
раньше же в разы проще это можно было делать, т.к. можно было из строки грузить, а щас надо ебатся с компиляцией и файлами всякими
ну ты можешь так же из строки грузить просто создавая файлик запихивая в него строку, загружая лейаут из файлика и удаляя файлик потом, как лвсс
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
662
Реакции[?]
104
Поинты[?]
67K
ну ты можешь так же из строки грузить просто создавая файлик запихивая в него строку, загружая лейаут из файлика и удаляя файлик потом, как лвсс
только нужно его ещё компилить будет(хотя наверное можно при запуске будет скачивать ресурскомпилер и им компилить, да?) просто ты сам писал что нельзя голый xml грузить
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
только нужно его ещё компилить будет(хотя наверное можно при запуске будет скачивать ресурскомпилер и им компилить, да?) просто ты сам писал что нельзя голый xml грузить
а хуй его знает на самом деле то, лвсс вроде голый хмл грузит. голый хмл нельзя грузить с впк, но лвсс не с впк а с диска грузит(он чето с файлсистемой габена делает), мб с диска можно голый
 
Забаненный
Статус
Оффлайн
Регистрация
29 Авг 2022
Сообщения
12
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
auto result = CallVFunc<29, CPanel2D*>(&symbol, id.data(), &parent),а как ты нашел второй параметр здесь.Я просто взял у тебя индекс у меня все получилось,но я бектрейсил и не смог найти функцию самостоятельно которая возращает type id
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
auto result = CallVFunc<29, CPanel2D*>(&symbol, id.data(), &parent),а как ты нашел второй параметр здесь.Я просто взял у тебя индекс у меня все получилось,но я бектрейсил и не смог найти функцию самостоятельно которая возращает type id
второй параметр это какой именно? символ?
символ это индекс в таблице строк(условно "первая строка в таблице", "вторая строка в таблице" и тд).
габен строки сохраняет в таблицу для экономии места и прочей хуйни. строки потом он передает не указателем на байты строки, а индексом в таблице(символ это WORD 16 битов индекс в таблице это кр4). ты делаешь символ(через вирт функу) из строки "Panel", передаешь этот символ в функу(считай это ты строку передаешь просто по-габеновски через символ а не напрямую), потом следующим аргументом передаешь айди самой панели(ее внутреннее имя которое ты хочешь чтобы она имела), дальше та панель к которой прикрепляется эта(=родитель)
(мб индекс старый хз посмотришь сам)
(shitcode)
C++:
    auto CUIEngineSource2::MakeSymbol(const std::string_view& string) const
    {
        std::uint16_t result{};
        CallVFunc<120, std::uint16_t>(&result, string.data());
        return result;
    }
C++:
    auto& CUIEngineSource2::CreatePanel(const std::string_view& symbol_str, const std::string_view& id, const CUIPanel& parent)
    {
        const auto symbol = MakeSymbol(symbol_str);
        auto result = CallVFunc<29, CPanel2D*>(&symbol, id.data(), &parent);
        if(!result)
            throw std::runtime_error{ "PanoramaUI::CreatePanel returned nullptr!" };
        return *result;
    }
    CUIPanelRAII CUIPanel::Create(const std::string_view& id)
{
    auto& panorama = CPanoramaUIEngine::Create().GetPanoramaSource2();
    return { panorama.CreatePanel("Panel", id, panorama.GetDotaHUD().GetPanoramaView()).GetUI() };
}
дотахуд это если что(maybe old offests blablabla)
C++:
class CTopLevelWindowSource2 : public VClass
{
public:
    std::string_view GetName() const noexcept
    {
        const auto result = Member<const char*>(0x160);
        if (result)
            return { result };
        return {};
    }
   
    CUIPanel& GetPanoramaView() const
    {
        if (const auto intermediate_result = Member<CUIPanel**>(0x88); intermediate_result)
            if (const auto result = *intermediate_result; result)
                return *result;
        throw std::runtime_error{ "CTopLevelWindowSource2::GetPanoramaView is nullptr!" };
    }
};
class CUIEngineSource2 : public VClass
{
public:
    auto& GetTopLevelWindows() const noexcept
    {
        return Member<CUtlVector<CTopLevelWindowSource2*>>(0x60);
    }
    auto& GetDotaHUD()
    {
        const auto& windows = GetTopLevelWindows();
        if (
            const auto match = std::ranges::find_if(windows, [](const auto& window)
                {
                    if(window)
                        return window->GetName() == "DotaHud";
                    return false;
                });
            match != windows.end()
            )
            if(const auto ptr = *match; ptr)
                return *ptr;

        throw std::runtime_error{"DotaHud top level window not found!"};
    }
    ...
 
Забаненный
Статус
Оффлайн
Регистрация
29 Авг 2022
Сообщения
12
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
второй параметр это какой именно? символ?
символ это индекс в таблице строк(условно "первая строка в таблице", "вторая строка в таблице" и тд).
габен строки сохраняет в таблицу для экономии места и прочей хуйни. строки потом он передает не указателем на байты строки, а индексом в таблице(символ это WORD 16 битов индекс в таблице это кр4). ты делаешь символ(через вирт функу) из строки "Panel", передаешь этот символ в функу(считай это ты строку передаешь просто по-габеновски через символ а не напрямую), потом следующим аргументом передаешь айди самой панели(ее внутреннее имя которое ты хочешь чтобы она имела), дальше та панель к которой прикрепляется эта(=родитель)
(мб индекс старый хз посмотришь сам)
(shitcode)
C++:
    auto CUIEngineSource2::MakeSymbol(const std::string_view& string) const
    {
        std::uint16_t result{};
        CallVFunc<120, std::uint16_t>(&result, string.data());
        return result;
    }
C++:
    auto& CUIEngineSource2::CreatePanel(const std::string_view& symbol_str, const std::string_view& id, const CUIPanel& parent)
    {
        const auto symbol = MakeSymbol(symbol_str);
        auto result = CallVFunc<29, CPanel2D*>(&symbol, id.data(), &parent);
        if(!result)
            throw std::runtime_error{ "PanoramaUI::CreatePanel returned nullptr!" };
        return *result;
    }
    CUIPanelRAII CUIPanel::Create(const std::string_view& id)
{
    auto& panorama = CPanoramaUIEngine::Create().GetPanoramaSource2();
    return { panorama.CreatePanel("Panel", id, panorama.GetDotaHUD().GetPanoramaView()).GetUI() };
}
дотахуд это если что(maybe old offests blablabla)
C++:
class CTopLevelWindowSource2 : public VClass
{
public:
    std::string_view GetName() const noexcept
    {
        const auto result = Member<const char*>(0x160);
        if (result)
            return { result };
        return {};
    }

    CUIPanel& GetPanoramaView() const
    {
        if (const auto intermediate_result = Member<CUIPanel**>(0x88); intermediate_result)
            if (const auto result = *intermediate_result; result)
                return *result;
        throw std::runtime_error{ "CTopLevelWindowSource2::GetPanoramaView is nullptr!" };
    }
};
class CUIEngineSource2 : public VClass
{
public:
    auto& GetTopLevelWindows() const noexcept
    {
        return Member<CUtlVector<CTopLevelWindowSource2*>>(0x60);
    }
    auto& GetDotaHUD()
    {
        const auto& windows = GetTopLevelWindows();
        if (
            const auto match = std::ranges::find_if(windows, [](const auto& window)
                {
                    if(window)
                        return window->GetName() == "DotaHud";
                    return false;
                });
            match != windows.end()
            )
            if(const auto ptr = *match; ptr)
                return *ptr;

        throw std::runtime_error{"DotaHud top level window not found!"};
    }
    ...
Спасибо,индекс тот же разобрался.
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
а хуй его знает на самом деле то, лвсс вроде голый хмл грузит. голый хмл нельзя грузить с впк, но лвсс не с впк а с диска грузит(он чето с файлсистемой габена делает), мб с диска можно голый
Можно грузить XML прямо из памяти, для этого отдельная функция есть в панораме
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
662
Реакции[?]
104
Поинты[?]
67K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Можно грузить XML прямо из памяти, для этого отдельная функция есть в панораме
BLoadLayoutFromString был раньше но его вроде убрали или поломали хотя мб какието функции которые он вызывает внутри остались и работают. хз я уже панораму давно не юзал. если ты тестил и знаешь имя функции - можешь написать сюда для других
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
BLoadLayoutFromString был раньше но его вроде убрали или поломали хотя мб какието функции которые он вызывает внутри остались и работают. хз я уже панораму давно не юзал. если ты тестил и знаешь имя функции - можешь написать сюда для других
Она и есть, все еще работает насколько я знаю. Как минимум тестил пару недель назад - проблем не возникало
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Она и есть, все еще работает насколько я знаю. Как минимум тестил пару недель назад - проблем не возникало
Ты на какой версии доты тестил "пару недель назад" ?
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
662
Реакции[?]
104
Поинты[?]
67K
SetStyle = SetAttribute("style", blablabla)
про переменные не понял подробнее опиши что ты хочешь.
если ты хочешь чтобы условно при нажатии кнопки в твоей менюшке у тебя чтото происходило, хукай мауздаун/маузап у CButton/CSlider и тд и тп
че то странная тема какая-то, почему SetProperty крашит при вызове?

C++:
    std::uint16_t GetStyleOffset( ) {
        auto res = util::get_absolute_address( this->GetVF<std::uintptr_t>( 304 ) + 0x31D, 3, 7 );
        return *(std::uint16_t*)res;
    }

    std::uintptr_t SetProperty( const char* style ) {
        auto style_offset = this->GetStyleOffset( );
        return CallVFunc<304>( &style_offset, style );
    }
...
        static CUIPanel* test_panel = nullptr;

        if ( wParam == VK_UP ) {
            auto& UIEngine = IPanoramaUIEngine::GetInstance( );
            CUIPanel* hud_parent = UIEngine.FindPanel( IEngineClient::GetInstance().IsInGame() ? "DotaHud" : "Hud" );
            CPanoramaSymbol symbol = UIEngine.m_pUIEngineSource2->MakeSymbol( "Panel" );
            test_panel = UIEngine.m_pUIEngineSource2->CreatePanel( symbol, "TestPanel", hud_parent )->GetUIPanel( );
            test_panel->LoadLayoutErrorHandle( R"xml(file://{resources}/xml.xml)xml", true );
        }
        if ( wParam == VK_F1 ) {
            if ( test_panel ) {
                test_panel->SetProperty( "background-color:white;" );
            }
        }
styleoffset(
1682995153022.png
)

Кароче я +- разобрался с гет/сетатрибут но есть проблема:
1683031703578.pngто есть сам бекграунд колор не меняется, а строчка меняется(после смены на white уже гетатрибутстринг вернул вайт)

1683031788383.png

вот тоже самое почти(стайл валидные и т.д.) но вернуло nullpid(который return_if_null как я понял из псевдокода)
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
ЧВК EB_LAN
Эксперт
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
1,550
Реакции[?]
518
Поинты[?]
188K
че то странная тема какая-то, почему SetProperty крашит при вызове?

C++:
    std::uint16_t GetStyleOffset( ) {
        auto res = util::get_absolute_address( this->GetVF<std::uintptr_t>( 304 ) + 0x31D, 3, 7 );
        return *(std::uint16_t*)res;
    }

    std::uintptr_t SetProperty( const char* style ) {
        auto style_offset = this->GetStyleOffset( );
        return CallVFunc<304>( &style_offset, style );
    }
...
        static CUIPanel* test_panel = nullptr;

        if ( wParam == VK_UP ) {
            auto& UIEngine = IPanoramaUIEngine::GetInstance( );
            CUIPanel* hud_parent = UIEngine.FindPanel( IEngineClient::GetInstance().IsInGame() ? "DotaHud" : "Hud" );
            CPanoramaSymbol symbol = UIEngine.m_pUIEngineSource2->MakeSymbol( "Panel" );
            test_panel = UIEngine.m_pUIEngineSource2->CreatePanel( symbol, "TestPanel", hud_parent )->GetUIPanel( );
            test_panel->LoadLayoutErrorHandle( R"xml(file://{resources}/xml.xml)xml", true );
        }
        if ( wParam == VK_F1 ) {
            if ( test_panel ) {
                test_panel->SetProperty( "background-color:white;" );
            }
        }
styleoffset(
Посмотреть вложение 246496
)

Я посмотрел в иде и бпшнул там почему-то какая-то хуйня принимается в аргументах, а не констр чар*
И еще я не понимаю почему SetAttribute/GetAttribute какую-то странную инфу принимают возвращают?
Посмотреть вложение 246497
(setattributestring), какой watcher? это что вообще? аттрибут? да нет вроде, такого не нашел
Пожалуйста, авторизуйтесь для просмотра ссылки.



вообщем хрень какая-то с этими стилями
посту 3 года, явно в доте что-то поменялось.
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
че то странная тема какая-то, почему SetProperty крашит при вызове?

C++:
    std::uint16_t GetStyleOffset( ) {
        auto res = util::get_absolute_address( this->GetVF<std::uintptr_t>( 304 ) + 0x31D, 3, 7 );
        return *(std::uint16_t*)res;
    }

    std::uintptr_t SetProperty( const char* style ) {
        auto style_offset = this->GetStyleOffset( );
        return CallVFunc<304>( &style_offset, style );
    }
...
        static CUIPanel* test_panel = nullptr;

        if ( wParam == VK_UP ) {
            auto& UIEngine = IPanoramaUIEngine::GetInstance( );
            CUIPanel* hud_parent = UIEngine.FindPanel( IEngineClient::GetInstance().IsInGame() ? "DotaHud" : "Hud" );
            CPanoramaSymbol symbol = UIEngine.m_pUIEngineSource2->MakeSymbol( "Panel" );
            test_panel = UIEngine.m_pUIEngineSource2->CreatePanel( symbol, "TestPanel", hud_parent )->GetUIPanel( );
            test_panel->LoadLayoutErrorHandle( R"xml(file://{resources}/xml.xml)xml", true );
        }
        if ( wParam == VK_F1 ) {
            if ( test_panel ) {
                test_panel->SetProperty( "background-color:white;" );
            }
        }
styleoffset(
Посмотреть вложение 246496
)

Я посмотрел в иде и бпшнул там почему-то какая-то хуйня принимается в аргументах, а не констр чар*
И еще я не понимаю почему SetAttribute/GetAttribute какую-то странную инфу принимают возвращают?
Посмотреть вложение 246497
(setattributestring), какой watcher? это что вообще? аттрибут? да нет вроде, такого не нашел
Пожалуйста, авторизуйтесь для просмотра ссылки.



вообщем хрень какая-то с этими стилями
Хватет, остановись, пока ещё не поздно
Панорама вас ни к чему не приведёт
 
Сверху Снизу