Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Тут я опишу всю последовательность интеграции "библиотеки" ImGui в свой проект DLL.

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

Распаковываем, кидаем в папку ImGui внутри папки проекта, все указанные ниже файлы:
imgui.cpp
imconfig.h
imgui_demo.cpp
imgui_draw.cpp
imgui_internal.h
stb_rect_pack.h
stb_textedit.h
stb_truetype.h
Остальное удаляем и забываем как страшный сон, на данном этапе они нам не нужны.


К проекту добавляем следующие файлы:
Код:
imgui.h
imgui_draw.cpp
imgui_internal.h
imgui.cpp
Создаем файл Impl.h со следующим содержанием:

Код:
#pragma once
#include "ImGui\imgui.h"
 
#include "ImGui\imgui_internal.h"
#include <d3d9.h>
 
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)



HWND hWnd  = NULL;
bool bShowWindow  = true;
WNDPROC  m_pWindowProc = nullptr;
 

void  ImGui_InvalidateDeviceObjects();
void  ImGui_Shutdown();
bool  ImGui_CreateFontsTexture();
bool  ImGui_CreateDeviceObjects();




HWND  g_hWnd  = 0;
INT64  g_Time  = 0;
INT64  g_TicksPerSecond  = 0;
LPDIRECT3DDEVICE9  g_pd3dDevice  = NULL;
LPDIRECT3DVERTEXBUFFER9  g_pVB  = NULL;
LPDIRECT3DINDEXBUFFER9  g_pIB  = NULL;
LPDIRECT3DTEXTURE9  g_FontTexture  = NULL;
int  g_VertexBufferSize = 5000,
  g_IndexBufferSize  = 10000;


struct CUSTOMVERTEX
{
   float  pos[3];
   D3DCOLOR col;
   float  uv[2];
};


void ImGui_DrawData(ImDrawData* draw_data)
{
 
   ImGuiIO& io = ImGui::GetIO();
   if (io.DisplaySize.x <= 0.0f || io.DisplaySize.y <= 0.0f)
     return;
 
   if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)
   {
     if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }
     g_VertexBufferSize = draw_data->TotalVtxCount + 5000;
     if (g_pd3dDevice->CreateVertexBuffer(g_VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
       return;
   }
   if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount)
   {
     if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
     g_IndexBufferSize = draw_data->TotalIdxCount + 10000;
     if (g_pd3dDevice->CreateIndexBuffer(g_IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &g_pIB, NULL) < 0)
       return;
   }
 
   IDirect3DStateBlock9* d3d9_state_block = NULL;
   if (g_pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0)
     return;

 
   CUSTOMVERTEX* vtx_dst;
   ImDrawIdx* idx_dst;
   if (g_pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
     return;
   if (g_pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)
     return;
   for (int n = 0; n < draw_data->CmdListsCount; n++)
   {
     const ImDrawList* cmd_list = draw_data->CmdLists[n];
     const ImDrawVert* vtx_src = cmd_list->VtxBuffer.Data;
     for (int i = 0; i < cmd_list->VtxBuffer.Size; i++)
     {
       vtx_dst->pos[0] = vtx_src->pos.x;
       vtx_dst->pos[1] = vtx_src->pos.y;
       vtx_dst->pos[2] = 0.0f;
       vtx_dst->col = (vtx_src->col & 0xFF00FF00) | ((vtx_src->col & 0xFF0000) >> 16) | ((vtx_src->col & 0xFF) << 16);  // RGBA --> ARGB for DirectX9
       vtx_dst->uv[0] = vtx_src->uv.x;
       vtx_dst->uv[1] = vtx_src->uv.y;
       vtx_dst++;
       vtx_src++;
     }
     memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
     idx_dst += cmd_list->IdxBuffer.Size;
   }
   g_pVB->Unlock();
   g_pIB->Unlock();
   g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
   g_pd3dDevice->SetIndices(g_pIB);
   g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

 
   g_pd3dDevice->SetPixelShader(NULL);
   g_pd3dDevice->SetVertexShader(NULL);
   g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
   g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
   g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
   g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
   g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, false);
   g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
   g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
   g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
   g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, true);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
   g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
   g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

    {
     const float L = 0.5f, R = io.DisplaySize.x + 0.5f, T = 0.5f, B = io.DisplaySize.y + 0.5f;
     D3DMATRIX mat_identity = { { 1.0f, 0.0f, 0.0f, 0.0f,  0.0f, 1.0f, 0.0f, 0.0f,  0.0f, 0.0f, 1.0f, 0.0f,  0.0f, 0.0f, 0.0f, 1.0f } };
     D3DMATRIX mat_projection =
     {
       2.0f / (R - L),  0.0f,  0.0f,  0.0f,
       0.0f,  2.0f / (T - B),  0.0f,  0.0f,
       0.0f,  0.0f,  0.5f,  0.0f,
       (L + R) / (L - R),  (T + B) / (B - T),  0.5f,  1.0f,
     };
     g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity);
     g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity);
     g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection);
   }
   int vtx_offset = 0;
   int idx_offset = 0;
   for (int n = 0; n < draw_data->CmdListsCount; n++)
   {
     const ImDrawList* cmd_list = draw_data->CmdLists[n];
     for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
     {
       const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
       if (pcmd->UserCallback)
       {
         pcmd->UserCallback(cmd_list, pcmd);
       }
       else
       {
         const RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
         g_pd3dDevice->SetTexture(0, (LPDIRECT3DTEXTURE9)pcmd->TextureId);
         g_pd3dDevice->SetScissorRect(&r);
         g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, idx_offset, pcmd->ElemCount / 3);
       }
       idx_offset += pcmd->ElemCount;
     }
     vtx_offset += cmd_list->VtxBuffer.Size;
   }
   d3d9_state_block->Apply();
   d3d9_state_block->Release();
}
IMGUI_API LRESULT ImGui_WndProc(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
   ImGuiIO& io = ImGui::GetIO();
   switch (msg)
   {
   case WM_LBUTTONDOWN:
     io.MouseDown[0] = true;
     return true;
   case WM_LBUTTONUP:
     io.MouseDown[0] = false;
     return true;
   case WM_RBUTTONDOWN:
     io.MouseDown[1] = true;
     return true;
   case WM_RBUTTONUP:
     io.MouseDown[1] = false;
     return true;
   case WM_MBUTTONDOWN:
     io.MouseDown[2] = true;
     return true;
   case WM_MBUTTONUP:
     io.MouseDown[2] = false;
     return true;
   case WM_MOUSEWHEEL:
     io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;
     return true;
   case WM_MOUSEMOVE:
     io.MousePos.x = (signed short)(lParam);
     io.MousePos.y = (signed short)(lParam >> 16);
     return true;
   case WM_KEYDOWN:
     if (wParam < 256)
       io.KeysDown[wParam] = 1;
     return true;
   case WM_KEYUP:
     if (wParam < 256)
       io.KeysDown[wParam] = 0;
     return true;
   case WM_CHAR:
     if (wParam > 0 && wParam < 0x10000)
       io.AddInputCharacter((unsigned short)wParam);
     return true;
   }
   return 0;
}
void SetStyle()
{
   ImGuiStyle& style = ImGui::GetStyle();

   style.WindowPadding = ImVec2(15, 15);
   style.WindowRounding = 5.0f;
   style.FramePadding = ImVec2(5, 5);
   style.FrameRounding = 4.0f;
   style.ItemSpacing = ImVec2(12, 8);
   style.ItemInnerSpacing = ImVec2(8, 6);
   style.IndentSpacing = 25.0f;
   style.ScrollbarSize = 15.0f;
   style.ScrollbarRounding = 9.0f;
   style.GrabMinSize = 5.0f;
   style.GrabRounding = 3.0f;

 
   style.Colors[ImGuiCol_Text] = ImVec4(0.83f, 0.95f, 0.95f, 1.00f);
   style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.39f, 0.80f, 0.80f, 1.00f);
   style.Colors[ImGuiCol_WindowBg] = ImVec4(0.09f, 0.27f, 0.27f, 0.87f);
   style.Colors[ImGuiCol_ChildWindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
   style.Colors[ImGuiCol_PopupBg] = ImVec4(0.05f, 0.05f, 0.10f, 0.90f);
   style.Colors[ImGuiCol_Border] = ImVec4(0.25f, 0.75f, 0.75f, 1.00f);
   style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
   style.Colors[ImGuiCol_FrameBg] = ImVec4(0.18f, 0.55f, 0.55f, 0.67f);
   style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.25f, 0.75f, 0.75f, 0.67f);
   style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.16f, 0.49f, 0.49f, 0.45f);
   style.Colors[ImGuiCol_TitleBg] = ImVec4(0.16f, 0.49f, 0.49f, 1.00f);
   style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.16f, 0.49f, 0.49f, 0.60f);
   style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.18f, 0.56f, 0.56f, 1.00f);
   style.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.16f, 0.47f, 0.47f, 1.00f);
   style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.11f, 0.33f, 0.33f, 1.00f);
   style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.14f, 0.42f, 0.42f, 1.00f);
   style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.33f, 0.78f, 0.78f, 0.67f);
   style.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.33f, 0.78f, 0.78f, 1.00f);
   style.Colors[ImGuiCol_ComboBg] = ImVec4(0.18f, 0.55f, 0.55f, 0.99f);
   style.Colors[ImGuiCol_CheckMark] = ImVec4(0.44f, 0.81f, 0.81f, 1.00f);
   style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.33f, 0.78f, 0.78f, 0.60f);
   style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.33f, 0.78f, 0.78f, 1.00f);
   style.Colors[ImGuiCol_Button] = ImVec4(0.18f, 0.55f, 0.55f, 1.00f);
   style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.33f, 0.78f, 0.78f, 0.67f);
   style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.33f, 0.78f, 0.78f, 1.00f);
   style.Colors[ImGuiCol_Header] = ImVec4(0.15f, 0.44f, 0.44f, 1.00f);
   style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.33f, 0.78f, 0.78f, 0.67f);
   style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.33f, 0.78f, 0.78f, 1.00f);
   style.Colors[ImGuiCol_Column] = ImVec4(0.25f, 0.74f, 0.74f, 0.40f);
   style.Colors[ImGuiCol_ColumnHovered] = ImVec4(0.25f, 0.74f, 0.74f, 0.60f);
   style.Colors[ImGuiCol_ColumnActive] = ImVec4(0.25f, 0.74f, 0.74f, 1.00f);
   style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.20f, 0.61f, 0.61f, 1.00f);
   style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.53f, 0.84f, 0.84f, 0.67f);
   style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(0.53f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_CloseButton] = ImVec4(0.22f, 0.67f, 0.67f, 1.00f);
   style.Colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.53f, 0.84f, 0.84f, 0.40f);
   style.Colors[ImGuiCol_CloseButtonActive] = ImVec4(0.53f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_PlotLines] = ImVec4(0.53f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.00f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.53f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(0.00f, 0.84f, 0.84f, 1.00f);
   style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.13f, 0.40f, 0.40f, 1.00f);
   style.Colors[ImGuiCol_ModalWindowDarkening] = ImVec4(0.09f, 0.27f, 0.27f, 0.67f);
}

 bool  ImGui_Init(void* hwnd, IDirect3DDevice9* device)
{
   g_hWnd = (HWND)hwnd;
   g_pd3dDevice = device;

 

   ImGuiIO& io = ImGui::GetIO();
   io.KeyMap[ImGuiKey_Tab] = VK_TAB;  // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
   io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
   io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
   io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
   io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
   io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
   io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
   io.KeyMap[ImGuiKey_Home] = VK_HOME;
   io.KeyMap[ImGuiKey_End] = VK_END;
   io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
   io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
   io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
   io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
   io.KeyMap[ImGuiKey_A] = 'A';
   io.KeyMap[ImGuiKey_C] = 'C';
   io.KeyMap[ImGuiKey_V] = 'V';
   io.KeyMap[ImGuiKey_X] = 'X';
   io.KeyMap[ImGuiKey_Y] = 'Y';
   io.KeyMap[ImGuiKey_Z] = 'Z';

   io.RenderDrawListsFn = ImGui_DrawData;
   io.ImeWindowHandle = g_hWnd;
   io.Fonts->AddFontFromFileTTF( u8"C:\\Windows\\Fonts\\Tahoma.ttf" , 16.0f, NULL, io.Fonts->GetGlyphRangesCyrillic());
  
   SetStyle();
   return true;
}

void ImGui_Shutdown()
{
   ImGui_InvalidateDeviceObjects();
   ImGui::Shutdown();
   g_pd3dDevice = NULL;
   g_hWnd = 0;
}

static bool ImGui_CreateFontsTexture()
{

   ImGuiIO& io = ImGui::GetIO();
   unsigned char* pixels;
   int width, height, bytes_per_pixel;
   io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel);

   g_FontTexture = NULL;
   if (g_pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_FontTexture, NULL) < 0)
     return false;
   D3DLOCKED_RECT tex_locked_rect;
   if (g_FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
     return false;
   for (int y = 0; y < height; y++)
     memcpy((unsigned char *)tex_locked_rect.pBits + tex_locked_rect.Pitch * y, pixels + (width * bytes_per_pixel) * y, (width * bytes_per_pixel));
   g_FontTexture->UnlockRect(0);

   io.Fonts->TexID = (void *)g_FontTexture;

   return true;
}

bool ImGui_CreateDeviceObjects()
{
   if (!g_pd3dDevice)
     return false;
   if (!ImGui_CreateFontsTexture())
     return false;
   return true;
}

void ImGui_InvalidateDeviceObjects()
{
   if (!g_pd3dDevice)
     return;
   if (g_pVB)
   {
     g_pVB->Release();
     g_pVB = NULL;
   }
   if (g_pIB)
   {
     g_pIB->Release();
     g_pIB = NULL;
   }
   if (LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)ImGui::GetIO().Fonts->TexID)
   {
     tex->Release();
     ImGui::GetIO().Fonts->TexID = 0;
   }
   g_FontTexture = NULL;
}

void ImGui_NewFrame()
{
   if (!g_FontTexture)
     ImGui_CreateDeviceObjects();

   ImGuiIO& io = ImGui::GetIO();
   RECT rect;
   GetClientRect(g_hWnd, &rect);
   io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));

   INT64 current_time;
   QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
   io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;
   g_Time = current_time;

   io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
   io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
   io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
   io.KeySuper = false;
   SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW));

   ImGui::NewFrame();
}
LRESULT WINAPI myWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   if (GetAsyncKeyState(VK_END) & 1)bShowWindow ^= 1;

   if (bShowWindow && ImGui_WndProc(hWnd, uMsg, wParam, lParam))
     return true;
   return CallWindowProc(m_pWindowProc, hWnd, uMsg, wParam, lParam);
}
Для наглядности задал тут свой шрифт для меню и применил цветовую схему, взятую
Пожалуйста, авторизуйтесь для просмотра ссылки.


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


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


в поток 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();
происходит "создание интерфейса"....


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



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

Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.
(Для особо одаренных паникеров: ругается на D3d9test из-за специфики кода автоподгрузки длл)


ЗЫ: Писалось специально для другого сайта. Текст полностью оригинальный,за исключением первой ссылки на тему GUI, так что прошу не считать рекламой.
 
Начинающий
Статус
Оффлайн
Регистрация
8 Май 2017
Сообщения
102
Реакции[?]
6
Поинты[?]
0
Это типо,лоадер который грузит с сервера dll?
Или что это?

Извините,что я задаю вопросы,я дуб в этих "ЧИТО СОЗДАНИЯХ"Прошу не агриться.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Это типо,лоадер который грузит с сервера dll?
Или что это?

Извините,что я задаю вопросы,я дуб в этих "ЧИТО СОЗДАНИЯХ"Прошу не агриться.
Он автоматически подгружает frm.dll из папки с проектом. В этой дллки находится реализация хука и рендер меню(читай выше)
 
Начинающий
Статус
Оффлайн
Регистрация
8 Май 2017
Сообщения
102
Реакции[?]
6
Поинты[?]
0
https://vk.com/bpcheat
Забаненный
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
746
Реакции[?]
171
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
бля где то я видел эту тему даже скриншот не изменил (На др форуме )
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
бля где то я видел эту тему даже скриншот не изменил (На др форуме )
потому что я являюсь автором этой темы
 
Но что такое frm.dll?
берешь свою dll, называешь ее frm.dll, помещаешь ее рядом с D3d9Test, запускаешь его и вуаля, твоя длл подгрузилась к программе без всяких инжекторов и свистоплясок с перенаправлением оригинальных функций
 
Начинающий
Статус
Оффлайн
Регистрация
8 Май 2017
Сообщения
102
Реакции[?]
6
Поинты[?]
0
потому что я являюсь автором этой темы
 

берешь свою dll, называешь ее frm.dll, помещаешь ее рядом с D3d9Test, запускаешь его и вуаля, твоя длл подгрузилась к программе без всяких инжекторов и свистоплясок с перенаправлением оригинальных функций
Хмм,это значит что я могу его внедрять в ксго,без инжектора?
 
Забаненный
Статус
Оффлайн
Регистрация
23 Май 2017
Сообщения
55
Реакции[?]
11
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хмм,это значит что я могу его внедрять в ксго,без инжектора?
В D3D9Test идёт автоматическая подгрузка dll с именем frm.dll. Ты её можешь внедрить в ксго используя любой метод инжекта.
 
return 0;
Забаненный
Статус
Оффлайн
Регистрация
6 Мар 2017
Сообщения
405
Реакции[?]
237
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Крайс, для некоторого понимания скинь исходники .exe .
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
Начинающий
Статус
Оффлайн
Регистрация
7 Янв 2018
Сообщения
25
Реакции[?]
3
Поинты[?]
0
Извиняю возможно за глупый вопрос. Что делать если при инжекте в игру фулл экран, происходит краш? В плане, что бы заинжектить DLL надо игру сворачивать в оконный режим.
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Извиняю возможно за глупый вопрос. Что делать если при инжекте в игру фулл экран, происходит краш? В плане, что бы заинжектить DLL надо игру сворачивать в оконный режим.
в myReset ты должен перегрузить все созданные тобой интерфейсы.
 
mamodron
Начинающий
Статус
Оффлайн
Регистрация
2 Июл 2017
Сообщения
192
Реакции[?]
28
Поинты[?]
0
Почему у меня инжектится, но меню не отрисовывается?
 
Похожие темы
Сверху Снизу