• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

[ImGui]Graphical User Interface

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
Тут я опишу всю последовательность интеграции "библиотеки" 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
Остальное удаляем и забываем как страшный сон, на данном этапе они нам не нужны.


К проекту добавляем следующие файлы:
Код:
Expand Collapse Copy
imgui.h
imgui_draw.cpp
imgui_internal.h
imgui.cpp

Создаем файл Impl.h со следующим содержанием:

Код:
Expand Collapse Copy
#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);
}
Для наглядности задал тут свой шрифт для меню и применил цветовую схему, взятую
Пожалуйста, авторизуйтесь для просмотра ссылки.


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



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


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

на DLL_PROCESS_DETACH в DllMain прописываем
Код:
Expand Collapse Copy
SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)m_pWindowProc);


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

   ImGui_InvalidateDeviceObjects();

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

Код:
Expand Collapse Copy
bool  Create = false;


в myPresent пишем рисовку:
Код:
Expand Collapse Copy
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);
 
}

именно в блоке
Код:
Expand Collapse Copy
ImGui::Begin( "[ImGui] ExGUI YouGame.biz" ,............
       {
          
       }
       ImGui::End();
происходит "создание интерфейса"....


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



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

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

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


ЗЫ: Писалось специально для другого сайта. Текст полностью оригинальный,за исключением первой ссылки на тему GUI, так что прошу не считать рекламой.
 
Это типо,лоадер который грузит с сервера dll?
Или что это?

Извините,что я задаю вопросы,я дуб в этих "ЧИТО СОЗДАНИЯХ"Прошу не агриться.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Это типо,лоадер который грузит с сервера dll?
Или что это?

Извините,что я задаю вопросы,я дуб в этих "ЧИТО СОЗДАНИЯХ"Прошу не агриться.
Он автоматически подгружает frm.dll из папки с проектом. В этой дллки находится реализация хука и рендер меню(читай выше)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
бля где то я видел эту тему даже скриншот не изменил (На др форуме )
 
бля где то я видел эту тему даже скриншот не изменил (На др форуме )
потому что я являюсь автором этой темы
 
Но что такое frm.dll?
берешь свою dll, называешь ее frm.dll, помещаешь ее рядом с D3d9Test, запускаешь его и вуаля, твоя длл подгрузилась к программе без всяких инжекторов и свистоплясок с перенаправлением оригинальных функций
 
потому что я являюсь автором этой темы
 

берешь свою dll, называешь ее frm.dll, помещаешь ее рядом с D3d9Test, запускаешь его и вуаля, твоя длл подгрузилась к программе без всяких инжекторов и свистоплясок с перенаправлением оригинальных функций
Хмм,это значит что я могу его внедрять в ксго,без инжектора?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хмм,это значит что я могу его внедрять в ксго,без инжектора?
В D3D9Test идёт автоматическая подгрузка dll с именем frm.dll. Ты её можешь внедрить в ксго используя любой метод инжекта.
 
Не подгружается.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Крайс, для некоторого понимания скинь исходники .exe .
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Извиняю возможно за глупый вопрос. Что делать если при инжекте в игру фулл экран, происходит краш? В плане, что бы заинжектить DLL надо игру сворачивать в оконный режим.
 
Извиняю возможно за глупый вопрос. Что делать если при инжекте в игру фулл экран, происходит краш? В плане, что бы заинжектить DLL надо игру сворачивать в оконный режим.
в myReset ты должен перегрузить все созданные тобой интерфейсы.
 
Почему у меня инжектится, но меню не отрисовывается?
 
Назад
Сверху Снизу