https://git.reactos.org/?p=reactos.git;a=commitdiff;h=fed7ee70a662f7c44a7d8faa3b00dd74bc6d5f03
commit fed7ee70a662f7c44a7d8faa3b00dd74bc6d5f03 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Sat Dec 16 20:46:40 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Sat Dec 16 20:46:40 2023 +0900 [SHIMGVW] Enable middle button dragging (#6173) --- dll/win32/shimgvw/CMakeLists.txt | 3 ++ dll/win32/shimgvw/res/handdrag.cur | Bin 0 -> 326 bytes dll/win32/shimgvw/resource.h | 3 ++ dll/win32/shimgvw/shimgvw.c | 70 +++++++++++++++++++++++++++++++++++-- dll/win32/shimgvw/shimgvw.rc | 2 ++ 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/dll/win32/shimgvw/CMakeLists.txt b/dll/win32/shimgvw/CMakeLists.txt index 3c2f5a1f3c3..1a4589abd43 100644 --- a/dll/win32/shimgvw/CMakeLists.txt +++ b/dll/win32/shimgvw/CMakeLists.txt @@ -9,6 +9,9 @@ list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/shimgvw_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/shimgvw.def) +file(GLOB_RECURSE shimgvw_rc_deps res/*.*) +add_rc_deps(shimgvw.rc ${shimgvw_rc_deps}) + add_library(shimgvw MODULE ${SOURCE}) set_module_type(shimgvw win32dll UNICODE) target_link_libraries(shimgvw wine) diff --git a/dll/win32/shimgvw/res/handdrag.cur b/dll/win32/shimgvw/res/handdrag.cur new file mode 100644 index 00000000000..74e5ba6b9c2 Binary files /dev/null and b/dll/win32/shimgvw/res/handdrag.cur differ diff --git a/dll/win32/shimgvw/resource.h b/dll/win32/shimgvw/resource.h index 68f91679139..96da8e444cf 100644 --- a/dll/win32/shimgvw/resource.h +++ b/dll/win32/shimgvw/resource.h @@ -7,6 +7,9 @@ #define IDI_JPG_ICON 4 #define IDI_PNG_ICON 5 +/* Cursors */ +#define IDC_HANDDRAG 100 + /* Toolbar images */ #define IDB_PREV_PIC 50 #define IDB_NEXT_PIC 51 diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c index b04363ed896..0503449d87c 100644 --- a/dll/win32/shimgvw/shimgvw.c +++ b/dll/win32/shimgvw/shimgvw.c @@ -103,6 +103,8 @@ typedef struct tagPREVIEW_DATA ANIME m_Anime; /* Animation */ INT m_xScrollOffset; INT m_yScrollOffset; + UINT m_nMouseDownMsg; + POINT m_ptOrigin; } PREVIEW_DATA, *PPREVIEW_DATA; static inline PPREVIEW_DATA @@ -885,9 +887,56 @@ Preview_EndSlideShow(HWND hwnd) static VOID ZoomWnd_OnButtonDown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + PPREVIEW_DATA pData = Preview_GetData(hwnd); HWND hParent = GetParent(hwnd); - if (!Preview_IsMainWnd(hParent)) - Preview_EndSlideShow(hParent); + if ((uMsg == WM_LBUTTONDOWN) || (uMsg == WM_RBUTTONDOWN)) + { + if (!Preview_IsMainWnd(hParent)) + Preview_EndSlideShow(hParent); + return; + } + + pData->m_nMouseDownMsg = uMsg; + pData->m_ptOrigin.x = GET_X_LPARAM(lParam); + pData->m_ptOrigin.y = GET_Y_LPARAM(lParam); + SetCapture(hwnd); + SetCursor(LoadCursorW(g_hInstance, MAKEINTRESOURCEW(IDC_HANDDRAG))); +} + +static VOID +ZoomWnd_OnMouseMove(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + if (pData->m_nMouseDownMsg == WM_MBUTTONDOWN) + { + INT x = GetScrollPos(hwnd, SB_HORZ) - (pt.x - pData->m_ptOrigin.x); + INT y = GetScrollPos(hwnd, SB_VERT) - (pt.y - pData->m_ptOrigin.y); + SendMessageW(hwnd, WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, x), 0); + SendMessageW(hwnd, WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, y), 0); + pData->m_ptOrigin = pt; + } +} + +static BOOL +ZoomWnd_OnSetCursor(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + if (pData->m_nMouseDownMsg == WM_MBUTTONDOWN) + { + SetCursor(LoadCursorW(g_hInstance, MAKEINTRESOURCEW(IDC_HANDDRAG))); + return TRUE; + } + return FALSE; +} + +static VOID +ZoomWnd_OnButtonUp(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + pData->m_nMouseDownMsg = 0; + ReleaseCapture(); } static VOID @@ -995,6 +1044,23 @@ ZoomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ZoomWnd_OnButtonDown(hwnd, uMsg, wParam, lParam); break; } + case WM_MOUSEMOVE: + { + ZoomWnd_OnMouseMove(hwnd, uMsg, wParam, lParam); + break; + } + case WM_SETCURSOR: + { + if (!ZoomWnd_OnSetCursor(hwnd, uMsg, wParam, lParam)) + return DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + { + ZoomWnd_OnButtonUp(hwnd, uMsg, wParam, lParam); + break; + } case WM_PAINT: { ZoomWnd_OnPaint(pData, hwnd); diff --git a/dll/win32/shimgvw/shimgvw.rc b/dll/win32/shimgvw/shimgvw.rc index 58684a5d95b..f42c29154cd 100644 --- a/dll/win32/shimgvw/shimgvw.rc +++ b/dll/win32/shimgvw/shimgvw.rc @@ -17,6 +17,8 @@ IDI_APP_ICON ICON "res/main.ico" IDI_BMP_ICON ICON "res/bmp.ico" IDI_PNG_ICON ICON "res/png.ico" +IDC_HANDDRAG CURSOR "res/handdrag.cur" + IDB_PREV_PIC BITMAP "res/prev.bmp" IDB_NEXT_PIC BITMAP "res/next.bmp" IDB_BEST_FIT BITMAP "res/best_fit.bmp"