feat: 叠加层初步支持鼠标

This commit is contained in:
刘旭 2023-07-10 23:12:31 +08:00
commit 1d8b8564d4
7 changed files with 89 additions and 65 deletions

View file

@ -26,70 +26,6 @@ ImGuiImpl::~ImGuiImpl() noexcept {
}
}
/*
static std::optional<LRESULT> WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
ImGuiIO& io = ImGui::GetIO();
if (!io.WantCaptureMouse) {
if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) {
MagApp::Get().GetRenderer().SetUIVisibility(false);
}
return std::nullopt;
}
switch (msg) {
case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
{
int button = 0;
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
if (!ImGui::IsAnyMouseDown()) {
if (!GetCapture()) {
SetCapture(hwnd);
}
MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay();
}
io.MouseDown[button] = true;
break;
}
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_XBUTTONUP:
{
int button = 0;
if (msg == WM_LBUTTONUP) { button = 0; }
if (msg == WM_RBUTTONUP) { button = 1; }
if (msg == WM_MBUTTONUP) { button = 2; }
if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
io.MouseDown[button] = false;
if (!ImGui::IsAnyMouseDown()) {
if (GetCapture() == hwnd) {
ReleaseCapture();
}
MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay();
}
break;
}
case WM_MOUSEWHEEL:
io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
break;
case WM_MOUSEHWHEEL:
io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
break;
}
return std::nullopt;
}
static LRESULT CALLBACK LowLevelMouseProc(
_In_ int nCode,
@ -345,4 +281,69 @@ void ImGuiImpl::ClearStates() {
}*/
}
void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept {
ImGuiIO& io = ImGui::GetIO();
/*if (!io.WantCaptureMouse) {
if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) {
MagApp::Get().GetRenderer().SetUIVisibility(false);
}
return std::nullopt;
}*/
switch (msg) {
case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
{
int button = 0;
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
if (!ImGui::IsAnyMouseDown()) {
if (!GetCapture()) {
SetCapture(ScalingWindow::Get().Handle());
}
//MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay();
}
io.MouseDown[button] = true;
break;
}
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_XBUTTONUP:
{
int button = 0;
if (msg == WM_LBUTTONUP) { button = 0; }
if (msg == WM_RBUTTONUP) { button = 1; }
if (msg == WM_MBUTTONUP) { button = 2; }
if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
io.MouseDown[button] = false;
if (!ImGui::IsAnyMouseDown()) {
if (GetCapture() == ScalingWindow::Get().Handle()) {
ReleaseCapture();
}
//MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay();
}
break;
}
case WM_MOUSEWHEEL:
io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
break;
case WM_MOUSEHWHEEL:
io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
break;
}
}
}

View file

@ -21,6 +21,8 @@ public:
void ClearStates();
void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept;
// 将提示窗口限制在屏幕内
static void Tooltip(const char* content, float maxWidth = -1.0f);
private:

View file

@ -89,6 +89,10 @@ void OverlayDrawer::SetUIVisibility(bool value) noexcept {
}
void OverlayDrawer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept {
_imguiImpl.MessageHandler(msg, wParam, lParam);
}
static const std::wstring& GetAppLanguage() noexcept {
static std::wstring language;
if (language.empty()) {

View file

@ -22,6 +22,8 @@ public:
void SetUIVisibility(bool value) noexcept;
void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept;
private:
bool _BuildFonts() noexcept;
void _BuildFontUI(std::wstring_view language, const std::vector<uint8_t>& fontData, ImVector<ImWchar>& uiRanges) noexcept;

View file

@ -118,6 +118,16 @@ void Renderer::OnCursorVisibilityChanged(bool isVisible) {
});
}
void Renderer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept {
if (_overlayDrawer) {
_overlayDrawer->MessageHandler(msg, wParam, lParam);
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL) {
_FrontendRender();
_FrontendRender();
}
}
}
bool Renderer::_CreateSwapChain() noexcept {
DXGI_SWAP_CHAIN_DESC1 sd{};
const RECT& scalingWndRect = ScalingWindow::Get().WndRect();

View file

@ -34,6 +34,8 @@ public:
void OnCursorVisibilityChanged(bool isVisible);
void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept;
private:
bool _CreateSwapChain() noexcept;

View file

@ -208,6 +208,10 @@ void ScalingWindow::ToggleOverlay() noexcept {
}
LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept {
if (_renderer) {
_renderer->MessageHandler(msg, wParam, lParam);
}
switch (msg) {
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
@ -245,7 +249,6 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n
}
}
}
break;
}
case WM_DESTROY: