https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0839711566bf13a111bba7...
commit 0839711566bf13a111bba72f8bc88fa1392c3cd0 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Sun Jan 30 12:05:23 2022 +0900 Commit: GitHub noreply@github.com CommitDate: Sun Jan 30 12:05:23 2022 +0900
[MSPAINT] Improve Undo/Redo and finishing tool (#4324)
- Fix Undo/Redo mechanism. - Finish drawing when the tool is to be chanaged and when the file is to be saved. - Add ToolBase::OnFinishDraw to virtualize finishing drawing. - Extend bClearRedo parameter to ImageModel::Undo. - Add ImageModel::DrawSelectionBackground and ImageModel::DeleteSelection methods. - Fix some WM_PAINT message handling. CORE-17969 --- base/applications/mspaint/history.cpp | 32 +++- base/applications/mspaint/history.h | 5 +- base/applications/mspaint/imgarea.cpp | 9 +- base/applications/mspaint/imgarea.h | 7 +- base/applications/mspaint/mouse.cpp | 219 +++++++++++++++++++-------- base/applications/mspaint/palette.cpp | 6 +- base/applications/mspaint/selection.cpp | 67 ++++---- base/applications/mspaint/selection.h | 13 ++ base/applications/mspaint/selectionmodel.cpp | 5 - base/applications/mspaint/selectionmodel.h | 1 - base/applications/mspaint/toolsettings.cpp | 7 +- base/applications/mspaint/toolsmodel.cpp | 31 ++-- base/applications/mspaint/toolsmodel.h | 2 + base/applications/mspaint/winproc.cpp | 56 +++++-- 14 files changed, 311 insertions(+), 149 deletions(-)
diff --git a/base/applications/mspaint/history.cpp b/base/applications/mspaint/history.cpp index 7aa36fab4dc..bc0749148fa 100644 --- a/base/applications/mspaint/history.cpp +++ b/base/applications/mspaint/history.cpp @@ -57,7 +57,7 @@ void ImageModel::CopyPrevious() imageSaved = FALSE; }
-void ImageModel::Undo() +void ImageModel::Undo(BOOL bClearRedo) { ATLTRACE("%s: %d\n", __FUNCTION__, undoSteps); if (undoSteps > 0) @@ -68,7 +68,9 @@ void ImageModel::Undo() currInd = (currInd + HISTORYSIZE - 1) % HISTORYSIZE; SelectObject(hDrawingDC, hBms[currInd]); undoSteps--; - if (redoSteps < HISTORYSIZE - 1) + if (bClearRedo) + redoSteps = 0; + else if (redoSteps < HISTORYSIZE - 1) redoSteps++; if (GetWidth() != oldWidth || GetHeight() != oldHeight) NotifyDimensionsChanged(); @@ -251,3 +253,29 @@ void ImageModel::RotateNTimes90Degrees(int iN) } NotifyImageChanged(); } + +void ImageModel::DrawSelectionBackground(COLORREF rgbBG) +{ + if (toolsModel.GetActiveTool() == TOOL_FREESEL) + selectionModel.DrawBackgroundPoly(hDrawingDC, rgbBG); + else + selectionModel.DrawBackgroundRect(hDrawingDC, rgbBG); +} + +void ImageModel::DeleteSelection() +{ + if (selectionWindow.IsWindowVisible()) + ResetToPrevious(); + CopyPrevious(); + if (selectionWindow.IsWindowVisible()) + Undo(TRUE); + DrawSelectionBackground(paletteModel.GetBgColor()); + selectionWindow.ShowWindow(SW_HIDE); + NotifyImageChanged(); +} + +void ImageModel::Bound(POINT& pt) +{ + pt.x = max(0, min(pt.x, GetWidth())); + pt.y = max(0, min(pt.y, GetHeight())); +} diff --git a/base/applications/mspaint/history.h b/base/applications/mspaint/history.h index 697b65bf128..17ef43b9e48 100644 --- a/base/applications/mspaint/history.h +++ b/base/applications/mspaint/history.h @@ -26,7 +26,7 @@ private: public: ImageModel(); void CopyPrevious(void); - void Undo(void); + void Undo(BOOL bClearRedo = FALSE); void Redo(void); void ResetToPrevious(void); void ClearHistory(void); @@ -45,4 +45,7 @@ public: void FlipHorizontally(); void FlipVertically(); void RotateNTimes90Degrees(int iN); + void DrawSelectionBackground(COLORREF rgbBG); + void DeleteSelection(); + void Bound(POINT& pt); }; diff --git a/base/applications/mspaint/imgarea.cpp b/base/applications/mspaint/imgarea.cpp index 0cb2f8de2ab..c0a5f832251 100644 --- a/base/applications/mspaint/imgarea.cpp +++ b/base/applications/mspaint/imgarea.cpp @@ -259,7 +259,7 @@ LRESULT CImgAreaWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& } else { - if (drawing || ToolBase::pointSP != 0) + if (drawing || ToolBase::pointSP != 0 || selectionWindow.IsWindowVisible()) cancelDrawing(); } } @@ -411,3 +411,10 @@ LRESULT CImgAreaWindow::OnCtlColorEdit(UINT nMsg, WPARAM wParam, LPARAM lParam, SetBkMode(hdc, TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH); } + +void CImgAreaWindow::finishDrawing() +{ + toolsModel.OnFinishDraw(); + drawing = FALSE; + Invalidate(FALSE); +} diff --git a/base/applications/mspaint/imgarea.h b/base/applications/mspaint/imgarea.h index a898f1e893b..384b8ac3ff4 100644 --- a/base/applications/mspaint/imgarea.h +++ b/base/applications/mspaint/imgarea.h @@ -17,6 +17,10 @@ public: { }
+ BOOL drawing; + void cancelDrawing(); + void finishDrawing(); + DECLARE_WND_CLASS_EX(_T("ImgAreaWindow"), CS_DBLCLKS, COLOR_BTNFACE)
BEGIN_MSG_MAP(CImgAreaWindow) @@ -40,8 +44,6 @@ public: MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColorEdit) END_MSG_MAP()
- BOOL drawing; - private: LRESULT OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnEraseBkGnd(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); @@ -63,5 +65,4 @@ private: LRESULT OnCtlColorEdit(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
void drawZoomFrame(int mouseX, int mouseY); - void cancelDrawing(); }; diff --git a/base/applications/mspaint/mouse.cpp b/base/applications/mspaint/mouse.cpp index b442d0c9daf..fda0bc64a81 100644 --- a/base/applications/mspaint/mouse.cpp +++ b/base/applications/mspaint/mouse.cpp @@ -76,6 +76,10 @@ void updateLast(LONG x, LONG y) void ToolBase::reset() { pointSP = 0; + start.x = start.y = last.x = last.y = -1; + selectionModel.ResetPtStack(); + if (selectionWindow.IsWindow()) + selectionWindow.ShowWindow(SW_HIDE); }
void ToolBase::OnCancelDraw() @@ -83,6 +87,11 @@ void ToolBase::OnCancelDraw() reset(); }
+void ToolBase::OnFinishDraw() +{ + reset(); +} + void ToolBase::beginEvent() { m_hdc = imageModel.GetDC(); @@ -100,48 +109,75 @@ void ToolBase::endEvent() // TOOL_FREESEL struct FreeSelTool : ToolBase { - FreeSelTool() : ToolBase(TOOL_FREESEL) + BOOL m_bLeftButton; + + FreeSelTool() : ToolBase(TOOL_FREESEL), m_bLeftButton(FALSE) { }
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) { - imageModel.CopyPrevious(); - selectionWindow.ShowWindow(SW_HIDE); - selectionModel.ResetPtStack(); - selectionModel.PushToPtStack(x, y); + if (bLeftButton) + { + imageModel.CopyPrevious(); + selectionWindow.ShowWindow(SW_HIDE); + selectionModel.ResetPtStack(); + selectionModel.PushToPtStack(x, y); + } + m_bLeftButton = bLeftButton; }
void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) { - if (selectionModel.PtStackSize() == 1) - imageModel.CopyPrevious(); - selectionModel.PushToPtStack(max(0, min(x, imageModel.GetWidth())), max(0, min(y, imageModel.GetHeight()))); - imageModel.ResetToPrevious(); - selectionModel.DrawFramePoly(m_hdc); + if (bLeftButton) + { + POINT pt = { x, y }; + imageModel.Bound(pt); + selectionModel.PushToPtStack(pt.x, pt.y); + imageModel.ResetToPrevious(); + selectionModel.DrawFramePoly(m_hdc); + } }
void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) { - selectionModel.CalculateBoundingBoxAndContents(m_hdc); - if (selectionModel.PtStackSize() > 1) + if (bLeftButton) { - selectionModel.DrawBackgroundPoly(m_hdc, m_bg); - imageModel.CopyPrevious(); - - selectionModel.DrawSelection(m_hdc); + imageModel.ResetToPrevious(); + if (selectionModel.PtStackSize() > 2) + { + selectionModel.CalculateBoundingBoxAndContents(m_hdc); + placeSelWin(); + selectionWindow.IsMoved(FALSE); + selectionWindow.ShowWindow(SW_SHOWNOACTIVATE); + } + else + { + imageModel.Undo(TRUE); + selectionWindow.IsMoved(FALSE); + selectionModel.ResetPtStack(); + selectionWindow.ShowWindow(SW_HIDE); + } + } + }
- placeSelWin(); - selectionWindow.ShowWindow(SW_SHOW); - ForceRefreshSelectionContents(); + void OnFinishDraw() + { + if (m_bLeftButton) + { + selectionWindow.IsMoved(FALSE); + selectionWindow.ForceRefreshSelectionContents(); } - selectionModel.ResetPtStack(); + m_bLeftButton = FALSE; + ToolBase::OnFinishDraw(); }
void OnCancelDraw() { - imageModel.ResetToPrevious(); - selectionModel.ResetPtStack(); + if (m_bLeftButton) + imageModel.Undo(TRUE); + m_bLeftButton = FALSE; + selectionWindow.IsMoved(FALSE); ToolBase::OnCancelDraw(); } }; @@ -149,31 +185,32 @@ struct FreeSelTool : ToolBase // TOOL_RECTSEL struct RectSelTool : ToolBase { - RectSelTool() : ToolBase(TOOL_RECTSEL) + BOOL m_bLeftButton; + + RectSelTool() : ToolBase(TOOL_RECTSEL), m_bLeftButton(FALSE) { }
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) { - imageModel.CopyPrevious(); if (bLeftButton) { imageModel.CopyPrevious(); selectionWindow.ShowWindow(SW_HIDE); selectionModel.SetSrcRectSizeToZero(); } + m_bLeftButton = bLeftButton; }
void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) { - POINT temp; if (bLeftButton) { imageModel.ResetToPrevious(); - temp.x = max(0, min(x, imageModel.GetWidth())); - temp.y = max(0, min(y, imageModel.GetHeight())); - selectionModel.SetSrcAndDestRectFromPoints(start, temp); - RectSel(m_hdc, start.x, start.y, temp.x, temp.y); + POINT pt = { x, y }; + imageModel.Bound(pt); + selectionModel.SetSrcAndDestRectFromPoints(start, pt); + RectSel(m_hdc, start.x, start.y, pt.x, pt.y); } }
@@ -182,25 +219,35 @@ struct RectSelTool : ToolBase if (bLeftButton) { imageModel.ResetToPrevious(); + if (start.x == x && start.y == y) + imageModel.Undo(TRUE); + selectionModel.CalculateContents(m_hdc); + placeSelWin(); + selectionWindow.IsMoved(FALSE); if (selectionModel.IsSrcRectSizeNonzero()) - { - selectionModel.CalculateContents(m_hdc); - selectionModel.DrawBackgroundRect(m_hdc, m_bg); - imageModel.CopyPrevious(); - - selectionModel.DrawSelection(m_hdc); + selectionWindow.ShowWindow(SW_SHOWNOACTIVATE); + else + selectionWindow.ShowWindow(SW_HIDE); + } + }
- placeSelWin(); - selectionWindow.ShowWindow(SW_SHOW); - ForceRefreshSelectionContents(); - } + void OnFinishDraw() + { + if (m_bLeftButton) + { + selectionWindow.IsMoved(FALSE); + selectionWindow.ForceRefreshSelectionContents(); } + m_bLeftButton = FALSE; + ToolBase::OnFinishDraw(); }
void OnCancelDraw() { - imageModel.ResetToPrevious(); - selectionModel.ResetPtStack(); + if (m_bLeftButton) + imageModel.Undo(TRUE); + m_bLeftButton = FALSE; + selectionWindow.IsMoved(FALSE); ToolBase::OnCancelDraw(); } }; @@ -232,8 +279,7 @@ struct GenericDrawTool : ToolBase void OnCancelDraw() { OnButtonUp(FALSE, 0, 0); - imageModel.Undo(); - selectionModel.ResetPtStack(); + imageModel.Undo(TRUE); ToolBase::OnCancelDraw(); } }; @@ -275,20 +321,29 @@ struct ColorTool : ToolBase { }
- void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + void fetchColor(BOOL bLeftButton, LONG x, LONG y) { - COLORREF tempColor; + COLORREF rgbColor;
if (0 <= x && x < imageModel.GetWidth() && 0 <= y && y < imageModel.GetHeight()) - tempColor = GetPixel(m_hdc, x, y); + rgbColor = GetPixel(m_hdc, x, y); else - tempColor = RGB(255, 255, 255); // Outside is white + rgbColor = RGB(255, 255, 255); // Outside is white
if (bLeftButton) - paletteModel.SetFgColor(tempColor); + paletteModel.SetFgColor(rgbColor); else - paletteModel.SetBgColor(tempColor); + paletteModel.SetBgColor(rgbColor); + }
+ void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + fetchColor(bLeftButton, x, y); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + fetchColor(bLeftButton, x, y); toolsModel.SetActiveTool(toolsModel.GetOldActiveTool()); } }; @@ -368,12 +423,11 @@ struct TextTool : ToolBase
void UpdatePoint(LONG x, LONG y) { - POINT temp; imageModel.ResetToPrevious(); - temp.x = max(0, min(x, imageModel.GetWidth())); - temp.y = max(0, min(y, imageModel.GetHeight())); - selectionModel.SetSrcAndDestRectFromPoints(start, temp); - RectSel(m_hdc, start.x, start.y, temp.x, temp.y); + POINT pt = { x, y }; + imageModel.Bound(pt); + selectionModel.SetSrcAndDestRectFromPoints(start, pt); + RectSel(m_hdc, start.x, start.y, pt.x, pt.y); }
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) @@ -392,7 +446,7 @@ struct TextTool : ToolBase
void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) { - imageModel.ResetToPrevious(); + imageModel.Undo(TRUE);
BOOL bTextBoxShown = ::IsWindowVisible(textEditWindow); if (bTextBoxShown && textEditWindow.GetWindowTextLength() > 0) @@ -405,6 +459,7 @@ struct TextTool : ToolBase textEditWindow.GetEditRect(&rc);
INT style = (toolsModel.IsBackgroundTransparent() ? 0 : 1); + imageModel.CopyPrevious(); Text(m_hdc, rc.left, rc.top, rc.right, rc.bottom, m_fg, m_bg, szText, textEditWindow.GetFont(), style); } @@ -451,13 +506,12 @@ struct TextTool : ToolBase } }
- void OnCancelDraw() + void OnFinishDraw() { - imageModel.ResetToPrevious(); - selectionModel.ResetPtStack(); - textEditWindow.SetWindowText(NULL); - textEditWindow.ShowWindow(SW_HIDE); - ToolBase::OnCancelDraw(); + toolsModel.OnButtonDown(TRUE, -1, -1, TRUE); + toolsModel.OnButtonUp(TRUE, -1, -1); + selectionWindow.IsMoved(FALSE); + ToolBase::OnFinishDraw(); } };
@@ -481,7 +535,9 @@ struct LineTool : GenericDrawTool // TOOL_BEZIER struct BezierTool : ToolBase { - BezierTool() : ToolBase(TOOL_BEZIER) + BOOL m_bLeftButton; + + BezierTool() : ToolBase(TOOL_BEZIER), m_bLeftButton(FALSE) { }
@@ -501,6 +557,7 @@ struct BezierTool : ToolBase Bezier(m_hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], rgb, toolsModel.GetLineWidth()); break; } + m_bLeftButton = bLeftButton; }
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) @@ -535,10 +592,20 @@ struct BezierTool : ToolBase void OnCancelDraw() { OnButtonUp(FALSE, 0, 0); - imageModel.Undo(); - selectionModel.ResetPtStack(); + imageModel.Undo(TRUE); ToolBase::OnCancelDraw(); } + + void OnFinishDraw() + { + if (pointSP) + { + imageModel.ResetToPrevious(); + --pointSP; + draw(m_bLeftButton); + } + ToolBase::OnFinishDraw(); + } };
// TOOL_RECT @@ -563,7 +630,9 @@ struct RectTool : GenericDrawTool // TOOL_SHAPE struct ShapeTool : ToolBase { - ShapeTool() : ToolBase(TOOL_SHAPE) + BOOL m_bLeftButton; + + ShapeTool() : ToolBase(TOOL_SHAPE), m_bLeftButton(FALSE) { }
@@ -576,6 +645,7 @@ struct ShapeTool : ToolBase else Poly(m_hdc, pointStack, pointSP + 1, m_bg, m_fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), bClosed, FALSE); } + m_bLeftButton = bLeftButton; }
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) @@ -631,10 +701,25 @@ struct ShapeTool : ToolBase
void OnCancelDraw() { - imageModel.ResetToPrevious(); - selectionModel.ResetPtStack(); + imageModel.Undo(TRUE); ToolBase::OnCancelDraw(); } + + void OnFinishDraw() + { + if (pointSP) + { + imageModel.ResetToPrevious(); + --pointSP; + draw(m_bLeftButton, -1, -1, TRUE); + pointSP = 0; + } + else + { + imageModel.Undo(TRUE); + } + ToolBase::OnFinishDraw(); + } };
// TOOL_ELLIPSE diff --git a/base/applications/mspaint/palette.cpp b/base/applications/mspaint/palette.cpp index 9667397a5bf..24fe9c96bf5 100644 --- a/base/applications/mspaint/palette.cpp +++ b/base/applications/mspaint/palette.cpp @@ -19,9 +19,9 @@ LRESULT CPaletteWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& b HBRUSH oldBrush; int i, a, b;
- DefWindowProc(WM_PAINT, wParam, lParam); + PAINTSTRUCT ps; + HDC hDC = BeginPaint(&ps);
- HDC hDC = GetDC(); for(b = 2; b < 30; b++) for(a = 2; a < 29; a++) if ((a + b) % 2 == 1) @@ -54,7 +54,7 @@ LRESULT CPaletteWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& b DeleteObject(SelectObject(hDC, oldBrush)); DeleteObject(SelectObject(hDC, oldPen)); } - ReleaseDC(hDC); + EndPaint(&ps); return 0; }
diff --git a/base/applications/mspaint/selection.cpp b/base/applications/mspaint/selection.cpp index 74083505bc2..d3e7fe6065a 100644 --- a/base/applications/mspaint/selection.cpp +++ b/base/applications/mspaint/selection.cpp @@ -54,14 +54,13 @@ ColorKeyedMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, return TRUE; }
-void -ForceRefreshSelectionContents() +void CSelectionWindow::ForceRefreshSelectionContents() { if (::IsWindowVisible(selectionWindow)) { - selectionWindow.SendMessage(WM_LBUTTONDOWN, 0, MAKELPARAM(0, 0)); - selectionWindow.SendMessage(WM_MOUSEMOVE, 0, MAKELPARAM(0, 0)); - selectionWindow.SendMessage(WM_LBUTTONUP, 0, MAKELPARAM(0, 0)); + imageModel.ResetToPrevious(); + imageModel.DrawSelectionBackground(m_rgbBack); + selectionModel.DrawSelection(imageModel.GetDC(), paletteModel.GetBgColor(), toolsModel.IsBackgroundTransparent()); } }
@@ -90,16 +89,16 @@ int CSelectionWindow::IdentifyCorner(int iXPos, int iYPos, int iWidth, int iHeig
LRESULT CSelectionWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - DefWindowProc(WM_PAINT, wParam, lParam); + PAINTSTRUCT ps; + HDC hDC = BeginPaint(&ps); if (!m_bMoving) { - HDC hDC = GetDC(); SelectionFrame(hDC, 1, 1, Zoomed(selectionModel.GetDestRectWidth()) + (GRIP_SIZE * 2) - 1, Zoomed(selectionModel.GetDestRectHeight()) + (GRIP_SIZE * 2) - 1, GetSysColor(COLOR_HIGHLIGHT)); - ReleaseDC(hDC); } + EndPaint(&ps); return 0; }
@@ -145,6 +144,7 @@ LRESULT CSelectionWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, scrlClientWindow.SendMessage(WM_PAINT, 0, 0); imageArea.InvalidateRect(NULL, FALSE); imageArea.SendMessage(WM_PAINT, 0, 0); + m_rgbBack = paletteModel.GetBgColor(); return 0; }
@@ -153,6 +153,7 @@ LRESULT CSelectionWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, B if (m_bMoving) { imageModel.ResetToPrevious(); + imageModel.DrawSelectionBackground(m_rgbBack); m_ptFrac.x += GET_X_LPARAM(lParam) - m_ptPos.x; m_ptFrac.y += GET_Y_LPARAM(lParam) - m_ptPos.y; m_ptDelta.x += UnZoomed(m_ptFrac.x); @@ -173,17 +174,10 @@ LRESULT CSelectionWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, B strSize.Format(_T("%ld x %ld"), selectionModel.GetDestRectWidth(), selectionModel.GetDestRectHeight()); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) (LPCTSTR) strSize);
- if (toolsModel.GetActiveTool() == TOOL_TEXT) - { - selectionModel.DrawTextToolText(imageModel.GetDC(), paletteModel.GetFgColor(), paletteModel.GetBgColor(), toolsModel.IsBackgroundTransparent()); - } + if (m_iAction != ACTION_MOVE) + selectionModel.DrawSelectionStretched(imageModel.GetDC()); else - { - if (m_iAction != ACTION_MOVE) - selectionModel.DrawSelectionStretched(imageModel.GetDC()); - else - selectionModel.DrawSelection(imageModel.GetDC(), paletteModel.GetBgColor(), toolsModel.IsBackgroundTransparent()); - } + selectionModel.DrawSelection(imageModel.GetDC(), paletteModel.GetBgColor(), toolsModel.IsBackgroundTransparent()); imageArea.InvalidateRect(NULL, FALSE); imageArea.SendMessage(WM_PAINT, 0, 0); m_ptPos.x = GET_X_LPARAM(lParam); @@ -203,26 +197,26 @@ LRESULT CSelectionWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, B return 0; }
+LRESULT CSelectionWindow::OnMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + m_bMoved = TRUE; + return 0; +} + LRESULT CSelectionWindow::OnLButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (m_bMoving) { m_bMoving = FALSE; ReleaseCapture(); - if (m_iAction != ACTION_MOVE) + if (m_iAction != ACTION_MOVE && toolsModel.GetActiveTool() != TOOL_TEXT) { - if (toolsModel.GetActiveTool() == TOOL_TEXT) - { - // FIXME: What to do? - } - else - { - selectionModel.ScaleContentsToFit(); - } + imageModel.Undo(); + imageModel.DrawSelectionBackground(m_rgbBack); + selectionModel.ScaleContentsToFit(); + imageModel.CopyPrevious(); } placeSelWin(); - ShowWindow(SW_HIDE); - ShowWindow(SW_SHOW); } return 0; } @@ -234,10 +228,10 @@ LRESULT CSelectionWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lPar m_bMoving = FALSE; if (m_iAction == ACTION_MOVE) { - // FIXME: dirty hack - placeSelWin(); - imageModel.Undo(); - imageModel.Undo(); + if (toolsModel.GetActiveTool() == TOOL_RECTSEL) + imageArea.cancelDrawing(); + else + placeSelWin(); } else { @@ -262,23 +256,16 @@ LRESULT CSelectionWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO
LRESULT CSelectionWindow::OnPaletteModelColorChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - if (toolsModel.GetActiveTool() == TOOL_TEXT) - ForceRefreshSelectionContents(); return 0; }
LRESULT CSelectionWindow::OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - if (toolsModel.GetActiveTool() == TOOL_FREESEL || - toolsModel.GetActiveTool() == TOOL_RECTSEL || - toolsModel.GetActiveTool() == TOOL_TEXT) - ForceRefreshSelectionContents(); return 0; }
LRESULT CSelectionWindow::OnSelectionModelRefreshNeeded(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - ForceRefreshSelectionContents(); return 0; }
diff --git a/base/applications/mspaint/selection.h b/base/applications/mspaint/selection.h index 82ba84a6016..8e61b77d9ef 100644 --- a/base/applications/mspaint/selection.h +++ b/base/applications/mspaint/selection.h @@ -12,6 +12,15 @@ class CSelectionWindow : public CWindowImpl<CSelectionWindow> { public: + CSelectionWindow() : m_bMoved(FALSE) + { + } + + BOOL IsMoved() const { return m_bMoved; } + void IsMoved(BOOL bMoved) { m_bMoved = bMoved; } + + void ForceRefreshSelectionContents(); + DECLARE_WND_CLASS_EX(_T("Selection"), CS_DBLCLKS, COLOR_BTNFACE)
BEGIN_MSG_MAP(CSelectionWindow) @@ -24,6 +33,7 @@ public: MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel) MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_MOVE, OnMove) MESSAGE_HANDLER(WM_PALETTEMODELCOLORCHANGED, OnPaletteModelColorChanged) MESSAGE_HANDLER(WM_TOOLSMODELSETTINGSCHANGED, OnToolsModelSettingsChanged) MESSAGE_HANDLER(WM_TOOLSMODELZOOMCHANGED, OnToolsModelZoomChanged) @@ -47,14 +57,17 @@ public: LRESULT OnSelectionModelRefreshNeeded(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); + LRESULT OnMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
private: static const LPCTSTR m_lpszCursorLUT[9]; + BOOL m_bMoved; BOOL m_bMoving; int m_iAction; POINT m_ptPos; POINT m_ptFrac; POINT m_ptDelta; + COLORREF m_rgbBack;
int IdentifyCorner(int iXPos, int iYPos, int iWidth, int iHeight); }; diff --git a/base/applications/mspaint/selectionmodel.cpp b/base/applications/mspaint/selectionmodel.cpp index 50c6ad4a53f..86d34dbd86d 100644 --- a/base/applications/mspaint/selectionmodel.cpp +++ b/base/applications/mspaint/selectionmodel.cpp @@ -337,11 +337,6 @@ LONG SelectionModel::GetDestRectTop() const return m_rcDest.top; }
-void SelectionModel::DrawTextToolText(HDC hDCImage, COLORREF crFg, COLORREF crBg, BOOL bBgTransparent) -{ - Text(hDCImage, m_rcDest.left, m_rcDest.top, m_rcDest.right, m_rcDest.bottom, crFg, crBg, textToolText, hfontTextFont, bBgTransparent); -} - void SelectionModel::NotifyRefreshNeeded() { selectionWindow.SendMessage(WM_SELECTIONMODELREFRESHNEEDED); diff --git a/base/applications/mspaint/selectionmodel.h b/base/applications/mspaint/selectionmodel.h index 523f22145fb..0243bc08f96 100644 --- a/base/applications/mspaint/selectionmodel.h +++ b/base/applications/mspaint/selectionmodel.h @@ -66,7 +66,6 @@ public: LONG GetDestRectLeft() const; LONG GetDestRectTop() const; void GetRect(LPRECT prc) const; - void DrawTextToolText(HDC hDCImage, COLORREF crFg, COLORREF crBg, BOOL bBgTransparent = FALSE);
private: SelectionModel(const SelectionModel&); diff --git a/base/applications/mspaint/toolsettings.cpp b/base/applications/mspaint/toolsettings.cpp index 0c3d3e0bdf9..19f826ea825 100644 --- a/base/applications/mspaint/toolsettings.cpp +++ b/base/applications/mspaint/toolsettings.cpp @@ -33,12 +33,11 @@ LRESULT CToolSettingsWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam,
LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { + PAINTSTRUCT ps; RECT rect1 = { 0, 0, 42, 66 }; RECT rect2 = { 0, 70, 42, 136 };
- DefWindowProc(WM_PAINT, wParam, lParam); - - HDC hdc = GetDC(); + HDC hdc = BeginPaint(&ps); DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (toolsModel.GetActiveTool() == TOOL_ZOOM) ? BF_RECT : BF_RECT | BF_MIDDLE); DrawEdge(hdc, &rect2, (toolsModel.GetActiveTool() >= TOOL_RECT) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE); switch (toolsModel.GetActiveTool()) @@ -181,7 +180,7 @@ LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BO case TOOL_PEN: break; } - ReleaseDC(hdc); + EndPaint(&ps); return 0; }
diff --git a/base/applications/mspaint/toolsmodel.cpp b/base/applications/mspaint/toolsmodel.cpp index 8811cf087ff..e42b04c6230 100644 --- a/base/applications/mspaint/toolsmodel.cpp +++ b/base/applications/mspaint/toolsmodel.cpp @@ -85,6 +85,11 @@ TOOLTYPE ToolsModel::GetOldActiveTool() const
void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool) { + OnFinishDraw(); + + if (m_activeTool == nActiveTool) + return; + switch (m_activeTool) { case TOOL_FREESEL: @@ -92,15 +97,7 @@ void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool) case TOOL_RUBBER: case TOOL_COLOR: case TOOL_ZOOM: - break; - case TOOL_TEXT: - if (nActiveTool != TOOL_TEXT) - { - // Finish the text - OnButtonDown(TRUE, -1, -1, TRUE); - OnButtonUp(TRUE, -1, -1); - } break;
default: @@ -171,15 +168,18 @@ void ToolsModel::NotifyToolChanged()
void ToolsModel::NotifyToolSettingsChanged() { - toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); - selectionWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); + if (toolSettingsWindow.IsWindow()) + toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); + if (selectionWindow.IsWindow()) + selectionWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); if (textEditWindow.IsWindow()) textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); }
void ToolsModel::NotifyZoomChanged() { - toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); + if (toolSettingsWindow.IsWindow()) + toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); if (textEditWindow.IsWindow()) textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); if (selectionWindow.IsWindow()) @@ -212,11 +212,20 @@ void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y)
void ToolsModel::OnCancelDraw() { + ATLTRACE("ToolsModel::OnCancelDraw()\n"); m_pToolObject->beginEvent(); m_pToolObject->OnCancelDraw(); m_pToolObject->endEvent(); }
+void ToolsModel::OnFinishDraw() +{ + ATLTRACE("ToolsModel::OnFinishDraw()\n"); + m_pToolObject->beginEvent(); + m_pToolObject->OnFinishDraw(); + m_pToolObject->endEvent(); +} + void ToolsModel::resetTool() { m_pToolObject->reset(); diff --git a/base/applications/mspaint/toolsmodel.h b/base/applications/mspaint/toolsmodel.h index f6d4496d985..9d3a053e576 100644 --- a/base/applications/mspaint/toolsmodel.h +++ b/base/applications/mspaint/toolsmodel.h @@ -60,6 +60,7 @@ struct ToolBase }
virtual void OnCancelDraw(); + virtual void OnFinishDraw();
void beginEvent(); void endEvent(); @@ -110,6 +111,7 @@ public: void OnMouseMove(BOOL bLeftButton, LONG x, LONG y); void OnButtonUp(BOOL bLeftButton, LONG x, LONG y); void OnCancelDraw(); + void OnFinishDraw();
void resetTool(); void selectAll(); diff --git a/base/applications/mspaint/winproc.cpp b/base/applications/mspaint/winproc.cpp index 9105d85115e..b76a310070b 100644 --- a/base/applications/mspaint/winproc.cpp +++ b/base/applications/mspaint/winproc.cpp @@ -89,6 +89,8 @@ void CMainWindow::alignChildrenToMainWindow()
void CMainWindow::saveImage(BOOL overwrite) { + imageArea.finishDrawing(); + if (isAFile && overwrite) { imageModel.SaveImage(filepathname); @@ -156,7 +158,7 @@ void CMainWindow::InsertSelectionFromHBITMAP(HBITMAP bitmap, HWND window)
placeSelWin(); selectionWindow.ShowWindow(SW_SHOW); - ForceRefreshSelectionContents(); + selectionWindow.ForceRefreshSelectionContents(); }
LRESULT CMainWindow::OnMouseWheel(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) @@ -238,6 +240,8 @@ LRESULT CMainWindow::OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
BOOL CMainWindow::ConfirmSave() { + imageArea.finishDrawing(); + if (imageModel.IsImageSaved()) return TRUE;
@@ -407,14 +411,7 @@ LRESULT CMainWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH } else { - switch (toolsModel.GetActiveTool()) - { - case TOOL_SHAPE: case TOOL_BEZIER: - imageArea.SendMessage(nMsg, wParam, lParam); - break; - default: - break; - } + imageArea.SendMessage(nMsg, wParam, lParam); } } return 0; @@ -430,6 +427,13 @@ LRESULT CMainWindow::OnSysColorChange(UINT nMsg, WPARAM wParam, LPARAM lParam, B
LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { + // Disable commands while dragging mouse + if (imageArea.drawing && ::GetCapture()) + { + ATLTRACE("locking!\n"); + return 0; + } + switch (LOWORD(wParam)) { case IDM_HELPINFO: @@ -531,12 +535,31 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH case IDM_EDITUNDO: if (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)) break; + if (selectionWindow.IsWindowVisible()) + { + if (toolsModel.GetActiveTool() == TOOL_RECTSEL || + toolsModel.GetActiveTool() == TOOL_FREESEL) + { + imageArea.cancelDrawing(); + break; + } + } + if (ToolBase::pointSP != 0) // drawing something? + { + imageArea.cancelDrawing(); + break; + } imageModel.Undo(); imageArea.Invalidate(FALSE); break; case IDM_EDITREDO: if (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)) break; + if (ToolBase::pointSP != 0) // drawing something? + { + imageArea.finishDrawing(); + break; + } imageModel.Redo(); imageArea.Invalidate(FALSE); break; @@ -562,8 +585,19 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH break; case IDM_EDITDELETESELECTION: { - /* remove selection window and already painted content using undo */ - imageModel.Undo(); + switch (toolsModel.GetActiveTool()) + { + case TOOL_FREESEL: + case TOOL_RECTSEL: + imageModel.DeleteSelection(); + break; + + case TOOL_TEXT: + imageArea.cancelDrawing(); + break; + default: + break; + } break; } case IDM_EDITSELECTALL: