Index: reactos/base/applications/mspaint/imgarea.cpp =================================================================== --- reactos/base/applications/mspaint/imgarea.cpp (revision 74958) +++ reactos/base/applications/mspaint/imgarea.cpp (working copy) @@ -191,8 +191,6 @@ { if (drawing) { - ReleaseCapture(); - drawing = FALSE; endPaintingL(imageModel.GetDC(), GET_X_LPARAM(lParam) * 1000 / toolsModel.GetZoom(), GET_Y_LPARAM(lParam) * 1000 / toolsModel.GetZoom(), paletteModel.GetFgColor(), paletteModel.GetBgColor()); Invalidate(FALSE); @@ -205,15 +203,78 @@ } SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) ""); } + drawing = FALSE; + ReleaseCapture(); return 0; } +void CImgAreaWindow::cancelDrawing() +{ + POINT pt; + switch (toolsModel.GetActiveTool()) + { + case TOOL_FREESEL: case TOOL_RECTSEL: + case TOOL_TEXT: case TOOL_ZOOM: case TOOL_SHAPE: + imageModel.ResetToPrevious(); + selectionModel.ResetPtStack(); + pointSP = 0; + Invalidate(FALSE); + break; + default: + GetCursorPos(&pt); + ScreenToClient(&pt); + // FIXME: dirty hack + if (GetKeyState(VK_LBUTTON) < 0) + { + endPaintingL(imageModel.GetDC(), pt.x * 1000 / toolsModel.GetZoom(), pt.y * 1000 / toolsModel.GetZoom(), paletteModel.GetFgColor(), + paletteModel.GetBgColor()); + } + else if (GetKeyState(VK_RBUTTON) < 0) + { + endPaintingR(imageModel.GetDC(), pt.x * 1000 / toolsModel.GetZoom(), pt.y * 1000 / toolsModel.GetZoom(), paletteModel.GetFgColor(), + paletteModel.GetBgColor()); + } + imageModel.Undo(); + pointSP = 0; + selectionModel.ResetPtStack(); + } +} + +LRESULT CImgAreaWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (drawing) + { + cancelDrawing(); + drawing = FALSE; + } + return 0; +} + +LRESULT CImgAreaWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (wParam == VK_ESCAPE) + { + if (GetCapture() == m_hWnd) + { + ReleaseCapture(); + } + else + { + switch (toolsModel.GetActiveTool()) + { + case TOOL_SHAPE: case TOOL_BEZIER: + cancelDrawing(); + break; + } + } + } + return 0; +} + LRESULT CImgAreaWindow::OnRButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (drawing) { - ReleaseCapture(); - drawing = FALSE; endPaintingR(imageModel.GetDC(), GET_X_LPARAM(lParam) * 1000 / toolsModel.GetZoom(), GET_Y_LPARAM(lParam) * 1000 / toolsModel.GetZoom(), paletteModel.GetFgColor(), paletteModel.GetBgColor()); Invalidate(FALSE); @@ -226,6 +287,8 @@ } SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) ""); } + ReleaseCapture(); + drawing = FALSE; return 0; } Index: reactos/base/applications/mspaint/imgarea.h =================================================================== --- reactos/base/applications/mspaint/imgarea.h (revision 74958) +++ reactos/base/applications/mspaint/imgarea.h (working copy) @@ -24,6 +24,8 @@ MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) MESSAGE_HANDLER(WM_IMAGEMODELDIMENSIONSCHANGED, OnImageModelDimensionsChanged) MESSAGE_HANDLER(WM_IMAGEMODELIMAGECHANGED, OnImageModelImageChanged) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) END_MSG_MAP() BOOL drawing; @@ -40,6 +42,9 @@ LRESULT OnMouseLeave(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnImageModelDimensionsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnImageModelImageChanged(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); void drawZoomFrame(int mouseX, int mouseY); + void cancelDrawing(); }; Index: reactos/base/applications/mspaint/selection.cpp =================================================================== --- reactos/base/applications/mspaint/selection.cpp (revision 74958) +++ reactos/base/applications/mspaint/selection.cpp (working copy) @@ -20,6 +20,8 @@ IDC_SIZENESW, IDC_SIZENS, IDC_SIZENWSE }; +static POINT s_pt; + BOOL ColorKeyedMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, HBITMAP hbmMask, int xMask, int yMask, DWORD dwRop, COLORREF keyColor) { @@ -138,8 +140,8 @@ LRESULT CSelectionWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - m_ptPos.x = GET_X_LPARAM(lParam); - m_ptPos.y = GET_Y_LPARAM(lParam); + s_pt.x = m_ptPos.x = GET_X_LPARAM(lParam); + s_pt.y = m_ptPos.y = GET_Y_LPARAM(lParam); m_ptDelta.x = 0; m_ptDelta.y = 0; SetCapture(); @@ -230,6 +232,39 @@ return 0; } +LRESULT CSelectionWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (m_bMoving) + { + m_bMoving = FALSE; + if (m_iAction == ACTION_MOVE) + { + // FIXME: dirty hack + placeSelWin(); + imageModel.Undo(); + imageModel.Undo(); + } + else + { + m_iAction = ACTION_MOVE; + } + ShowWindow(SW_HIDE); + } + return 0; +} + +LRESULT CSelectionWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (wParam == VK_ESCAPE) + { + if (GetCapture() == m_hWnd) + { + ReleaseCapture(); + } + } + return 0; +} + LRESULT CSelectionWindow::OnPaletteModelColorChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (toolsModel.GetActiveTool() == TOOL_TEXT) Index: reactos/base/applications/mspaint/selection.h =================================================================== --- reactos/base/applications/mspaint/selection.h (revision 74958) +++ reactos/base/applications/mspaint/selection.h (working copy) @@ -23,6 +23,8 @@ MESSAGE_HANDLER(WM_PALETTEMODELCOLORCHANGED, OnPaletteModelColorChanged) MESSAGE_HANDLER(WM_TOOLSMODELSETTINGSCHANGED, OnToolsModelSettingsChanged) MESSAGE_HANDLER(WM_SELECTIONMODELREFRESHNEEDED, OnSelectionModelRefreshNeeded) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) END_MSG_MAP() LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); @@ -36,6 +38,8 @@ LRESULT OnPaletteModelColorChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 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); private: static const LPCTSTR m_lpszCursorLUT[9]; Index: reactos/base/applications/mspaint/sizebox.cpp =================================================================== --- reactos/base/applications/mspaint/sizebox.cpp (revision 74958) +++ reactos/base/applications/mspaint/sizebox.cpp (working copy) @@ -98,13 +98,25 @@ imageModel.Crop(imgXRes + xRel, imgYRes + yRel, 0, 0); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) _T("")); } + resizing = FALSE; ReleaseCapture(); - resizing = FALSE; return 0; } -LRESULT CSizeboxWindow::OnCancelMode(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +LRESULT CSizeboxWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { resizing = FALSE; return 0; } + +LRESULT CSizeboxWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (wParam == VK_ESCAPE) + { + if (GetCapture() == m_hWnd) + { + ReleaseCapture(); + } + } + return 0; +} Index: reactos/base/applications/mspaint/sizebox.h =================================================================== --- reactos/base/applications/mspaint/sizebox.h (revision 74958) +++ reactos/base/applications/mspaint/sizebox.h (working copy) @@ -16,7 +16,8 @@ MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_CANCELMODE, OnCancelMode) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) END_MSG_MAP() LRESULT OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); @@ -23,5 +24,6 @@ LRESULT OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnLButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnCancelMode(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); }; Index: reactos/base/applications/mspaint/winproc.cpp =================================================================== --- reactos/base/applications/mspaint/winproc.cpp (revision 74958) +++ reactos/base/applications/mspaint/winproc.cpp (working copy) @@ -333,18 +333,33 @@ { if (wParam == VK_ESCAPE) { - if (!imageArea.drawing) + HWND hwndCapture = GetCapture(); + if (hwndCapture) { - /* Deselect */ - if ((toolsModel.GetActiveTool() == TOOL_RECTSEL) || (toolsModel.GetActiveTool() == TOOL_FREESEL)) + if (selectionWindow.m_hWnd == hwndCapture || + imageArea.m_hWnd == hwndCapture || + fullscreenWindow.m_hWnd == hwndCapture || + sizeboxLeftTop.m_hWnd == hwndCapture || + sizeboxCenterTop.m_hWnd == hwndCapture || + sizeboxRightTop.m_hWnd == hwndCapture || + sizeboxLeftCenter.m_hWnd == hwndCapture || + sizeboxRightCenter.m_hWnd == hwndCapture || + sizeboxLeftBottom.m_hWnd == hwndCapture || + sizeboxCenterBottom.m_hWnd == hwndCapture || + sizeboxRightBottom.m_hWnd == hwndCapture) { - startPaintingL(imageModel.GetDC(), 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor()); - whilePaintingL(imageModel.GetDC(), 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor()); - endPaintingL(imageModel.GetDC(), 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor()); - selectionWindow.ShowWindow(SW_HIDE); + SendMessage(hwndCapture, nMsg, wParam, lParam); } } - /* FIXME: also cancel current drawing underway */ + else + { + switch (toolsModel.GetActiveTool()) + { + case TOOL_SHAPE: case TOOL_BEZIER: + imageArea.SendMessage(nMsg, wParam, lParam); + break; + } + } } return 0; }