https://git.reactos.org/?p=reactos.git;a=commitdiff;h=62eeb158a5abef92d3dcc…
commit 62eeb158a5abef92d3dcc50f62395395df7f25f1
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Tue Oct 10 10:59:29 2023 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Tue Oct 10 10:59:29 2023 +0900
[MSPAINT] Improve Zoom tool (#5781)
- Delete CCanvasWindow::drawZoomFrame.
- Invalidate the canvas on mouse move when
the active tool is Zoom tool.
- Add ZoomTool::OnDrawOverlayOnCanvas to
draw the zoom rectangle without flickering.
- Improve the zoom trackbar position.
- Display the zoom rate on changing the value
of the zoom trackbar.
- Reverse the direction of the zoom trackbar.
- Don't draw the focus rectangle.
CORE-19215, CORE-19216
---
base/applications/mspaint/canvas.cpp | 23 ++-------------
base/applications/mspaint/canvas.h | 1 -
base/applications/mspaint/mouse.cpp | 15 ++++++++++
base/applications/mspaint/toolsettings.cpp | 47 +++++++++++++++++++++++-------
base/applications/mspaint/toolsettings.h | 2 ++
5 files changed, 57 insertions(+), 31 deletions(-)
diff --git a/base/applications/mspaint/canvas.cpp b/base/applications/mspaint/canvas.cpp
index ae860cb4d24..17eb2610ae2 100644
--- a/base/applications/mspaint/canvas.cpp
+++ b/base/applications/mspaint/canvas.cpp
@@ -29,18 +29,6 @@ CCanvasWindow::~CCanvasWindow()
::DeleteObject(m_ahbmCached[1]);
}
-VOID CCanvasWindow::drawZoomFrame(INT mouseX, INT mouseY)
-{
- // FIXME: Draw the border of the area that is to be zoomed in
- CRect rc;
- GetImageRect(rc);
- ImageToCanvas(rc);
-
- HDC hdc = GetDC();
- DrawXorRect(hdc, &rc);
- ReleaseDC(hdc);
-}
-
RECT CCanvasWindow::GetBaseRect()
{
CRect rcBase;
@@ -376,6 +364,9 @@ LRESULT CCanvasWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM
lParam, BOOL
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
CanvasToImage(pt);
+ if (toolsModel.GetActiveTool() == TOOL_ZOOM)
+ Invalidate();
+
if (m_hitSelection != HIT_NONE)
{
SelectionDragging(pt);
@@ -384,14 +375,6 @@ LRESULT CCanvasWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM
lParam, BOOL
if (!m_drawing || toolsModel.GetActiveTool() <= TOOL_AIRBRUSH)
{
- if (toolsModel.GetActiveTool() == TOOL_ZOOM)
- {
- Invalidate(FALSE);
- UpdateWindow();
- CanvasToImage(pt);
- drawZoomFrame(pt.x, pt.y);
- }
-
TRACKMOUSEEVENT tme = { sizeof(tme) };
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = m_hWnd;
diff --git a/base/applications/mspaint/canvas.h b/base/applications/mspaint/canvas.h
index dc26707be24..19920018214 100644
--- a/base/applications/mspaint/canvas.h
+++ b/base/applications/mspaint/canvas.h
@@ -62,7 +62,6 @@ protected:
RECT GetBaseRect();
VOID DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint);
VOID OnHVScroll(WPARAM wParam, INT fnBar);
- VOID drawZoomFrame(INT mouseX, INT mouseY);
HITTEST SelectionHitTest(POINT ptImage);
VOID StartSelectionDrag(HITTEST hit, POINT ptImage);
diff --git a/base/applications/mspaint/mouse.cpp b/base/applications/mspaint/mouse.cpp
index 20a8e2157e4..4984ab63432 100644
--- a/base/applications/mspaint/mouse.cpp
+++ b/base/applications/mspaint/mouse.cpp
@@ -569,6 +569,21 @@ struct ZoomTool : ToolBase
{
}
+ void OnDrawOverlayOnCanvas(HDC hdc) override
+ {
+ CRect rc;
+ canvasWindow.GetImageRect(rc);
+ canvasWindow.ImageToCanvas(rc);
+
+ POINT pt;
+ ::GetCursorPos(&pt);
+ ::ScreenToClient(canvasWindow, &pt);
+
+ // FIXME: Draw the border of the area that is to be zoomed in
+ if (rc.PtInRect(pt))
+ DrawXorRect(hdc, &rc);
+ }
+
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) override
{
if (bLeftButton)
diff --git a/base/applications/mspaint/toolsettings.cpp
b/base/applications/mspaint/toolsettings.cpp
index 3d869848480..daf1bfc064e 100644
--- a/base/applications/mspaint/toolsettings.cpp
+++ b/base/applications/mspaint/toolsettings.cpp
@@ -21,6 +21,10 @@
#define MARGIN1 3
#define MARGIN2 2
+#define MAX_ZOOM_TRACK 6
+#define MIN_ZOOM_TRACK 0
+#define DEFAULT_ZOOM_TRACK 3
+
static const BYTE s_AirRadius[4] = { 5, 8, 3, 12 };
CToolSettingsWindow toolSettingsWindow;
@@ -285,10 +289,13 @@ LRESULT CToolSettingsWindow::OnCreate(UINT nMsg, WPARAM wParam,
LPARAM lParam, W
m_hTranspIcon = (HICON)LoadImage(g_hinstExe, MAKEINTRESOURCE(IDI_TRANSPARENT),
IMAGE_ICON, CX_TRANS_ICON, CY_TRANS_ICON,
LR_DEFAULTCOLOR);
- RECT trackbarZoomPos = {1, 1, 1 + 40, 1 + 64};
+ RECT trackbarZoomPos, rect2;
+ calculateTwoBoxes(trackbarZoomPos, rect2);
+ ::InflateRect(&trackbarZoomPos, -1, -1);
+
trackbarZoom.Create(TRACKBAR_CLASS, m_hWnd, trackbarZoomPos, NULL, WS_CHILD |
TBS_VERT | TBS_AUTOTICKS);
- trackbarZoom.SendMessage(TBM_SETRANGE, (WPARAM) TRUE, MAKELPARAM(0, 6));
- trackbarZoom.SendMessage(TBM_SETPOS, (WPARAM) TRUE, (LPARAM) 3);
+ trackbarZoom.SendMessage(TBM_SETRANGE, TRUE, MAKELPARAM(MIN_ZOOM_TRACK,
MAX_ZOOM_TRACK));
+ trackbarZoom.SendMessage(TBM_SETPOS, TRUE, DEFAULT_ZOOM_TRACK);
return 0;
}
@@ -301,9 +308,30 @@ LRESULT CToolSettingsWindow::OnDestroy(UINT nMsg, WPARAM wParam,
LPARAM lParam,
LRESULT CToolSettingsWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled)
{
- if (!zoomTo(125 << trackbarZoom.SendMessage(TBM_GETPOS, 0, 0), 0, 0))
+ INT trackPos = MAX_ZOOM_TRACK - (INT)trackbarZoom.SendMessage(TBM_GETPOS, 0, 0);
+ zoomTo(MIN_ZOOM << trackPos, 0, 0);
+
+ INT zoomRate = toolsModel.GetZoom();
+
+ CString strZoom;
+ if (zoomRate % 10 == 0)
+ strZoom.Format(_T("%d%%"), zoomRate / 10);
+ else
+ strZoom.Format(_T("%d.%d%%"), zoomRate / 10, zoomRate % 10);
+
+ ::SendMessage(g_hStatusBar, SB_SETTEXT, 1, (LPARAM)(LPCTSTR)strZoom);
+
+ OnToolsModelZoomChanged(nMsg, wParam, lParam, bHandled);
+ return 0;
+}
+
+LRESULT CToolSettingsWindow::OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled)
+{
+ NMHDR *pnmhdr = (NMHDR*)lParam;
+ if (pnmhdr->code == NM_CUSTOMDRAW)
{
- OnToolsModelZoomChanged(nMsg, wParam, lParam, bHandled);
+ NMCUSTOMDRAW *pCustomDraw = (NMCUSTOMDRAW*)pnmhdr;
+ pCustomDraw->uItemState &= ~CDIS_FOCUS; // Do not draw the focus
}
return 0;
}
@@ -330,9 +358,7 @@ LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM
lParam, BO
PAINTSTRUCT ps;
HDC hdc = BeginPaint(&ps);
- if (toolsModel.GetActiveTool() == TOOL_ZOOM)
- ::DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, BF_RECT);
- else
+ if (toolsModel.GetActiveTool() != TOOL_ZOOM)
::DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, BF_RECT | BF_MIDDLE);
if (toolsModel.GetActiveTool() >= TOOL_RECT)
@@ -458,7 +484,7 @@ LRESULT CToolSettingsWindow::OnToolsModelSettingsChanged(UINT nMsg,
WPARAM wPara
LRESULT CToolSettingsWindow::OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM
lParam, BOOL& bHandled)
{
- int tbPos = 0;
+ int tbPos = MIN_ZOOM_TRACK;
int tempZoom = toolsModel.GetZoom();
while (tempZoom > MIN_ZOOM)
@@ -466,6 +492,7 @@ LRESULT CToolSettingsWindow::OnToolsModelZoomChanged(UINT nMsg, WPARAM
wParam, L
tbPos++;
tempZoom = tempZoom >> 1;
}
- trackbarZoom.SendMessage(TBM_SETPOS, (WPARAM) TRUE, (LPARAM) tbPos);
+
+ trackbarZoom.SendMessage(TBM_SETPOS, TRUE, MAX_ZOOM_TRACK - tbPos);
return 0;
}
diff --git a/base/applications/mspaint/toolsettings.h
b/base/applications/mspaint/toolsettings.h
index 7b582256731..b6cc0482083 100644
--- a/base/applications/mspaint/toolsettings.h
+++ b/base/applications/mspaint/toolsettings.h
@@ -17,6 +17,7 @@ public:
MESSAGE_HANDLER(WM_VSCROLL, OnVScroll)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
+ MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
MESSAGE_HANDLER(WM_TOOLSMODELTOOLCHANGED, OnToolsModelToolChanged)
MESSAGE_HANDLER(WM_TOOLSMODELSETTINGSCHANGED, OnToolsModelSettingsChanged)
MESSAGE_HANDLER(WM_TOOLSMODELZOOMCHANGED, OnToolsModelZoomChanged)
@@ -43,6 +44,7 @@ private:
LRESULT OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+ LRESULT OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled);
LRESULT OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled);
LRESULT OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled);