922c3e67f4f4d122a86da030b122eb6c39a8e21e
2 * PROJECT: PAINT for ReactOS
4 * FILE: base/applications/mspaint_new/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 *********************************************************/
17 /* FUNCTIONS ********************************************************/
20 zoomTo(int newZoom
, int mouseX
, int mouseY
);
22 void CImgAreaWindow::drawZoomFrame(int mouseX
, int mouseY
)
30 RECT clientRectScrollbox
;
31 RECT clientRectImageArea
;
33 scrollboxWindow
.GetClientRect(&clientRectScrollbox
);
34 GetClientRect(&clientRectImageArea
);
35 w
= clientRectImageArea
.right
* clientRectScrollbox
.right
/ (clientRectImageArea
.right
* 2);
36 h
= clientRectImageArea
.bottom
* clientRectScrollbox
.bottom
/ (clientRectImageArea
.bottom
* 2);
37 x
= max(0, min(clientRectImageArea
.right
- w
, mouseX
- w
/ 2));
38 y
= max(0, min(clientRectImageArea
.bottom
- h
, mouseY
- h
/ 2));
41 oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 0, 0));
42 logbrush
.lbStyle
= BS_HOLLOW
;
43 oldBrush
= (HBRUSH
) SelectObject(hdc
, CreateBrushIndirect(&logbrush
));
44 rop
= SetROP2(hdc
, R2_NOT
);
45 Rectangle(hdc
, x
, y
, x
+ w
, y
+ h
);
47 DeleteObject(SelectObject(hdc
, oldBrush
));
48 DeleteObject(SelectObject(hdc
, oldPen
));
52 LRESULT
CImgAreaWindow::OnSize(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
54 sizeboxLeftTop
.MoveWindow(
57 sizeboxCenterTop
.MoveWindow(
58 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
60 sizeboxRightTop
.MoveWindow(
61 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
63 sizeboxLeftCenter
.MoveWindow(
65 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
66 sizeboxRightCenter
.MoveWindow(
67 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
68 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
69 sizeboxLeftBottom
.MoveWindow(
71 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
72 sizeboxCenterBottom
.MoveWindow(
73 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
74 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
75 sizeboxRightBottom
.MoveWindow(
76 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
77 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
82 LRESULT
CImgAreaWindow::OnPaint(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
84 DefWindowProc(WM_PAINT
, wParam
, lParam
);
85 HDC hdc
= imageArea
.GetDC();
86 StretchBlt(hdc
, 0, 0, imgXRes
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000, hDrawingDC
, 0, 0, imgXRes
,
88 if (showGrid
&& (toolsModel
.GetZoom() >= 4000))
90 HPEN oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 1, 0x00a0a0a0));
92 for(counter
= 0; counter
<= imgYRes
; counter
++)
94 MoveToEx(hdc
, 0, counter
* toolsModel
.GetZoom() / 1000, NULL
);
95 LineTo(hdc
, imgXRes
* toolsModel
.GetZoom() / 1000, counter
* toolsModel
.GetZoom() / 1000);
97 for(counter
= 0; counter
<= imgXRes
; counter
++)
99 MoveToEx(hdc
, counter
* toolsModel
.GetZoom() / 1000, 0, NULL
);
100 LineTo(hdc
, counter
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000);
102 DeleteObject(SelectObject(hdc
, oldPen
));
104 imageArea
.ReleaseDC(hdc
);
105 selectionWindow
.Invalidate(FALSE
);
106 miniature
.Invalidate(FALSE
);
110 LRESULT
CImgAreaWindow::OnSetCursor(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
112 switch (toolsModel
.GetActiveTool())
118 SetCursor(hCurColor
);
127 SetCursor(hCurAirbrush
);
130 SetCursor(LoadCursor(NULL
, IDC_CROSS
));
135 LRESULT
CImgAreaWindow::OnLButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
137 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
141 startPaintingL(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
142 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
146 SendMessage(WM_LBUTTONUP
, wParam
, lParam
);
150 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() < 8000))
151 zoomTo(toolsModel
.GetZoom() * 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
155 LRESULT
CImgAreaWindow::OnRButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
157 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
161 startPaintingR(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
162 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
166 SendMessage(WM_RBUTTONUP
, wParam
, lParam
);
170 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() > 125))
171 zoomTo(toolsModel
.GetZoom() / 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
175 LRESULT
CImgAreaWindow::OnLButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
181 endPaintingL(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
182 paletteModel
.GetBgColor());
184 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
187 GetPixel(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
188 if (tempColor
!= CLR_INVALID
)
189 paletteModel
.SetFgColor(tempColor
);
191 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
196 LRESULT
CImgAreaWindow::OnRButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
202 endPaintingR(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
203 paletteModel
.GetBgColor());
205 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
208 GetPixel(hDrawingDC
, GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
209 if (tempColor
!= CLR_INVALID
)
210 paletteModel
.SetBgColor(tempColor
);
212 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
217 LRESULT
CImgAreaWindow::OnMouseMove(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
219 LONG xNow
= GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
220 LONG yNow
= GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
221 if ((!drawing
) || (toolsModel
.GetActiveTool() <= TOOL_AIRBRUSH
))
225 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
229 drawZoomFrame(GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
232 tme
.cbSize
= sizeof(TRACKMOUSEEVENT
);
233 tme
.dwFlags
= TME_LEAVE
;
234 tme
.hwndTrack
= imageArea
.m_hWnd
;
236 TrackMouseEvent(&tme
);
241 _stprintf(coordStr
, _T("%ld, %ld"), xNow
, yNow
);
242 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) coordStr
);
247 /* values displayed in statusbar */
248 LONG xRel
= xNow
- start
.x
;
249 LONG yRel
= yNow
- start
.y
;
250 /* freesel, rectsel and text tools always show numbers limited to fit into image area */
251 if ((toolsModel
.GetActiveTool() == TOOL_FREESEL
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_TEXT
))
254 xRel
= (xNow
< 0) ? -start
.x
: xRel
;
255 else if (xNow
> imgXRes
)
256 xRel
= imgXRes
-start
.x
;
258 yRel
= (yNow
< 0) ? -start
.y
: yRel
;
259 else if (yNow
> imgYRes
)
260 yRel
= imgYRes
-start
.y
;
262 /* rectsel and shape tools always show non-negative numbers when drawing */
263 if ((toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_SHAPE
))
270 /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
271 switch(toolsModel
.GetActiveTool())
280 _stprintf(coordStr
, _T("%ld, %ld"), xNow
, yNow
);
281 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) coordStr
);
285 if ((wParam
& MK_LBUTTON
) != 0)
287 whilePaintingL(hDrawingDC
, xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
289 if ((toolsModel
.GetActiveTool() >= TOOL_TEXT
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_FREESEL
))
292 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
294 _stprintf(sizeStr
, _T("%ld x %ld"), xRel
, yRel
);
295 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) sizeStr
);
298 if ((wParam
& MK_RBUTTON
) != 0)
300 whilePaintingR(hDrawingDC
, xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
302 if (toolsModel
.GetActiveTool() >= TOOL_TEXT
)
305 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
307 _stprintf(sizeStr
, _T("%ld x %ld"), xRel
, yRel
);
308 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) sizeStr
);
315 LRESULT
CImgAreaWindow::OnMouseLeave(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
317 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) _T(""));
318 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
319 imageArea
.Invalidate(FALSE
);