https://git.reactos.org/?p=reactos.git;a=commitdiff;h=97e53c6963678be5f399e99e179c177358c14ab3

commit 97e53c6963678be5f399e99e179c177358c14ab3
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Tue Oct 17 15:58:34 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Tue Oct 17 15:58:34 2023 +0900

    [MSPAINT] Implement mouse middle button dragging (#5804)
    
    - Handle WM_MBUTTONDOWN and
      WM_MBUTTONUP messages.
    - Implement dragging by mouse middle button.
    - Add IDC_HANDDRAG cursor resource.
    CORE-19094
---
 base/applications/mspaint/canvas.cpp         |  33 +++++++++++++++++++++++----
 base/applications/mspaint/canvas.h           |   2 ++
 base/applications/mspaint/icons/handdrag.cur | Bin 0 -> 326 bytes
 base/applications/mspaint/resource.h         |   1 +
 base/applications/mspaint/rsrc.rc            |   1 +
 5 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/base/applications/mspaint/canvas.cpp 
b/base/applications/mspaint/canvas.cpp
index e8b024e21ec..b423662d882 100644
--- a/base/applications/mspaint/canvas.cpp
+++ b/base/applications/mspaint/canvas.cpp
@@ -278,7 +278,7 @@ VOID CCanvasWindow::OnHVScroll(WPARAM wParam, INT fnBar)
     {
         case SB_THUMBTRACK:
         case SB_THUMBPOSITION:
-            si.nPos = HIWORD(wParam);
+            si.nPos = (SHORT)HIWORD(wParam);
             break;
         case SB_LINELEFT:
             si.nPos -= 5;
@@ -293,9 +293,9 @@ VOID CCanvasWindow::OnHVScroll(WPARAM wParam, INT fnBar)
             si.nPos += si.nPage;
             break;
     }
+    si.nPos = max(min(si.nPos, si.nMax), si.nMin);
     SetScrollInfo(fnBar, &si);
-    updateScrollRange();
-    Invalidate(FALSE); // FIXME: Flicker
+    Invalidate();
 }
 
 LRESULT CCanvasWindow::OnHScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, 
BOOL& bHandled)
@@ -315,7 +315,15 @@ LRESULT CCanvasWindow::OnButtonDown(UINT nMsg, WPARAM 
wParam, LPARAM lParam, BOO
     POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
 
     m_nMouseDownMsg = nMsg;
-    BOOL bLeftButton = (m_nMouseDownMsg == WM_LBUTTONDOWN);
+    BOOL bLeftButton = (nMsg == WM_LBUTTONDOWN);
+
+    if (nMsg == WM_MBUTTONDOWN)
+    {
+        m_ptOrig = pt;
+        SetCapture();
+        ::SetCursor(::LoadCursor(g_hinstExe, MAKEINTRESOURCE(IDC_HANDDRAG)));
+        return 0;
+    }
 
     HITTEST hitSelection = SelectionHitTest(pt);
     if (hitSelection != HIT_NONE)
@@ -407,6 +415,17 @@ LRESULT CCanvasWindow::OnButtonDblClk(UINT nMsg, WPARAM 
wParam, LPARAM lParam, B
 LRESULT CCanvasWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, 
BOOL& bHandled)
 {
     POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
+
+    if (m_nMouseDownMsg == WM_MBUTTONDOWN)
+    {
+        INT x = GetScrollPos(SB_HORZ) - (pt.x - m_ptOrig.x);
+        INT y = GetScrollPos(SB_VERT) - (pt.y - m_ptOrig.y);
+        SendMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, x), 0);
+        SendMessage(WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, y), 0);
+        m_ptOrig = pt;
+        return 0;
+    }
+
     CanvasToImage(pt);
 
     if (toolsModel.GetActiveTool() == TOOL_ZOOM)
@@ -675,6 +694,12 @@ LRESULT CCanvasWindow::OnSetCursor(UINT nMsg, WPARAM 
wParam, LPARAM lParam, BOOL
         return 0;
     }
 
+    if (m_nMouseDownMsg == WM_MBUTTONDOWN)
+    {
+        ::SetCursor(::LoadCursor(g_hinstExe, MAKEINTRESOURCE(IDC_HANDDRAG)));
+        return 0;
+    }
+
     POINT pt;
     ::GetCursorPos(&pt);
     ScreenToClient(&pt);
diff --git a/base/applications/mspaint/canvas.h 
b/base/applications/mspaint/canvas.h
index 238229e3b2b..76e7225ccfd 100644
--- a/base/applications/mspaint/canvas.h
+++ b/base/applications/mspaint/canvas.h
@@ -22,11 +22,13 @@ public:
         MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
         MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
         MESSAGE_HANDLER(WM_RBUTTONDOWN, OnButtonDown)
+        MESSAGE_HANDLER(WM_MBUTTONDOWN, OnButtonDown)
         MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnButtonDblClk)
         MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnButtonDblClk)
         MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
         MESSAGE_HANDLER(WM_LBUTTONUP, OnButtonUp)
         MESSAGE_HANDLER(WM_RBUTTONUP, OnButtonUp)
+        MESSAGE_HANDLER(WM_MBUTTONUP, OnButtonUp)
         MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
         MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
         MESSAGE_HANDLER(WM_CANCELMODE, OnCancelMode)
diff --git a/base/applications/mspaint/icons/handdrag.cur 
b/base/applications/mspaint/icons/handdrag.cur
new file mode 100644
index 00000000000..74e5ba6b9c2
Binary files /dev/null and b/base/applications/mspaint/icons/handdrag.cur differ
diff --git a/base/applications/mspaint/resource.h 
b/base/applications/mspaint/resource.h
index b41486cee4d..3f87e6e42e1 100644
--- a/base/applications/mspaint/resource.h
+++ b/base/applications/mspaint/resource.h
@@ -22,6 +22,7 @@
 #define IDC_ZOOM     532
 #define IDC_PEN      533
 #define IDC_AIRBRUSH 534
+#define IDC_HANDDRAG 535
 
 #define IDI_HORZSTRETCH 535
 #define IDI_VERTSTRETCH 536
diff --git a/base/applications/mspaint/rsrc.rc 
b/base/applications/mspaint/rsrc.rc
index 4bca40c0a6f..1f0ee5aca23 100644
--- a/base/applications/mspaint/rsrc.rc
+++ b/base/applications/mspaint/rsrc.rc
@@ -33,6 +33,7 @@ IDC_COLOR ICON "icons/color_cur.ico"
 IDC_ZOOM ICON "icons/zoom_cur.ico"
 IDC_PEN ICON "icons/pen_cur.ico"
 IDC_AIRBRUSH ICON "icons/airbrush_cur.ico"
+IDC_HANDDRAG CURSOR "icons/handdrag.cur"
 
 IDI_HORZSTRETCH ICON "icons/horzstretch.ico"
 IDI_VERTSTRETCH ICON "icons/vertstretch.ico"

Reply via email to