74bf84414f300c221e4be8b9d8dc69544d31d627
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
11 /* INCLUDES *********************************************************/
17 /* FUNCTIONS ********************************************************/
20 updateCanvasAndScrollbars()
22 selectionWindow
.ShowWindow(SW_HIDE
);
23 imageArea
.MoveWindow(3, 3, imageModel
.GetWidth() * toolsModel
.GetZoom() / 1000, imageModel
.GetHeight() * toolsModel
.GetZoom() / 1000, FALSE
);
24 scrollboxWindow
.Invalidate(TRUE
);
25 imageArea
.Invalidate(FALSE
);
27 scrollboxWindow
.SetScrollPos(SB_HORZ
, 0, TRUE
);
28 scrollboxWindow
.SetScrollPos(SB_VERT
, 0, TRUE
);
31 void CImgAreaWindow::drawZoomFrame(int mouseX
, int mouseY
)
39 RECT clientRectScrollbox
;
40 RECT clientRectImageArea
;
42 scrollboxWindow
.GetClientRect(&clientRectScrollbox
);
43 GetClientRect(&clientRectImageArea
);
44 w
= clientRectImageArea
.right
* 2;
45 h
= clientRectImageArea
.bottom
* 2;
50 w
= clientRectImageArea
.right
* clientRectScrollbox
.right
/ w
;
51 h
= clientRectImageArea
.bottom
* clientRectScrollbox
.bottom
/ h
;
52 x
= max(0, min(clientRectImageArea
.right
- w
, mouseX
- w
/ 2));
53 y
= max(0, min(clientRectImageArea
.bottom
- h
, mouseY
- h
/ 2));
56 oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 0, 0));
57 logbrush
.lbStyle
= BS_HOLLOW
;
58 oldBrush
= (HBRUSH
) SelectObject(hdc
, CreateBrushIndirect(&logbrush
));
59 rop
= SetROP2(hdc
, R2_NOT
);
60 Rectangle(hdc
, x
, y
, x
+ w
, y
+ h
);
62 DeleteObject(SelectObject(hdc
, oldBrush
));
63 DeleteObject(SelectObject(hdc
, oldPen
));
67 LRESULT
CImgAreaWindow::OnSize(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
69 int imgXRes
= imageModel
.GetWidth();
70 int imgYRes
= imageModel
.GetHeight();
71 sizeboxLeftTop
.MoveWindow(
74 sizeboxCenterTop
.MoveWindow(
75 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
77 sizeboxRightTop
.MoveWindow(
78 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
80 sizeboxLeftCenter
.MoveWindow(
82 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
83 sizeboxRightCenter
.MoveWindow(
84 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
85 imgYRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4, 3, 3, TRUE
);
86 sizeboxLeftBottom
.MoveWindow(
88 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
89 sizeboxCenterBottom
.MoveWindow(
90 imgXRes
* toolsModel
.GetZoom() / 2000 + 3 * 3 / 4,
91 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
92 sizeboxRightBottom
.MoveWindow(
93 imgXRes
* toolsModel
.GetZoom() / 1000 + 3,
94 imgYRes
* toolsModel
.GetZoom() / 1000 + 3, 3, 3, TRUE
);
99 LRESULT
CImgAreaWindow::OnPaint(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
101 DefWindowProc(WM_PAINT
, wParam
, lParam
);
103 int imgXRes
= imageModel
.GetWidth();
104 int imgYRes
= imageModel
.GetHeight();
105 StretchBlt(hdc
, 0, 0, imgXRes
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000, imageModel
.GetDC(), 0, 0, imgXRes
,
107 if (showGrid
&& (toolsModel
.GetZoom() >= 4000))
109 HPEN oldPen
= (HPEN
) SelectObject(hdc
, CreatePen(PS_SOLID
, 1, 0x00a0a0a0));
111 for(counter
= 0; counter
<= imgYRes
; counter
++)
113 MoveToEx(hdc
, 0, counter
* toolsModel
.GetZoom() / 1000, NULL
);
114 LineTo(hdc
, imgXRes
* toolsModel
.GetZoom() / 1000, counter
* toolsModel
.GetZoom() / 1000);
116 for(counter
= 0; counter
<= imgXRes
; counter
++)
118 MoveToEx(hdc
, counter
* toolsModel
.GetZoom() / 1000, 0, NULL
);
119 LineTo(hdc
, counter
* toolsModel
.GetZoom() / 1000, imgYRes
* toolsModel
.GetZoom() / 1000);
121 DeleteObject(SelectObject(hdc
, oldPen
));
124 selectionWindow
.Invalidate(FALSE
);
125 miniature
.Invalidate(FALSE
);
129 LRESULT
CImgAreaWindow::OnSetCursor(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
131 switch (toolsModel
.GetActiveTool())
137 SetCursor(hCurColor
);
146 SetCursor(hCurAirbrush
);
149 SetCursor(LoadCursor(NULL
, IDC_CROSS
));
154 LRESULT
CImgAreaWindow::OnLButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
156 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
160 startPaintingL(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
161 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
165 SendMessage(WM_LBUTTONUP
, wParam
, lParam
);
169 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() < 8000))
170 zoomTo(toolsModel
.GetZoom() * 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
174 LRESULT
CImgAreaWindow::OnRButtonDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
176 if ((!drawing
) || (toolsModel
.GetActiveTool() == TOOL_COLOR
))
180 startPaintingR(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(),
181 paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
185 SendMessage(WM_RBUTTONUP
, wParam
, lParam
);
189 if ((toolsModel
.GetActiveTool() == TOOL_ZOOM
) && (toolsModel
.GetZoom() > 125))
190 zoomTo(toolsModel
.GetZoom() / 2, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
194 LRESULT
CImgAreaWindow::OnLButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
198 endPaintingL(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
199 paletteModel
.GetBgColor());
201 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
204 GetPixel(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
205 if (tempColor
!= CLR_INVALID
)
206 paletteModel
.SetFgColor(tempColor
);
208 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
215 void CImgAreaWindow::cancelDrawing()
218 switch (toolsModel
.GetActiveTool())
220 case TOOL_FREESEL
: case TOOL_RECTSEL
:
221 case TOOL_TEXT
: case TOOL_ZOOM
: case TOOL_SHAPE
:
222 imageModel
.ResetToPrevious();
223 selectionModel
.ResetPtStack();
231 if (GetKeyState(VK_LBUTTON
) < 0)
233 endPaintingL(imageModel
.GetDC(), pt
.x
* 1000 / toolsModel
.GetZoom(), pt
.y
* 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
234 paletteModel
.GetBgColor());
236 else if (GetKeyState(VK_RBUTTON
) < 0)
238 endPaintingR(imageModel
.GetDC(), pt
.x
* 1000 / toolsModel
.GetZoom(), pt
.y
* 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
239 paletteModel
.GetBgColor());
243 selectionModel
.ResetPtStack();
247 LRESULT
CImgAreaWindow::OnCaptureChanged(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
257 LRESULT
CImgAreaWindow::OnKeyDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
259 if (wParam
== VK_ESCAPE
)
261 if (GetCapture() == m_hWnd
)
267 switch (toolsModel
.GetActiveTool())
269 case TOOL_SHAPE
: case TOOL_BEZIER
:
278 LRESULT
CImgAreaWindow::OnRButtonUp(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
282 endPaintingR(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), paletteModel
.GetFgColor(),
283 paletteModel
.GetBgColor());
285 if (toolsModel
.GetActiveTool() == TOOL_COLOR
)
288 GetPixel(imageModel
.GetDC(), GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom(), GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom());
289 if (tempColor
!= CLR_INVALID
)
290 paletteModel
.SetBgColor(tempColor
);
292 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) "");
299 LRESULT
CImgAreaWindow::OnMouseMove(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
301 LONG xNow
= GET_X_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
302 LONG yNow
= GET_Y_LPARAM(lParam
) * 1000 / toolsModel
.GetZoom();
303 if ((!drawing
) || (toolsModel
.GetActiveTool() <= TOOL_AIRBRUSH
))
307 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
311 drawZoomFrame(GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
314 tme
.cbSize
= sizeof(TRACKMOUSEEVENT
);
315 tme
.dwFlags
= TME_LEAVE
;
316 tme
.hwndTrack
= m_hWnd
;
318 TrackMouseEvent(&tme
);
323 strCoord
.Format(_T("%ld, %ld"), xNow
, yNow
);
324 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) (LPCTSTR
) strCoord
);
329 /* values displayed in statusbar */
330 LONG xRel
= xNow
- start
.x
;
331 LONG yRel
= yNow
- start
.y
;
332 /* freesel, rectsel and text tools always show numbers limited to fit into image area */
333 if ((toolsModel
.GetActiveTool() == TOOL_FREESEL
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_TEXT
))
336 xRel
= (xNow
< 0) ? -start
.x
: xRel
;
337 else if (xNow
> imageModel
.GetWidth())
338 xRel
= imageModel
.GetWidth() - start
.x
;
340 yRel
= (yNow
< 0) ? -start
.y
: yRel
;
341 else if (yNow
> imageModel
.GetHeight())
342 yRel
= imageModel
.GetHeight() - start
.y
;
344 /* rectsel and shape tools always show non-negative numbers when drawing */
345 if ((toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_SHAPE
))
352 /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
353 switch(toolsModel
.GetActiveTool())
362 strCoord
.Format(_T("%ld, %ld"), xNow
, yNow
);
363 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) (LPCTSTR
) strCoord
);
367 if ((wParam
& MK_LBUTTON
) != 0)
369 whilePaintingL(imageModel
.GetDC(), xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
371 if ((toolsModel
.GetActiveTool() >= TOOL_TEXT
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_FREESEL
))
374 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
376 strSize
.Format(_T("%ld x %ld"), xRel
, yRel
);
377 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) (LPCTSTR
) strSize
);
380 if ((wParam
& MK_RBUTTON
) != 0)
382 whilePaintingR(imageModel
.GetDC(), xNow
, yNow
, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
384 if (toolsModel
.GetActiveTool() >= TOOL_TEXT
)
387 if ((toolsModel
.GetActiveTool() >= TOOL_LINE
) && (GetAsyncKeyState(VK_SHIFT
) < 0))
389 strSize
.Format(_T("%ld x %ld"), xRel
, yRel
);
390 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) (LPCTSTR
) strSize
);
397 LRESULT
CImgAreaWindow::OnMouseLeave(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
399 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
) _T(""));
400 if (toolsModel
.GetActiveTool() == TOOL_ZOOM
)
405 LRESULT
CImgAreaWindow::OnImageModelDimensionsChanged(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
407 updateCanvasAndScrollbars();
411 LRESULT
CImgAreaWindow::OnImageModelImageChanged(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)