Загрузка...

[ImGui]Graphical User Interface

Thread in Programming created by Happy Aug 23, 2017. 2578 views

  1. Happy
    Happy Topic starter Aug 23, 2017 Держу курс на заебись 539 Apr 23, 2017
    Тут я опишу всю последовательность интеграции "библиотеки" ImGui в свой проект DLL.

    Создаем проект как сказано тут Graphical User Interface DirectX v.2017 . Хук берем из этой же темы(берем все до третьего шага включительно).
    Качаем свежий проект IMGui
    Распаковываем, кидаем в папку ImGui внутри папки проекта, все указанные ниже файлы:
    здесь

    флаг
    Код:
    bool bShowWindow = true;
    отвечает за показ меню. True - открыто сразу при инициализации, false - скрыто.
    переключение идет в блоке myWndProc при нажатии кнопки END
    Код:
    if (GetAsyncKeyState(VK_END) & 1)bShowWindow ^= 1;
    в cInclude.h подрубаем
    Код:
    #include "Impl.h"


    Для полной функциональности управления меню нам необходимо перехватить оконную процедуру конечного приложения и при открытии меню "врезать" свой код в его контекст.
    Пример будет на D3dTest(Будет в архиве).
    определяем необходимые данные с помощью Spy++(Меню "Cервис" в MVS)
    [IMG]

    в поток GUIDX, перед while (!Init()) добавляем:
    Код:
    hWnd = FindWindowA(NULL,"D3D9 Test");
    if (hWnd)
    m_pWindowProc = (WNDPROC)SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)myWndProc);
    на DLL_PROCESS_DETACH в DllMain прописываем
    Код:
    SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)m_pWindowProc);

    Теперь отрисовка:
    в myReset пишем перегрузку интерфейса при этом событии(изменение размера окна, сворачивание\разворачивание окна)
    Код:
    if (!Create)
    return m_pDevice->Reset(pPresentationParameters);

    ImGui_InvalidateDeviceObjects();


    auto result = oReset->GetTrampoline()(m_pDevice, pPresentationParameters);

    ImGui_CreateDeviceObjects();
    Код:
    bool Create = false;


    в myPresent пишем рисовку:
    Код:
    if (Create == false)
    {
    ImGui_Init(hWnd, m_pDevice);
    Create = true;
    }
    else
    {
    ImGui_NewFrame();

    if (bShowWindow)
    {
    DWORD dwFlag = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_ShowBorders | ImGuiWindowFlags_NoSavedSettings;
    ImGui::Begin( "[ImGui] ExGUI YouGame.biz" , &bShowWindow, ImVec2(450, 400), 1.0f, dwFlag);
    {

    ImGui::TextColored(ImColor(44, 234, 86), u8"DEMO::TextColored" );
    ImGui::SameLine();
    ImGui::TextColored(ImColor(122, 145, 120,100), u8"ver. 0.0.1");
    ImGui::Separator();


    ImGui::Button(u8"DEMO::Кнопка");

    }
    ImGui::End();
    }

    ImGui::Render();

    }



    return oPresent->GetTrampoline()(m_pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);

    }
    именно в блоке
    Код:
    ImGui::Begin( "[ImGui] ExGUI YouGame.biz" ,............
    {

    }
    ImGui::End();
    происходит "создание интерфейса"....


    в конечном итоге у нас получилось:
    [IMG]


    На этом пока все. Как приеду с отпуска дополню темку важными моментами(чисто по своему мнению) или по заявкам "телезрителей".

    Скачать полный проект с ЯДиск
    ВТ(Для особо одаренных паникеров: ругается на D3d9test из-за специфики кода автоподгрузки длл)
     
  2. pvolab
    pvolab Aug 23, 2017 Never look back. 898 Apr 24, 2017
    Code
    Сделал бы ты подсветку синтаксиса, код видно ужасно.
     
Top
Loading...