mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Changed config overlay scroll bar shaft to scroll by 5%
This commit is contained in:
parent
17098e518d
commit
1b4c127491
@ -67,20 +67,6 @@ namespace
|
|||||||
return CALL_ORIG_FUNC(DefWindowProcA)(hwnd, uMsg, wParam, lParam);
|
return CALL_ORIG_FUNC(DefWindowProcA)(hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
POINT getRelativeCursorPos()
|
|
||||||
{
|
|
||||||
auto captureWindow = Input::getCaptureWindow();
|
|
||||||
const RECT rect = captureWindow->getRect();
|
|
||||||
const int scaleFactor = captureWindow->getScaleFactor();
|
|
||||||
|
|
||||||
auto cp = g_cursorPos;
|
|
||||||
cp.x /= scaleFactor;
|
|
||||||
cp.y /= scaleFactor;
|
|
||||||
cp.x -= rect.left;
|
|
||||||
cp.y -= rect.top;
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT CALLBACK lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (HC_ACTION == nCode &&
|
if (HC_ACTION == nCode &&
|
||||||
@ -126,7 +112,7 @@ namespace
|
|||||||
DDraw::RealPrimarySurface::scheduleOverlayUpdate();
|
DDraw::RealPrimarySurface::scheduleOverlayUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto cp = getRelativeCursorPos();
|
auto cp = Input::getRelativeCursorPos();
|
||||||
|
|
||||||
switch (wParam)
|
switch (wParam)
|
||||||
{
|
{
|
||||||
@ -249,6 +235,25 @@ namespace Input
|
|||||||
return g_cursorWindow;
|
return g_cursorWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
POINT getRelativeCursorPos()
|
||||||
|
{
|
||||||
|
auto captureWindow = Input::getCaptureWindow();
|
||||||
|
if (!captureWindow)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const RECT rect = captureWindow->getRect();
|
||||||
|
const int scaleFactor = captureWindow->getScaleFactor();
|
||||||
|
|
||||||
|
auto cp = g_cursorPos;
|
||||||
|
cp.x /= scaleFactor;
|
||||||
|
cp.y /= scaleFactor;
|
||||||
|
cp.x -= rect.left;
|
||||||
|
cp.y -= rect.top;
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
void installHooks()
|
void installHooks()
|
||||||
{
|
{
|
||||||
g_bmpArrow = CALL_ORIG_FUNC(LoadImageA)(Dll::g_currentModule, "BMP_ARROW", IMAGE_BITMAP, 0, 0, 0);
|
g_bmpArrow = CALL_ORIG_FUNC(LoadImageA)(Dll::g_currentModule, "BMP_ARROW", IMAGE_BITMAP, 0, 0, 0);
|
||||||
|
@ -20,6 +20,7 @@ namespace Input
|
|||||||
Overlay::Window* getCaptureWindow();
|
Overlay::Window* getCaptureWindow();
|
||||||
POINT getCursorPos();
|
POINT getCursorPos();
|
||||||
HWND getCursorWindow();
|
HWND getCursorWindow();
|
||||||
|
POINT getRelativeCursorPos();
|
||||||
void installHooks();
|
void installHooks();
|
||||||
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeydown = true);
|
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeydown = true);
|
||||||
void setCapture(Overlay::Control* control);
|
void setCapture(Overlay::Control* control);
|
||||||
|
@ -38,41 +38,57 @@ namespace Overlay
|
|||||||
RECT r = { m_leftArrow.right, m_rect.top, m_rightArrow.left, m_rect.bottom };
|
RECT r = { m_leftArrow.right, m_rect.top, m_rightArrow.left, m_rect.bottom };
|
||||||
CALL_ORIG_FUNC(Rectangle)(dc, r.left - 1, r.top, r.right + 1, r.bottom);
|
CALL_ORIG_FUNC(Rectangle)(dc, r.left - 1, r.top, r.right + 1, r.bottom);
|
||||||
|
|
||||||
const int thumbPos = (m_pos - m_min) * (r.right - r.left - ARROW_SIZE) / (m_max - m_min);
|
r = getThumbRect();
|
||||||
r = { m_leftArrow.right + thumbPos, r.top, m_leftArrow.right + thumbPos + ARROW_SIZE, r.bottom };
|
|
||||||
SelectObject(dc, GetStockObject(DC_BRUSH));
|
SelectObject(dc, GetStockObject(DC_BRUSH));
|
||||||
CALL_ORIG_FUNC(Ellipse)(dc, r.left, r.top, r.right, r.bottom);
|
CALL_ORIG_FUNC(Ellipse)(dc, r.left, r.top, r.right, r.bottom);
|
||||||
SelectObject(dc, GetStockObject(NULL_BRUSH));
|
SelectObject(dc, GetStockObject(NULL_BRUSH));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ScrollBarControl::getPageSize() const
|
||||||
|
{
|
||||||
|
return std::max((m_max - m_min) / 20, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
RECT ScrollBarControl::getThumbRect() const
|
||||||
|
{
|
||||||
|
const int thumbPos = (m_pos - m_min) * (m_rightArrow.left - m_leftArrow.right - ARROW_SIZE) / (m_max - m_min);
|
||||||
|
return RECT{ m_leftArrow.right + thumbPos, m_rect.top, m_leftArrow.right + thumbPos + ARROW_SIZE, m_rect.bottom };
|
||||||
|
}
|
||||||
|
|
||||||
void ScrollBarControl::onLButtonDown(POINT pos)
|
void ScrollBarControl::onLButtonDown(POINT pos)
|
||||||
{
|
{
|
||||||
Input::setCapture(this);
|
Input::setCapture(this);
|
||||||
|
|
||||||
if (PtInRect(&m_leftArrow, pos))
|
if (PtInRect(&m_leftArrow, pos))
|
||||||
{
|
{
|
||||||
setPos(m_pos - 1);
|
m_state = State::LEFT_ARROW_PRESSED;
|
||||||
if (State::IDLE == m_state)
|
|
||||||
{
|
|
||||||
m_state = State::LEFT_ARROW_PRESSED;
|
|
||||||
startRepeatTimer(REPEAT_DELAY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (PtInRect(&m_rightArrow, pos))
|
else if (PtInRect(&m_rightArrow, pos))
|
||||||
{
|
{
|
||||||
setPos(m_pos + 1);
|
m_state = State::RIGHT_ARROW_PRESSED;
|
||||||
if (State::IDLE == m_state)
|
|
||||||
{
|
|
||||||
m_state = State::RIGHT_ARROW_PRESSED;
|
|
||||||
startRepeatTimer(REPEAT_DELAY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
onThumbTrack(pos);
|
RECT r = getThumbRect();
|
||||||
if (State::IDLE == m_state)
|
if (PtInRect(&r, pos))
|
||||||
{
|
{
|
||||||
m_state = State::THUMB_TRACKING;
|
m_state = State::THUMB_PRESSED;
|
||||||
}
|
}
|
||||||
|
else if (pos.x < r.left)
|
||||||
|
{
|
||||||
|
m_state = State::LEFT_SHAFT_PRESSED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_state = State::RIGHT_SHAFT_PRESSED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scroll();
|
||||||
|
|
||||||
|
if (State::THUMB_PRESSED != m_state)
|
||||||
|
{
|
||||||
|
startRepeatTimer(REPEAT_DELAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,39 +102,19 @@ namespace Overlay
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScrollBarControl::onMouseMove(POINT pos)
|
void ScrollBarControl::onMouseMove(POINT /*pos*/)
|
||||||
{
|
{
|
||||||
if (State::THUMB_TRACKING == m_state)
|
if (State::THUMB_PRESSED == m_state)
|
||||||
{
|
{
|
||||||
onThumbTrack(pos);
|
scroll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScrollBarControl::onRepeat()
|
void ScrollBarControl::onRepeat()
|
||||||
{
|
{
|
||||||
stopRepeatTimer();
|
stopRepeatTimer();
|
||||||
|
scroll();
|
||||||
switch (m_state)
|
startRepeatTimer(REPEAT_INTERVAL);
|
||||||
{
|
|
||||||
case State::LEFT_ARROW_PRESSED:
|
|
||||||
setPos(m_pos - 1);
|
|
||||||
startRepeatTimer(REPEAT_INTERVAL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State::RIGHT_ARROW_PRESSED:
|
|
||||||
setPos(m_pos + 1);
|
|
||||||
startRepeatTimer(REPEAT_INTERVAL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScrollBarControl::onThumbTrack(POINT pos)
|
|
||||||
{
|
|
||||||
const auto minPos = m_leftArrow.right + ARROW_SIZE / 2;
|
|
||||||
const auto maxPos = m_rightArrow.left - ARROW_SIZE / 2;
|
|
||||||
pos.x = std::max(pos.x, minPos);
|
|
||||||
pos.x = std::min(pos.x, maxPos);
|
|
||||||
setPos(m_min + roundDiv((pos.x - minPos) * (m_max - m_min), maxPos - minPos));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CALLBACK ScrollBarControl::repeatTimerProc(HWND /*hwnd*/, UINT /*message*/, UINT_PTR /*iTimerID*/, DWORD /*dwTime*/)
|
void CALLBACK ScrollBarControl::repeatTimerProc(HWND /*hwnd*/, UINT /*message*/, UINT_PTR /*iTimerID*/, DWORD /*dwTime*/)
|
||||||
@ -126,6 +122,45 @@ namespace Overlay
|
|||||||
static_cast<ScrollBarControl*>(Input::getCapture())->onRepeat();
|
static_cast<ScrollBarControl*>(Input::getCapture())->onRepeat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScrollBarControl::scroll()
|
||||||
|
{
|
||||||
|
switch (m_state)
|
||||||
|
{
|
||||||
|
case State::LEFT_ARROW_PRESSED:
|
||||||
|
setPos(m_pos - 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case State::RIGHT_ARROW_PRESSED:
|
||||||
|
setPos(m_pos + 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case State::LEFT_SHAFT_PRESSED:
|
||||||
|
if (Input::getRelativeCursorPos().x < getThumbRect().left)
|
||||||
|
{
|
||||||
|
setPos(m_pos - getPageSize());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case State::RIGHT_SHAFT_PRESSED:
|
||||||
|
if (Input::getRelativeCursorPos().x >= getThumbRect().right)
|
||||||
|
{
|
||||||
|
setPos(m_pos + getPageSize());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case State::THUMB_PRESSED:
|
||||||
|
{
|
||||||
|
POINT pos = Input::getRelativeCursorPos();
|
||||||
|
const auto minPos = m_leftArrow.right + ARROW_SIZE / 2;
|
||||||
|
const auto maxPos = m_rightArrow.left - ARROW_SIZE / 2;
|
||||||
|
pos.x = std::max(pos.x, minPos);
|
||||||
|
pos.x = std::min(pos.x, maxPos);
|
||||||
|
setPos(m_min + roundDiv((pos.x - minPos) * (m_max - m_min), maxPos - minPos));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScrollBarControl::setPos(int pos)
|
void ScrollBarControl::setPos(int pos)
|
||||||
{
|
{
|
||||||
pos = std::max(pos, m_min);
|
pos = std::max(pos, m_min);
|
||||||
|
@ -18,26 +18,30 @@ namespace Overlay
|
|||||||
IDLE,
|
IDLE,
|
||||||
LEFT_ARROW_PRESSED,
|
LEFT_ARROW_PRESSED,
|
||||||
RIGHT_ARROW_PRESSED,
|
RIGHT_ARROW_PRESSED,
|
||||||
THUMB_TRACKING,
|
LEFT_SHAFT_PRESSED,
|
||||||
|
RIGHT_SHAFT_PRESSED,
|
||||||
|
THUMB_PRESSED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
virtual void draw(HDC dc) override;
|
||||||
|
virtual void onLButtonDown(POINT pos) override;
|
||||||
|
virtual void onLButtonUp(POINT pos) override;
|
||||||
|
virtual void onMouseMove(POINT pos) override;
|
||||||
|
|
||||||
|
int getPageSize() const;
|
||||||
|
RECT getThumbRect() const;
|
||||||
|
void onRepeat();
|
||||||
|
void scroll();
|
||||||
|
|
||||||
|
static void CALLBACK repeatTimerProc(HWND hwnd, UINT message, UINT_PTR iTimerID, DWORD dwTime);
|
||||||
|
static void startRepeatTimer(DWORD time);
|
||||||
|
static void stopRepeatTimer();
|
||||||
|
|
||||||
int m_min;
|
int m_min;
|
||||||
int m_max;
|
int m_max;
|
||||||
int m_pos;
|
int m_pos;
|
||||||
RECT m_leftArrow;
|
RECT m_leftArrow;
|
||||||
RECT m_rightArrow;
|
RECT m_rightArrow;
|
||||||
State m_state;
|
State m_state;
|
||||||
|
|
||||||
virtual void draw(HDC dc) override;
|
|
||||||
virtual void onLButtonDown(POINT pos) override;
|
|
||||||
virtual void onLButtonUp(POINT pos) override;
|
|
||||||
virtual void onMouseMove(POINT pos) override;
|
|
||||||
|
|
||||||
void onRepeat();
|
|
||||||
void onThumbTrack(POINT pos);
|
|
||||||
|
|
||||||
static void CALLBACK repeatTimerProc(HWND hwnd, UINT message, UINT_PTR iTimerID, DWORD dwTime);
|
|
||||||
static void startRepeatTimer(DWORD time);
|
|
||||||
static void stopRepeatTimer();
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user