2015-05-08 16:02:36 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: PAINT for ReactOS
|
|
|
|
* LICENSE: LGPL
|
2023-03-16 22:45:14 +00:00
|
|
|
* FILE: base/applications/mspaint/canvas.cpp
|
|
|
|
* PURPOSE: Providing the canvas window class
|
2015-05-08 16:02:36 +00:00
|
|
|
* PROGRAMMERS: Benedikt Freisen
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *********************************************************/
|
|
|
|
|
|
|
|
#include "precomp.h"
|
2018-11-16 22:05:51 +00:00
|
|
|
#include <atltypes.h>
|
|
|
|
|
2015-05-08 16:02:36 +00:00
|
|
|
/* FUNCTIONS ********************************************************/
|
|
|
|
|
2023-03-16 22:51:12 +00:00
|
|
|
VOID CCanvasWindow::Update(HWND hwndFrom)
|
2015-05-08 16:02:36 +00:00
|
|
|
{
|
2018-11-16 22:05:51 +00:00
|
|
|
CRect tempRect;
|
2023-03-16 22:51:12 +00:00
|
|
|
GetClientRect(&tempRect);
|
2023-03-16 22:28:42 +00:00
|
|
|
CSize sizeScrollBox(tempRect.Width(), tempRect.Height());
|
2018-11-16 22:05:51 +00:00
|
|
|
|
2023-03-16 22:28:42 +00:00
|
|
|
CSize sizeZoomed = { Zoomed(imageModel.GetWidth()), Zoomed(imageModel.GetHeight()) };
|
|
|
|
CSize sizeWhole = { sizeZoomed.cx + (GRIP_SIZE * 2), sizeZoomed.cy + (GRIP_SIZE * 2) };
|
2018-11-16 22:05:51 +00:00
|
|
|
|
|
|
|
/* show/hide the scrollbars */
|
2023-03-16 22:51:12 +00:00
|
|
|
ShowScrollBar(SB_HORZ, sizeScrollBox.cx < sizeWhole.cx);
|
|
|
|
ShowScrollBar(SB_VERT, sizeScrollBox.cy < sizeWhole.cy);
|
2018-11-16 22:05:51 +00:00
|
|
|
|
2023-03-16 22:28:42 +00:00
|
|
|
if (sizeScrollBox.cx < sizeWhole.cx || sizeScrollBox.cy < sizeWhole.cy)
|
|
|
|
{
|
2023-03-16 22:51:12 +00:00
|
|
|
GetClientRect(&tempRect);
|
2023-03-16 22:28:42 +00:00
|
|
|
sizeScrollBox = CSize(tempRect.Width(), tempRect.Height());
|
|
|
|
}
|
|
|
|
|
|
|
|
SCROLLINFO si = { sizeof(si), SIF_PAGE | SIF_RANGE };
|
2015-05-08 16:02:36 +00:00
|
|
|
si.nMin = 0;
|
2018-11-16 22:05:51 +00:00
|
|
|
|
2023-03-16 22:28:42 +00:00
|
|
|
si.nMax = sizeWhole.cx;
|
2018-11-16 22:05:51 +00:00
|
|
|
si.nPage = sizeScrollBox.cx;
|
2023-03-16 22:51:12 +00:00
|
|
|
SetScrollInfo(SB_HORZ, &si);
|
2018-11-16 22:05:51 +00:00
|
|
|
|
2023-03-16 22:28:42 +00:00
|
|
|
si.nMax = sizeWhole.cy;
|
2018-11-16 22:05:51 +00:00
|
|
|
si.nPage = sizeScrollBox.cy;
|
2023-03-16 22:51:12 +00:00
|
|
|
SetScrollInfo(SB_VERT, &si);
|
2018-11-16 22:05:51 +00:00
|
|
|
|
2023-03-16 22:51:12 +00:00
|
|
|
INT dx = -GetScrollPos(SB_HORZ);
|
|
|
|
INT dy = -GetScrollPos(SB_VERT);
|
2023-03-16 22:28:42 +00:00
|
|
|
|
|
|
|
if (sizeboxLeftTop.IsWindow())
|
2022-01-22 15:59:12 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
sizeboxLeftTop.MoveWindow(dx, dy, GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxCenterTop.MoveWindow(dx + GRIP_SIZE + (sizeZoomed.cx - GRIP_SIZE) / 2,
|
|
|
|
dy,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxRightTop.MoveWindow(dx + GRIP_SIZE + sizeZoomed.cx,
|
|
|
|
dy,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxLeftCenter.MoveWindow(dx,
|
|
|
|
dy + GRIP_SIZE + (sizeZoomed.cy - GRIP_SIZE) / 2,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxRightCenter.MoveWindow(dx + GRIP_SIZE + sizeZoomed.cx,
|
|
|
|
dy + GRIP_SIZE + (sizeZoomed.cy - GRIP_SIZE) / 2,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxLeftBottom.MoveWindow(dx,
|
|
|
|
dy + GRIP_SIZE + sizeZoomed.cy,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxCenterBottom.MoveWindow(dx + GRIP_SIZE + (sizeZoomed.cx - GRIP_SIZE) / 2,
|
|
|
|
dy + GRIP_SIZE + sizeZoomed.cy,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
|
|
|
sizeboxRightBottom.MoveWindow(dx + GRIP_SIZE + sizeZoomed.cx,
|
|
|
|
dy + GRIP_SIZE + sizeZoomed.cy,
|
|
|
|
GRIP_SIZE, GRIP_SIZE, TRUE);
|
2022-01-22 15:59:12 +00:00
|
|
|
}
|
2023-03-16 22:28:42 +00:00
|
|
|
|
|
|
|
if (imageArea.IsWindow() && hwndFrom != imageArea.m_hWnd)
|
|
|
|
imageArea.MoveWindow(dx + GRIP_SIZE, dy + GRIP_SIZE, sizeZoomed.cx, sizeZoomed.cy, TRUE);
|
2015-05-08 16:02:36 +00:00
|
|
|
}
|
|
|
|
|
2023-03-16 22:45:14 +00:00
|
|
|
LRESULT CCanvasWindow::OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
2015-05-08 16:02:36 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
if (m_hWnd)
|
2015-05-08 16:02:36 +00:00
|
|
|
{
|
2023-03-16 22:51:12 +00:00
|
|
|
Update(m_hWnd);
|
2015-07-07 10:42:49 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2015-05-08 16:02:36 +00:00
|
|
|
|
2023-03-16 22:45:14 +00:00
|
|
|
LRESULT CCanvasWindow::OnHScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
2015-07-07 10:42:49 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
SCROLLINFO si;
|
|
|
|
si.cbSize = sizeof(SCROLLINFO);
|
|
|
|
si.fMask = SIF_ALL;
|
|
|
|
GetScrollInfo(SB_HORZ, &si);
|
|
|
|
switch (LOWORD(wParam))
|
2015-07-07 10:42:49 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
case SB_THUMBTRACK:
|
|
|
|
case SB_THUMBPOSITION:
|
|
|
|
si.nPos = HIWORD(wParam);
|
|
|
|
break;
|
|
|
|
case SB_LINELEFT:
|
|
|
|
si.nPos -= 5;
|
|
|
|
break;
|
|
|
|
case SB_LINERIGHT:
|
|
|
|
si.nPos += 5;
|
|
|
|
break;
|
|
|
|
case SB_PAGELEFT:
|
|
|
|
si.nPos -= si.nPage;
|
|
|
|
break;
|
|
|
|
case SB_PAGERIGHT:
|
|
|
|
si.nPos += si.nPage;
|
|
|
|
break;
|
2015-05-08 16:02:36 +00:00
|
|
|
}
|
2023-03-16 22:28:42 +00:00
|
|
|
SetScrollInfo(SB_HORZ, &si);
|
2023-03-16 22:51:12 +00:00
|
|
|
Update(m_hWnd);
|
2015-07-07 10:42:49 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2015-05-08 16:02:36 +00:00
|
|
|
|
2023-03-16 22:45:14 +00:00
|
|
|
LRESULT CCanvasWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
2015-07-07 10:42:49 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
SCROLLINFO si;
|
|
|
|
si.cbSize = sizeof(SCROLLINFO);
|
|
|
|
si.fMask = SIF_ALL;
|
|
|
|
GetScrollInfo(SB_VERT, &si);
|
|
|
|
switch (LOWORD(wParam))
|
2015-07-07 10:42:49 +00:00
|
|
|
{
|
2023-03-16 22:28:42 +00:00
|
|
|
case SB_THUMBTRACK:
|
|
|
|
case SB_THUMBPOSITION:
|
|
|
|
si.nPos = HIWORD(wParam);
|
|
|
|
break;
|
|
|
|
case SB_LINEUP:
|
|
|
|
si.nPos -= 5;
|
|
|
|
break;
|
|
|
|
case SB_LINEDOWN:
|
|
|
|
si.nPos += 5;
|
|
|
|
break;
|
|
|
|
case SB_PAGEUP:
|
|
|
|
si.nPos -= si.nPage;
|
|
|
|
break;
|
|
|
|
case SB_PAGEDOWN:
|
|
|
|
si.nPos += si.nPage;
|
|
|
|
break;
|
2015-07-07 10:42:49 +00:00
|
|
|
}
|
2023-03-16 22:28:42 +00:00
|
|
|
SetScrollInfo(SB_VERT, &si);
|
2023-03-16 22:51:12 +00:00
|
|
|
Update(m_hWnd);
|
2015-05-08 16:02:36 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2017-06-19 13:02:09 +00:00
|
|
|
|
2023-03-16 22:45:14 +00:00
|
|
|
LRESULT CCanvasWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
2017-06-19 13:02:09 +00:00
|
|
|
{
|
2022-01-01 13:02:36 +00:00
|
|
|
switch (toolsModel.GetActiveTool())
|
|
|
|
{
|
|
|
|
case TOOL_BEZIER:
|
|
|
|
case TOOL_SHAPE:
|
|
|
|
if (ToolBase::pointSP != 0)
|
|
|
|
{
|
|
|
|
toolsModel.OnCancelDraw();
|
|
|
|
imageArea.Invalidate();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
|
2017-06-19 13:02:09 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2021-12-27 13:20:22 +00:00
|
|
|
|
2023-03-16 22:45:14 +00:00
|
|
|
LRESULT CCanvasWindow::OnMouseWheel(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
2021-12-27 13:20:22 +00:00
|
|
|
{
|
|
|
|
return ::SendMessage(GetParent(), nMsg, wParam, lParam);
|
|
|
|
}
|