1 /*
2  * PROJECT:     PAINT for ReactOS
3  * LICENSE:     LGPL
4  * FILE:        base/applications/mspaint/sizebox.cpp
5  * PURPOSE:     Window procedure of the size boxes
6  * PROGRAMMERS: Benedikt Freisen
7  *              Katayama Hirofumi MZ
8  */
9 
10 /* INCLUDES *********************************************************/
11 
12 #include "precomp.h"
13 
14 /* FUNCTIONS ********************************************************/
15 
16 static BOOL resizing = FALSE;
17 static short xOrig;
18 static short yOrig;
19 
20 LRESULT CSizeboxWindow::OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
21 {
22     if ((m_hWnd == sizeboxLeftTop.m_hWnd) || (m_hWnd == sizeboxRightBottom.m_hWnd))
23         SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
24     if ((m_hWnd == sizeboxLeftBottom.m_hWnd) || (m_hWnd == sizeboxRightTop.m_hWnd))
25         SetCursor(LoadCursor(NULL, IDC_SIZENESW));
26     if ((m_hWnd == sizeboxLeftCenter.m_hWnd) || (m_hWnd == sizeboxRightCenter.m_hWnd))
27         SetCursor(LoadCursor(NULL, IDC_SIZEWE));
28     if ((m_hWnd == sizeboxCenterTop.m_hWnd) || (m_hWnd == sizeboxCenterBottom.m_hWnd))
29         SetCursor(LoadCursor(NULL, IDC_SIZENS));
30     return 0;
31 }
32 
33 LRESULT CSizeboxWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
34 {
35     resizing = TRUE;
36     xOrig = GET_X_LPARAM(lParam);
37     yOrig = GET_Y_LPARAM(lParam);
38     SetCapture();
39     return 0;
40 }
41 
42 LRESULT CSizeboxWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
43 {
44     if (resizing)
45     {
46         CString strSize;
47         short xRel;
48         short yRel;
49         int imgXRes = imageModel.GetWidth();
50         int imgYRes = imageModel.GetHeight();
51         xRel = UnZoomed(GET_X_LPARAM(lParam) - xOrig);
52         yRel = UnZoomed(GET_Y_LPARAM(lParam) - yOrig);
53         if (m_hWnd == sizeboxLeftTop.m_hWnd)
54             strSize.Format(_T("%d x %d"), imgXRes - xRel, imgYRes - yRel);
55         if (m_hWnd == sizeboxCenterTop.m_hWnd)
56             strSize.Format(_T("%d x %d"), imgXRes, imgYRes - yRel);
57         if (m_hWnd == sizeboxRightTop.m_hWnd)
58             strSize.Format(_T("%d x %d"), imgXRes + xRel, imgYRes - yRel);
59         if (m_hWnd == sizeboxLeftCenter.m_hWnd)
60             strSize.Format(_T("%d x %d"), imgXRes - xRel, imgYRes);
61         if (m_hWnd == sizeboxRightCenter.m_hWnd)
62             strSize.Format(_T("%d x %d"), imgXRes + xRel, imgYRes);
63         if (m_hWnd == sizeboxLeftBottom.m_hWnd)
64             strSize.Format(_T("%d x %d"), imgXRes - xRel, imgYRes + yRel);
65         if (m_hWnd == sizeboxCenterBottom.m_hWnd)
66             strSize.Format(_T("%d x %d"), imgXRes, imgYRes + yRel);
67         if (m_hWnd == sizeboxRightBottom.m_hWnd)
68             strSize.Format(_T("%d x %d"), imgXRes + xRel, imgYRes + yRel);
69         SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) (LPCTSTR) strSize);
70     }
71     return 0;
72 }
73 
74 LRESULT CSizeboxWindow::OnLButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
75 {
76     if (resizing)
77     {
78         short xRel;
79         short yRel;
80         int imgXRes = imageModel.GetWidth();
81         int imgYRes = imageModel.GetHeight();
82         xRel = (GET_X_LPARAM(lParam) - xOrig) * 1000 / toolsModel.GetZoom();
83         yRel = (GET_Y_LPARAM(lParam) - yOrig) * 1000 / toolsModel.GetZoom();
84         if (m_hWnd == sizeboxLeftTop)
85             imageModel.Crop(imgXRes - xRel, imgYRes - yRel, xRel, yRel);
86         if (m_hWnd == sizeboxCenterTop.m_hWnd)
87             imageModel.Crop(imgXRes, imgYRes - yRel, 0, yRel);
88         if (m_hWnd == sizeboxRightTop.m_hWnd)
89             imageModel.Crop(imgXRes + xRel, imgYRes - yRel, 0, yRel);
90         if (m_hWnd == sizeboxLeftCenter.m_hWnd)
91             imageModel.Crop(imgXRes - xRel, imgYRes, xRel, 0);
92         if (m_hWnd == sizeboxRightCenter.m_hWnd)
93             imageModel.Crop(imgXRes + xRel, imgYRes, 0, 0);
94         if (m_hWnd == sizeboxLeftBottom.m_hWnd)
95             imageModel.Crop(imgXRes - xRel, imgYRes + yRel, xRel, 0);
96         if (m_hWnd == sizeboxCenterBottom.m_hWnd)
97             imageModel.Crop(imgXRes, imgYRes + yRel, 0, 0);
98         if (m_hWnd == sizeboxRightBottom.m_hWnd)
99             imageModel.Crop(imgXRes + xRel, imgYRes + yRel, 0, 0);
100         SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) _T(""));
101     }
102     resizing = FALSE;
103     ReleaseCapture();
104     return 0;
105 }
106 
107 LRESULT CSizeboxWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
108 {
109     resizing = FALSE;
110     return 0;
111 }
112 
113 LRESULT CSizeboxWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
114 {
115     if (wParam == VK_ESCAPE)
116     {
117         if (GetCapture() == m_hWnd)
118         {
119             ReleaseCapture();
120         }
121     }
122     return 0;
123 }
124