2 * PROJECT: PAINT for ReactOS
4 * FILE: base/applications/mspaint/imgarea.cpp
5 * PURPOSE: Window procedure of the main window and all children apart from
6 * hPalWin, hToolSettings and hSelection
7 * PROGRAMMERS: Benedikt Freisen
10 /* INCLUDES *********************************************************/
16 /* FUNCTIONS ********************************************************/
19 zoomTo(int newZoom
, int mouseX
, int mouseY
);
22 updateCanvasAndScrollbars()
24 selectionWindow
.ShowWindow(SW_HIDE
);
25 imageArea
.MoveWindow(3, 3, imageModel
.GetWidth() * toolsModel
.GetZoom() / 1000, imageModel
.GetHeight() * toolsModel
.GetZoom() / 1000, FALSE
);
26 scrollboxWindow
.Invalidate(TRUE
);
27 imageArea
.Invalidate(FALSE
);
29 scrollboxWindow
.SetScrollPos(SB_HORZ
, 0, TRUE
);
30 scrollboxWindow
.SetScrollPos(SB_VERT
, 0, TRUE
);
33 void CImgAreaWindow::drawZoomFrame(int mouseX
, int mouseY
)
41 RECT clientRectScrollbox
;
42 RECT clientRectImageArea
;
44 scrollboxWindow
.GetClientRect(&clientRectScrollbox
);
45 GetClientRect(&clientRectImageArea
);
46 w
= clientRectImageArea
.right
* clientRectScrollbox
.right
/ (clientRectImageArea
.right
* 2);
47 h
= clientRectImageArea
.bottom
* clientRectScrollbox
.bottom
/ (clientRectImageArea
.bottom
* 2);
48 x
= max(0, min(clientRectImageArea
.right
- w
, mouseX
- w
/ 2));
49 y
= max(0, min(clientRectImageArea
.bottom
- h
, mouseY
- h
/ 2));
52 oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 0, 0));
53 logbrush
.lbStyle
= BS_HOLLOW
;
54 oldBrush
= (HBRUSH
) SelectObject(hdc
, CreateBrushIndirect(&logbrush
));
55 rop
= SetROP2(hdc
, R2_NOT
);
56 Rectangle(hdc
, x
, y
, x
+ w
, y
+ h
);
58 DeleteObject(SelectObject(hdc
, oldBrush
));
59 DeleteObject(SelectObject(hdc
, oldPen
));
63 LRESULT
CImgAreaWindow::OnSize(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
65 int imgXRes
= imageModel
.GetWidth();
66 int imgYRes
= imageModel
.GetHeight();
67 sizeboxLeftTop
.MoveWindow(
70 sizeboxCenterTop
.MoveWindow(
71 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
73 sizeboxRightTop
.MoveWindow(
74 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
76 sizeboxLeftCenter
.MoveWindow(
78 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
79 sizeboxRightCenter
.MoveWindow(
80 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
81 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
82 sizeboxLeftBottom
.MoveWindow(
84 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
85 sizeboxCenterBottom
.MoveWindow(
86 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
87 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
88 sizeboxRightBottom
.MoveWindow(
89 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
90 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
95 LRESULT
CImgAreaWindow::OnPaint(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
97 DefWindowProc(WM_PAINT
, wParam
, lParam
);
99 int imgXRes
= imageModel
.GetWidth();
100 int imgYRes
= imageModel
.GetHeight();
101 StretchBlt(hdc
, 0, 0, imgXRes
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000, imageModel
.GetDC(), 0, 0, imgXRes
,
103 if (showGrid
&& (toolsModel
.GetZoom() >= 4000))
105 HPEN oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 1, 0x00a0a0a0));
107 for(counter
= 0; counter
<= imgYRes
; counter
++)
109 MoveToEx(hdc
, 0, counter
* toolsModel
.GetZoom() / 1000, NULL
);
110 LineTo(hdc
, imgXRes
* toolsModel
.GetZoom() / 1000, counter
* toolsModel
.GetZoom() / 1000);
112 for(counter
= 0; counter
<= imgXRes
; counter
++)
114 MoveToEx(hdc
, counter
* toolsModel
.GetZoom() / 1000, 0, NULL
);
115 LineTo(hdc
, counter
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000);
117 DeleteObject(SelectObject(hdc
, oldPen
));
120 selectionWindow
.Invalidate(FALSE
);
121 miniature
.Invalidate(FALSE
);
125 LRESULT
CImgAreaWindow::OnSetCursor(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
127 switch (toolsModel
.GetActiveTool())
133 SetCursor(hCurColor
);
142 SetCursor(hCurAirbrush
);
145 SetCursor(LoadCursor(NULL
, IDC_CROSS
));
150 LRESULT
CImgAreaWindow::OnLButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
152 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
156 startPaintingL(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
157 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
161 SendMessage(WM_LBUTTONUP
, wParam
, lParam
);
165 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() < 8000))
166 zoomTo(toolsModel
.GetZoom() * 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
170 LRESULT
CImgAreaWindow::OnRButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
172 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
176 startPaintingR(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
177 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
181 SendMessage(WM_RBUTTONUP
, wParam
, lParam
);
185 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() > 125))
186 zoomTo(toolsModel
.GetZoom() / 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
190 LRESULT
CImgAreaWindow::OnLButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
196 endPaintingL(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
197 paletteModel
.GetBgColor());
199 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
202 GetPixel(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
203 if (tempColor
!= CLR_INVALID
)
204 paletteModel
.SetFgColor(tempColor
);
206 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
211 LRESULT
CImgAreaWindow::OnRButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
217 endPaintingR(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
218 paletteModel
.GetBgColor());
220 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
223 GetPixel(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
224 if (tempColor
!= CLR_INVALID
)
225 paletteModel
.SetBgColor(tempColor
);
227 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
232 LRESULT
CImgAreaWindow::OnMouseMove(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
234 LONG xNow
= GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
235 LONG yNow
= GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
236 if ((!drawing
) || (toolsModel
.GetActiveTool() <= TOOL_AIRBRUSH
))
240 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
244 drawZoomFrame(GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
247 tme
.cbSize
= sizeof(TRACKMOUSEEVENT
);
248 tme
.dwFlags
= TME_LEAVE
;
249 tme
.hwndTrack
= m_hWnd
;
251 TrackMouseEvent(&tme
);
256 strCoord
.Format(_T("%ld, %ld"), xNow
, yNow
);
257 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) (LPCTSTR
) strCoord
);
262 /* values displayed in statusbar */
263 LONG xRel
= xNow
- start
.x
;
264 LONG yRel
= yNow
- start
.y
;
265 /* freesel, rectsel and text tools always show numbers limited to fit into image area */
266 if ((toolsModel
.GetActiveTool() == TOOL_FREESEL
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_TEXT
))
269 xRel
= (xNow
< 0) ? -start
.x
: xRel
;
270 else if (xNow
> imageModel
.GetWidth())
271 xRel
= imageModel
.GetWidth() - start
.x
;
273 yRel
= (yNow
< 0) ? -start
.y
: yRel
;
274 else if (yNow
> imageModel
.GetHeight())
275 yRel
= imageModel
.GetHeight() - start
.y
;
277 /* rectsel and shape tools always show non-negative numbers when drawing */
278 if ((toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_SHAPE
))
285 /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
286 switch(toolsModel
.GetActiveTool())
295 strCoord
.Format(_T("%ld, %ld"), xNow
, yNow
);
296 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) (LPCTSTR
) strCoord
);
300 if ((wParam
& MK_LBUTTON
) != 0)
302 whilePaintingL(imageModel
.GetDC(), xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
304 if ((toolsModel
.GetActiveTool() >= TOOL_TEXT
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_FREESEL
))
307 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
309 strSize
.Format(_T("%ld x %ld"), xRel
, yRel
);
310 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) (LPCTSTR
) strSize
);
313 if ((wParam
& MK_RBUTTON
) != 0)
315 whilePaintingR(imageModel
.GetDC(), xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
317 if (toolsModel
.GetActiveTool() >= TOOL_TEXT
)
320 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
322 strSize
.Format(_T("%ld x %ld"), xRel
, yRel
);
323 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) (LPCTSTR
) strSize
);
330 LRESULT
CImgAreaWindow::OnMouseLeave(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
332 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) _T(""));
333 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
338 LRESULT
CImgAreaWindow::OnImageModelDimensionsChanged(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
340 updateCanvasAndScrollbars();
344 LRESULT
CImgAreaWindow::OnImageModelImageChanged(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)