- 148
- 55
День добрый. Подключил к своему плагину ImGui. Всё работает, но есть одна проблема. Когда на этапе загрузки игры свернуть окно (или выбрать другое окно), то выскакивает следующая ошибка, и игру крашит. Замечал, что у того же мунлоадера или других плагинов с этим всё нормально. Где я сделал что-то не так? Заранее благодарю за помощь.
C++:
#include <Windows.h>
#include <string>
#include "Shlobj.h"
#include "main.h"
#include "ImGui\imgui.h"
#include "ImGui\imgui_impl_dx9.h"
#include "ImGui\imgui_impl_win32.h"
#include <d3d9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include <tchar.h>
#include <regex>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"shell32.lib")
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
SAMPFUNCS *SF = new SAMPFUNCS();
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
//
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
SF->getRender()->EndRender();
}
return true;
}
HRESULT CALLBACK Reset(D3DPRESENT_PARAMETERS* pPresentationParameters)
{
ImGui_ImplDX9_InvalidateDeviceObjects();
return true;
}
bool CALLBACK WndProcHandler(HWND hwd, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGui_ImplWin32_WndProcHandler(hwd, msg, wParam, lParam);
return true;
}
void __stdcall mainloop()
{
static bool initialized = false;
if (!initialized)
{
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
// ImGui //
ImGui::CreateContext();
ImGuiIO& IO = ImGui::GetIO();
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(SF->getRender()->getD3DDevice());
ImFontConfig font_config;
TCHAR path[MAX_PATH];
HRESULT hr = SHGetFolderPathA(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, path);
std::string fPath = std::string(path).append("\\arialbd.ttf");
IO.Fonts->AddFontFromFileTTF(fPath.c_str(), 14.0f, &font_config, IO.Fonts->GetGlyphRangesCyrillic());
initialized = true;
}
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
if (dwReasonForCall == DLL_PROCESS_ATTACH)
SF->initPlugin(mainloop, hModule);
if (dwReasonForCall == DLL_PROCESS_DETACH) {
ImGui_ImplDX9_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
}
return TRUE;
}