https://git.reactos.org/?p=reactos.git;a=commitdiff;h=62eeb158a5abef92d3dcc50f62395395df7f25f1
commit 62eeb158a5abef92d3dcc50f62395395df7f25f1 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Tue Oct 10 10:59:29 2023 +0900 Commit: GitHub <nore...@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);