ReactOS 0.4.16-dev-1025-gd3456f5
CCanvasWindow Class Reference

#include <canvas.h>

Inheritance diagram for CCanvasWindow:
Collaboration diagram for CCanvasWindow:

Public Member Functions

 DECLARE_WND_CLASS_EX (L"ReactOSPaintCanvas", CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW, COLOR_APPWORKSPACE) CCanvasWindow()
 
virtual ~CCanvasWindow ()
 
VOID OnEndDraw (BOOL bCancel)
 
VOID updateScrollRange ()
 
VOID updateScrollPos (INT x=0, INT y=0)
 
VOID ImageToCanvas (POINT &pt)
 
VOID ImageToCanvas (RECT &rc)
 
VOID CanvasToImage (POINT &pt)
 
VOID CanvasToImage (RECT &rc)
 
VOID GetImageRect (RECT &rc)
 
VOID getNewZoomRect (CRect &rcView, INT newZoom, CPoint ptTarget)
 
VOID zoomTo (INT newZoom, LONG left=0, LONG top=0)
 

Public Attributes

BOOL m_drawing
 

Protected Member Functions

HITTEST CanvasHitTest (POINT pt)
 
RECT GetBaseRect ()
 
BOOL DoDraw (HDC hDC, RECT &rcClient, RECT &rcPaint)
 
VOID OnHVScroll (WPARAM wParam, INT fnBar)
 
LRESULT OnSize (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnHScroll (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnVScroll (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnEraseBkgnd (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnPaint (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMouseMove (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnKeyDown (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnSetCursor (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMouseWheel (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCancelMode (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCaptureChanged (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCtlColorEdit (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnPaletteModelColorChanged (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonDown (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonDblClk (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonUp (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 

Protected Attributes

HITTEST m_hitCanvasSizeBox
 
POINT m_ptOrig
 
CRect m_rcResizing
 
UINT m_nMouseDownMsg = 0
 

Detailed Description

Definition at line 10 of file canvas.h.

Constructor & Destructor Documentation

◆ ~CCanvasWindow()

CCanvasWindow::~CCanvasWindow ( )
virtual

Definition at line 22 of file canvas.cpp.

23{
24}

Member Function Documentation

◆ CanvasHitTest()

HITTEST CCanvasWindow::CanvasHitTest ( POINT  pt)
protected

Definition at line 66 of file canvas.cpp.

67{
69 return HIT_INNER;
70 RECT rcBase = GetBaseRect();
71 return getSizeBoxHitTest(pt, &rcBase);
72}
SelectionModel selectionModel
@ HIT_INNER
Definition: precomp.h:66
CTextEditWindow textEditWindow
Definition: textedit.cpp:12
RECT GetBaseRect()
Definition: canvas.cpp:26
#define pt(x, y)
Definition: drawing.c:79
HITTEST getSizeBoxHitTest(POINT pt, LPCRECT prcBase)
Definition: sizebox.cpp:80
BOOL WINAPI IsWindowVisible(_In_ HWND)

Referenced by OnButtonDown(), and OnSetCursor().

◆ CanvasToImage() [1/2]

VOID CCanvasWindow::CanvasToImage ( POINT pt)

Definition at line 48 of file canvas.cpp.

49{
52 UnZoomed(pt);
53}
#define GRIP_SIZE
Definition: precomp.h:43
static int UnZoomed(int xy)
Definition: toolsmodel.h:155
#define SB_VERT
Definition: winuser.h:553
int WINAPI GetScrollPos(_In_ HWND, _In_ int)
#define SB_HORZ
Definition: winuser.h:552

Referenced by DoDraw(), CTextEditWindow::InvalidateEditRect(), OnButtonDblClk(), OnButtonDown(), OnButtonUp(), OnMouseMove(), and zoomTo().

◆ CanvasToImage() [2/2]

VOID CCanvasWindow::CanvasToImage ( RECT rc)

Definition at line 55 of file canvas.cpp.

56{
58 UnZoomed(rc);
59}
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)

◆ DECLARE_WND_CLASS_EX()

CCanvasWindow::DECLARE_WND_CLASS_EX ( L"ReactOSPaintCanvas"  ,
CS_DBLCLKS|CS_HREDRAW CS_VREDRAW,
COLOR_APPWORKSPACE   
)

◆ DoDraw()

BOOL CCanvasWindow::DoDraw ( HDC  hDC,
RECT rcClient,
RECT rcPaint 
)
protected

Definition at line 117 of file canvas.cpp.

118{
119 // This is the target area we have to draw on
120 CRect rcCanvasDraw;
121 rcCanvasDraw.IntersectRect(&rcClient, &rcPaint);
122
123 // Calculate image size
124 CRect rcImage;
125 GetImageRect(rcImage);
126 SIZE sizeImage = { imageModel.GetWidth(), imageModel.GetHeight() };
127
128 // We use a memory bitmap to reduce flickering
129 HBITMAP hbmCache1 = CreateDIBWithProperties(rcClient.right, rcClient.bottom);
130 if (!hbmCache1)
131 return FALSE; // Out of memory
132 HBITMAP hbmCache2 = CreateDIBWithProperties(sizeImage.cx, sizeImage.cy);
133 if (!hbmCache2)
134 {
135 ::DeleteObject(hbmCache1);
136 return FALSE; // Out of memory
137 }
138
139 HDC hdcMem0 = ::CreateCompatibleDC(hDC);
140 HGDIOBJ hbm0Old = ::SelectObject(hdcMem0, hbmCache1);
141
142 // Fill the background on hdcMem0
143 ::FillRect(hdcMem0, &rcCanvasDraw, (HBRUSH)(COLOR_APPWORKSPACE + 1));
144
145 // Draw the sizeboxes if necessary
146 RECT rcBase = GetBaseRect();
148 drawSizeBoxes(hdcMem0, &rcBase, FALSE, &rcCanvasDraw);
149
150 // Calculate the target area on the image
151 CRect rcImageDraw = rcCanvasDraw;
152 CanvasToImage(rcImageDraw);
153 rcImageDraw.IntersectRect(&rcImageDraw, &rcImage);
154
155 // Consider rounding down by zooming
156 rcImageDraw.right += 1;
157 rcImageDraw.bottom += 1;
158
159 // hdcMem1 <-- imageModel
160 HDC hdcMem1 = ::CreateCompatibleDC(hDC);
161 HGDIOBJ hbm1Old = ::SelectObject(hdcMem1, hbmCache2);
162 ::BitBlt(hdcMem1, rcImageDraw.left, rcImageDraw.top, rcImageDraw.Width(), rcImageDraw.Height(),
163 imageModel.GetDC(), rcImageDraw.left, rcImageDraw.top, SRCCOPY);
164
165 // Draw overlay #1 on hdcMem1
167
168 // Transfer the bits with stretch (hdcMem0 <-- hdcMem1)
169 ImageToCanvas(rcImage);
170 ::StretchBlt(hdcMem0, rcImage.left, rcImage.top, rcImage.Width(), rcImage.Height(),
171 hdcMem1, 0, 0, sizeImage.cx, sizeImage.cy, SRCCOPY);
172
173 // Clean up hdcMem1
174 ::SelectObject(hdcMem1, hbm1Old);
175 ::DeleteDC(hdcMem1);
176
177 // Draw the grid on hdcMem0
178 if (g_showGrid && toolsModel.GetZoom() >= 4000)
179 {
180 HPEN oldPen = (HPEN) ::SelectObject(hdcMem0, ::CreatePen(PS_SOLID, 1, RGB(160, 160, 160)));
181 for (INT counter = 0; counter < sizeImage.cy; counter++)
182 {
183 POINT pt0 = { 0, counter }, pt1 = { sizeImage.cx, counter };
184 ImageToCanvas(pt0);
185 ImageToCanvas(pt1);
186 ::MoveToEx(hdcMem0, pt0.x, pt0.y, NULL);
187 ::LineTo(hdcMem0, pt1.x, pt1.y);
188 }
189 for (INT counter = 0; counter < sizeImage.cx; counter++)
190 {
191 POINT pt0 = { counter, 0 }, pt1 = { counter, sizeImage.cy };
192 ImageToCanvas(pt0);
193 ImageToCanvas(pt1);
194 ::MoveToEx(hdcMem0, pt0.x, pt0.y, NULL);
195 ::LineTo(hdcMem0, pt1.x, pt1.y);
196 }
197 ::DeleteObject(::SelectObject(hdcMem0, oldPen));
198 }
199
200 // Draw overlay #2 on hdcMem0
202
203 // Draw new frame on hdcMem0 if any
205 DrawXorRect(hdcMem0, &m_rcResizing);
206
207 // Transfer the bits (hDC <-- hdcMem0)
208 ::BitBlt(hDC, rcCanvasDraw.left, rcCanvasDraw.top, rcCanvasDraw.Width(), rcCanvasDraw.Height(),
209 hdcMem0, rcCanvasDraw.left, rcCanvasDraw.top, SRCCOPY);
210
211 // Clean up hdcMem0
212 ::SelectObject(hdcMem0, hbm0Old);
213 ::DeleteDC(hdcMem0);
214 ::DeleteObject(hbmCache2);
215 ::DeleteObject(hbmCache1);
216
217 return TRUE;
218}
static HDC hDC
Definition: 3dtext.c:33
BOOL g_showGrid
Definition: main.cpp:22
ToolsModel toolsModel
Definition: toolsmodel.cpp:10
@ HIT_NONE
Definition: precomp.h:56
HITTEST m_hitCanvasSizeBox
Definition: canvas.h:58
VOID ImageToCanvas(POINT &pt)
Definition: canvas.cpp:35
VOID CanvasToImage(POINT &pt)
Definition: canvas.cpp:48
CRect m_rcResizing
Definition: canvas.h:60
VOID GetImageRect(RECT &rc)
Definition: canvas.cpp:61
BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) noexcept
Definition: atltypes.h:346
int Width() const noexcept
Definition: atltypes.h:461
int Height() const noexcept
Definition: atltypes.h:318
BOOL IsRectEmpty() const noexcept
Definition: atltypes.h:351
int GetWidth() const
Definition: history.cpp:256
int GetHeight() const
Definition: history.cpp:261
HDC GetDC()
Definition: history.cpp:274
void OnDrawOverlayOnCanvas(HDC hdc)
Definition: mouse.cpp:1191
void OnDrawOverlayOnImage(HDC hdc)
Definition: mouse.cpp:1186
int GetZoom() const
Definition: toolsmodel.cpp:261
HBITMAP CreateDIBWithProperties(int width, int height)
Definition: dib.cpp:32
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void DrawXorRect(HDC hdc, const RECT *prc)
Definition: drawing.cpp:362
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
#define RGB(r, g, b)
Definition: precomp.h:71
pKey DeleteObject()
ImageModel imageModel
Definition: history.cpp:11
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
VOID drawSizeBoxes(HDC hdc, LPCRECT prcBase, BOOL bDrawFrame, LPCRECT prcPaint)
Definition: sizebox.cpp:103
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
int32_t INT
Definition: typedefs.h:58
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI DeleteDC(_In_ HDC)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define PS_SOLID
Definition: wingdi.h:586
#define COLOR_APPWORKSPACE
Definition: winuser.h:936

Referenced by OnPaint().

◆ GetBaseRect()

RECT CCanvasWindow::GetBaseRect ( )
protected

Definition at line 26 of file canvas.cpp.

27{
28 CRect rcBase;
29 GetImageRect(rcBase);
30 ImageToCanvas(rcBase);
32 return rcBase;
33}
void InflateRect(int x, int y) noexcept
Definition: atltypes.h:323

Referenced by CanvasHitTest(), and DoDraw().

◆ GetImageRect()

VOID CCanvasWindow::GetImageRect ( RECT rc)

◆ getNewZoomRect()

VOID CCanvasWindow::getNewZoomRect ( CRect rcView,
INT  newZoom,
CPoint  ptTarget 
)

Definition at line 74 of file canvas.cpp.

75{
76 CRect rcImage;
77 GetImageRect(rcImage);
78 ImageToCanvas(rcImage);
79
80 // Calculate the zoom rectangle
81 INT oldZoom = toolsModel.GetZoom();
82 GetClientRect(rcView);
83 LONG cxView = rcView.right * oldZoom / newZoom, cyView = rcView.bottom * oldZoom / newZoom;
84 rcView.SetRect(ptTarget.x - cxView / 2, ptTarget.y - cyView / 2,
85 ptTarget.x + cxView / 2, ptTarget.y + cyView / 2);
86
87 // Shift the rectangle if necessary
88 INT dx = 0, dy = 0;
89 if (rcView.left < rcImage.left)
90 dx = rcImage.left - rcView.left;
91 else if (rcImage.right < rcView.right)
92 dx = rcImage.right - rcView.right;
93 if (rcView.top < rcImage.top)
94 dy = rcImage.top - rcView.top;
95 else if (rcImage.bottom < rcView.bottom)
96 dy = rcImage.bottom - rcView.bottom;
97 rcView.OffsetRect(dx, dy);
98
99 rcView.IntersectRect(&rcView, &rcImage);
100}
void OffsetRect(int x, int y) noexcept
Definition: atltypes.h:403
void SetRect(int x1, int y1, int x2, int y2) noexcept
Definition: atltypes.h:423
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
long LONG
Definition: pedump.c:60
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)

Referenced by ZoomTool::getNewZoomRect().

◆ ImageToCanvas() [1/2]

◆ ImageToCanvas() [2/2]

VOID CCanvasWindow::ImageToCanvas ( RECT rc)

Definition at line 42 of file canvas.cpp.

◆ OnButtonDblClk()

LRESULT CCanvasWindow::OnButtonDblClk ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 379 of file canvas.cpp.

380{
383
386 m_nMouseDownMsg = 0;
387
390 Invalidate();
391 return 0;
392}
BOOL m_drawing
Definition: canvas.h:43
UINT m_nMouseDownMsg
Definition: canvas.h:81
void resetTool()
Definition: toolsmodel.cpp:302
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick)
Definition: mouse.cpp:1152
LPARAM lParam
Definition: combotst.c:139
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1789

◆ OnButtonDown()

LRESULT CCanvasWindow::OnButtonDown ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 307 of file canvas.cpp.

308{
310
311 m_nMouseDownMsg = nMsg;
312 BOOL bLeftButton = (nMsg == WM_LBUTTONDOWN);
313
314 if (nMsg == WM_MBUTTONDOWN)
315 {
316 m_ptOrig = pt;
317 SetCapture();
319 return 0;
320 }
321
322 HITTEST hitSelection = selectionModel.hitTest(pt);
323 if (hitSelection != HIT_NONE)
324 {
325 m_drawing = TRUE;
327 SetCapture();
328 toolsModel.OnButtonDown(bLeftButton, pt.x, pt.y, FALSE);
329 Invalidate();
330 return 0;
331 }
332
333 HITTEST hit = CanvasHitTest(pt);
334 if (hit == HIT_NONE || hit == HIT_BORDER)
335 {
336 switch (toolsModel.GetActiveTool())
337 {
338 case TOOL_BEZIER:
339 case TOOL_SHAPE:
341 Invalidate();
342 break;
343
344 case TOOL_FREESEL:
345 case TOOL_RECTSEL:
347 Invalidate();
348 break;
349
350 default:
351 break;
352 }
353
354 toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
355 return 0;
356 }
357
359
360 if (hit == HIT_INNER)
361 {
362 m_drawing = TRUE;
363 SetCapture();
364 toolsModel.OnButtonDown(bLeftButton, pt.x, pt.y, FALSE);
365 Invalidate();
366 return 0;
367 }
368
369 if (bLeftButton)
370 {
371 m_hitCanvasSizeBox = hit;
372 m_ptOrig = pt;
373 SetCapture();
374 }
375
376 return 0;
377}
HINSTANCE g_hinstExe
Definition: main.cpp:17
HITTEST
Definition: precomp.h:55
@ HIT_BORDER
Definition: precomp.h:65
#define IDC_HANDDRAG
Definition: resource.h:25
HITTEST CanvasHitTest(POINT pt)
Definition: canvas.cpp:66
POINT m_ptOrig
Definition: canvas.h:59
HITTEST hitTest(POINT ptCanvas)
void OnEndDraw(BOOL bCancel)
Definition: mouse.cpp:1178
TOOLTYPE GetActiveTool() const
Definition: toolsmodel.cpp:134
unsigned int BOOL
Definition: ntddk_ex.h:94
@ TOOL_SHAPE
Definition: toolsmodel.h:25
@ TOOL_BEZIER
Definition: toolsmodel.h:23
@ TOOL_FREESEL
Definition: toolsmodel.h:12
@ TOOL_RECTSEL
Definition: toolsmodel.h:13
HWND WINAPI SetCapture(_In_ HWND hWnd)
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define WM_LBUTTONDOWN
Definition: winuser.h:1787
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2442
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define WM_MBUTTONDOWN
Definition: winuser.h:1793

◆ OnButtonUp()

LRESULT CCanvasWindow::OnButtonUp ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 520 of file canvas.cpp.

521{
524
526
527 BOOL bLeftButton = (m_nMouseDownMsg == WM_LBUTTONDOWN);
528 m_nMouseDownMsg = 0;
529
530 if (m_drawing)
531 {
533 toolsModel.OnButtonUp(bLeftButton, pt.x, pt.y);
534 Invalidate(FALSE);
536 return 0;
537 }
538
539 if (m_hitCanvasSizeBox == HIT_NONE || !bLeftButton)
540 return 0;
541
542 // Resize the image
543 INT cxImage = imageModel.GetWidth(), cyImage = imageModel.GetHeight();
544 INT cxDelta = pt.x - m_ptOrig.x;
545 INT cyDelta = pt.y - m_ptOrig.y;
546 switch (m_hitCanvasSizeBox)
547 {
548 case HIT_UPPER_LEFT:
549 imageModel.Crop(cxImage - cxDelta, cyImage - cyDelta, cxDelta, cyDelta);
550 break;
551 case HIT_UPPER_CENTER:
552 imageModel.Crop(cxImage, cyImage - cyDelta, 0, cyDelta);
553 break;
554 case HIT_UPPER_RIGHT:
555 imageModel.Crop(cxImage + cxDelta, cyImage - cyDelta, 0, cyDelta);
556 break;
557 case HIT_MIDDLE_LEFT:
558 imageModel.Crop(cxImage - cxDelta, cyImage, cxDelta, 0);
559 break;
560 case HIT_MIDDLE_RIGHT:
561 imageModel.Crop(cxImage + cxDelta, cyImage, 0, 0);
562 break;
563 case HIT_LOWER_LEFT:
564 imageModel.Crop(cxImage - cxDelta, cyImage + cyDelta, cxDelta, 0);
565 break;
566 case HIT_LOWER_CENTER:
567 imageModel.Crop(cxImage, cyImage + cyDelta, 0, 0);
568 break;
569 case HIT_LOWER_RIGHT:
570 imageModel.Crop(cxImage + cxDelta, cyImage + cyDelta, 0, 0);
571 break;
572 default:
573 break;
574 }
576
578
580 toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
582 Invalidate(TRUE);
583 return 0;
584}
HWND g_hStatusBar
Definition: main.cpp:23
BOOL g_imageSaved
Definition: main.cpp:21
@ HIT_LOWER_RIGHT
Definition: precomp.h:64
@ HIT_LOWER_CENTER
Definition: precomp.h:63
@ HIT_UPPER_LEFT
Definition: precomp.h:57
@ HIT_LOWER_LEFT
Definition: precomp.h:62
@ HIT_UPPER_CENTER
Definition: precomp.h:58
@ HIT_UPPER_RIGHT
Definition: precomp.h:59
@ HIT_MIDDLE_RIGHT
Definition: precomp.h:61
@ HIT_MIDDLE_LEFT
Definition: precomp.h:60
VOID updateScrollRange()
Definition: canvas.cpp:220
void SetRectEmpty() noexcept
Definition: atltypes.h:431
void Crop(int nWidth, int nHeight, int nOffsetX=0, int nOffsetY=0)
Definition: history.cpp:193
void OnButtonUp(BOOL bLeftButton, LONG x, LONG y)
Definition: mouse.cpp:1169
#define L(x)
Definition: ntvdm.h:50
#define SB_SETTEXT
Definition: commctrl.h:1954
LONG_PTR LPARAM
Definition: windef.h:208
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

◆ OnCancelMode()

LRESULT CCanvasWindow::OnCancelMode ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 671 of file canvas.cpp.

672{
673 // Cancel dragging
676 Invalidate(TRUE);
677 return 0;
678}

◆ OnCaptureChanged()

LRESULT CCanvasWindow::OnCaptureChanged ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 685 of file canvas.cpp.

686{
688 return 0;
689}

◆ OnCtlColorEdit()

LRESULT CCanvasWindow::OnCtlColorEdit ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 728 of file canvas.cpp.

729{
733}
COLORREF GetFgColor() const
WPARAM wParam
Definition: combotst.c:138
PaletteModel paletteModel
LONG_PTR LRESULT
Definition: windef.h:209
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define TRANSPARENT
Definition: wingdi.h:950
#define NULL_BRUSH
Definition: wingdi.h:901
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918

◆ OnEndDraw()

VOID CCanvasWindow::OnEndDraw ( BOOL  bCancel)

Definition at line 721 of file canvas.cpp.

722{
724 toolsModel.OnEndDraw(bCancel);
725 Invalidate(FALSE);
726}

Referenced by CMainWindow::ConfirmSave(), CMainWindow::OnCommand(), OnKeyDown(), and CMainWindow::saveImage().

◆ OnEraseBkgnd()

LRESULT CCanvasWindow::OnEraseBkgnd ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 691 of file canvas.cpp.

692{
693 return TRUE; // do nothing => transparent background
694}

◆ OnHScroll()

LRESULT CCanvasWindow::OnHScroll ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 295 of file canvas.cpp.

296{
298 return 0;
299}
VOID OnHVScroll(WPARAM wParam, INT fnBar)
Definition: canvas.cpp:265

◆ OnHVScroll()

VOID CCanvasWindow::OnHVScroll ( WPARAM  wParam,
INT  fnBar 
)
protected

Definition at line 265 of file canvas.cpp.

266{
267 SCROLLINFO si;
268 si.cbSize = sizeof(SCROLLINFO);
269 si.fMask = SIF_ALL;
270 GetScrollInfo(fnBar, &si);
271 switch (LOWORD(wParam))
272 {
273 case SB_THUMBTRACK:
274 case SB_THUMBPOSITION:
275 si.nPos = (SHORT)HIWORD(wParam);
276 break;
277 case SB_LINELEFT:
278 si.nPos -= 5;
279 break;
280 case SB_LINERIGHT:
281 si.nPos += 5;
282 break;
283 case SB_PAGELEFT:
284 si.nPos -= si.nPage;
285 break;
286 case SB_PAGERIGHT:
287 si.nPos += si.nPage;
288 break;
289 }
290 si.nPos = max(min(si.nPos, si.nMax), si.nMin);
291 SetScrollInfo(fnBar, &si);
292 Invalidate();
293}
#define min(a, b)
Definition: monoChain.cc:55
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
#define max(a, b)
Definition: svc.c:63
#define HIWORD(l)
Definition: typedefs.h:247
#define SB_THUMBTRACK
Definition: winuser.h:573
struct tagSCROLLINFO SCROLLINFO
#define SB_PAGERIGHT
Definition: winuser.h:571
#define SB_LINERIGHT
Definition: winuser.h:567
#define SB_LINELEFT
Definition: winuser.h:566
#define SIF_ALL
Definition: winuser.h:1243
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
#define SB_PAGELEFT
Definition: winuser.h:570
#define SB_THUMBPOSITION
Definition: winuser.h:572

Referenced by OnHScroll(), and OnVScroll().

◆ OnKeyDown()

LRESULT CCanvasWindow::OnKeyDown ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 656 of file canvas.cpp.

657{
658 if (wParam == VK_ESCAPE)
659 {
662 m_nMouseDownMsg = 0;
665 Invalidate(TRUE);
666 }
667
668 return 0;
669}
VOID OnEndDraw(BOOL bCancel)
Definition: canvas.cpp:721
#define VK_ESCAPE
Definition: winuser.h:2225

◆ OnMouseMove()

LRESULT CCanvasWindow::OnMouseMove ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 394 of file canvas.cpp.

395{
397
399 {
400 INT x = GetScrollPos(SB_HORZ) - (pt.x - m_ptOrig.x);
401 INT y = GetScrollPos(SB_VERT) - (pt.y - m_ptOrig.y);
404 m_ptOrig = pt;
405 return 0;
406 }
407
409
411 Invalidate();
412
414 {
415 TRACKMOUSEEVENT tme = { sizeof(tme) };
416 tme.dwFlags = TME_LEAVE;
417 tme.hwndTrack = m_hWnd;
418 tme.dwHoverTime = 0;
419 ::TrackMouseEvent(&tme);
420
421 if (!m_drawing)
422 {
423 CRect rcImage;
424 GetImageRect(rcImage);
425
426 CStringW strCoord;
427 if (rcImage.PtInRect(pt))
428 strCoord.Format(L"%ld, %ld", pt.x, pt.y);
430 }
431 }
432
434 {
436 return 0;
437 }
438
439 if (m_hitCanvasSizeBox == HIT_NONE || ::GetCapture() != m_hWnd)
440 return 0;
441
442 // Dragging now... Calculate the new size
443 INT cxImage = imageModel.GetWidth(), cyImage = imageModel.GetHeight();
444 INT cxDelta = pt.x - m_ptOrig.x;
445 INT cyDelta = pt.y - m_ptOrig.y;
446 switch (m_hitCanvasSizeBox)
447 {
448 case HIT_UPPER_LEFT:
449 cxImage -= cxDelta;
450 cyImage -= cyDelta;
451 break;
452 case HIT_UPPER_CENTER:
453 cyImage -= cyDelta;
454 break;
455 case HIT_UPPER_RIGHT:
456 cxImage += cxDelta;
457 cyImage -= cyDelta;
458 break;
459 case HIT_MIDDLE_LEFT:
460 cxImage -= cxDelta;
461 break;
462 case HIT_MIDDLE_RIGHT:
463 cxImage += cxDelta;
464 break;
465 case HIT_LOWER_LEFT:
466 cxImage -= cxDelta;
467 cyImage += cyDelta;
468 break;
469 case HIT_LOWER_CENTER:
470 cyImage += cyDelta;
471 break;
472 case HIT_LOWER_RIGHT:
473 cxImage += cxDelta;
474 cyImage += cyDelta;
475 break;
476 default:
477 return 0;
478 }
479
480 // Limit bitmap size
481 cxImage = max(1, cxImage);
482 cyImage = max(1, cyImage);
483 cxImage = min(MAXWORD, cxImage);
484 cyImage = min(MAXWORD, cyImage);
485
486 // Display new size
487 CStringW strSize;
488 strSize.Format(L"%d x %d", cxImage, cyImage);
490
491 // Dragging now... Fix the position...
492 CRect rcResizing = { 0, 0, cxImage, cyImage };
493 switch (m_hitCanvasSizeBox)
494 {
495 case HIT_UPPER_LEFT:
496 rcResizing.OffsetRect(cxDelta, cyDelta);
497 break;
498 case HIT_UPPER_CENTER:
499 rcResizing.OffsetRect(0, cyDelta);
500 break;
501 case HIT_UPPER_RIGHT:
502 rcResizing.OffsetRect(0, cyDelta);
503 break;
504 case HIT_MIDDLE_LEFT:
505 rcResizing.OffsetRect(cxDelta, 0);
506 break;
507 case HIT_LOWER_LEFT:
508 rcResizing.OffsetRect(cxDelta, 0);
509 break;
510 default:
511 break;
512 }
513 ImageToCanvas(rcResizing);
514 m_rcResizing = rcResizing;
515 Invalidate(TRUE);
516
517 return 0;
518}
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL PtInRect(POINT point) const noexcept
Definition: atltypes.h:418
BOOL IsSelection() const
Definition: toolsmodel.cpp:41
void DrawWithMouseTool(POINT pt, WPARAM wParam)
Definition: mouse.cpp:1201
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define MAXWORD
#define TME_LEAVE
Definition: commctrl.h:4986
@ TOOL_AIRBRUSH
Definition: toolsmodel.h:20
@ TOOL_ZOOM
Definition: toolsmodel.h:17
#define MAKEWPARAM(l, h)
Definition: winuser.h:4020
#define WM_HSCROLL
Definition: winuser.h:1754
#define WM_VSCROLL
Definition: winuser.h:1755
HWND WINAPI GetCapture(void)
Definition: message.c:2881
BOOL WINAPI TrackMouseEvent(_Inout_ LPTRACKMOUSEEVENT)
#define SendMessage
Definition: winuser.h:5863
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ OnMouseWheel()

LRESULT CCanvasWindow::OnMouseWheel ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 680 of file canvas.cpp.

681{
682 return ::SendMessageW(GetParent(), nMsg, wParam, lParam);
683}
HWND WINAPI GetParent(_In_ HWND)

◆ OnPaint()

LRESULT CCanvasWindow::OnPaint ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 696 of file canvas.cpp.

697{
698 RECT rcClient;
699 GetClientRect(&rcClient);
700
701 static BOOL s_bShowedOutOfMemory = FALSE; // Don't show "Out Of Memory" message multiple time
702
703 PAINTSTRUCT ps;
704 HDC hDC = BeginPaint(&ps);
705
706 if (DoDraw(hDC, rcClient, ps.rcPaint))
707 {
708 s_bShowedOutOfMemory = FALSE;
709 }
710 else if (!s_bShowedOutOfMemory)
711 {
713 s_bShowedOutOfMemory = TRUE;
714 imageModel.ClearHistory(); // Reduce memory usage
715 }
716
717 EndPaint(&ps);
718 return 0;
719}
void ShowOutOfMemory(void)
Definition: main.cpp:34
BOOL DoDraw(HDC hDC, RECT &rcClient, RECT &rcPaint)
Definition: canvas.cpp:117
void ClearHistory(void)
Definition: history.cpp:116
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)

◆ OnPaletteModelColorChanged()

LRESULT CCanvasWindow::OnPaletteModelColorChanged ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 735 of file canvas.cpp.

736{
738 return 0;
739}
void NotifyImageChanged()
Definition: history.cpp:23

◆ OnSetCursor()

LRESULT CCanvasWindow::OnSetCursor ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 586 of file canvas.cpp.

587{
589 {
590 bHandled = FALSE;
591 return 0;
592 }
593
595 {
597 return 0;
598 }
599
600 POINT pt;
603
604 CRect rcClient;
605 GetClientRect(&rcClient);
606
607 if (!rcClient.PtInRect(pt))
608 {
609 bHandled = FALSE;
610 return 0;
611 }
612
613 HITTEST hitSelection = selectionModel.hitTest(pt);
614 if (hitSelection != HIT_NONE)
615 {
616 if (!setCursorOnSizeBox(hitSelection))
618 return 0;
619 }
620
621 CRect rcImage;
622 GetImageRect(rcImage);
623 ImageToCanvas(rcImage);
624
625 if (rcImage.PtInRect(pt))
626 {
627 switch (toolsModel.GetActiveTool())
628 {
629 case TOOL_FILL:
631 break;
632 case TOOL_COLOR:
634 break;
635 case TOOL_ZOOM:
637 break;
638 case TOOL_PEN:
640 break;
641 case TOOL_AIRBRUSH:
643 break;
644 default:
646 }
647 return 0;
648 }
649
651 bHandled = FALSE;
652
653 return 0;
654}
#define IDC_ZOOM
Definition: resource.h:16
#define IDC_FILL
Definition: resource.h:20
#define IDC_PEN
Definition: resource.h:23
#define IDC_COLOR
Definition: resource.h:21
#define IDC_AIRBRUSH
Definition: resource.h:24
static BOOL IsWaiting()
Definition: CWaitCursor.h:40
BOOL setCursorOnSizeBox(HITTEST hit)
Definition: sizebox.cpp:20
@ TOOL_COLOR
Definition: toolsmodel.h:16
@ TOOL_FILL
Definition: toolsmodel.h:15
@ TOOL_PEN
Definition: toolsmodel.h:18
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3032
#define IDC_SIZEALL
Definition: winuser.h:704
#define IDC_CROSS
Definition: winuser.h:698
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

◆ OnSize()

LRESULT CCanvasWindow::OnSize ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 257 of file canvas.cpp.

258{
259 if (m_hWnd)
261
262 return 0;
263}

◆ OnVScroll()

LRESULT CCanvasWindow::OnVScroll ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 301 of file canvas.cpp.

302{
304 return 0;
305}

◆ updateScrollPos()

VOID CCanvasWindow::updateScrollPos ( INT  x = 0,
INT  y = 0 
)

Definition at line 251 of file canvas.cpp.

252{
255}
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)

Referenced by CMainWindow::OnCommand(), SetBitmapAndInfo(), and zoomTo().

◆ updateScrollRange()

VOID CCanvasWindow::updateScrollRange ( )

Definition at line 220 of file canvas.cpp.

221{
222 CRect rcClient;
223 GetClientRect(&rcClient);
224
225 CSize sizePage(rcClient.right, rcClient.bottom);
226 CSize sizeZoomed = { Zoomed(imageModel.GetWidth()), Zoomed(imageModel.GetHeight()) };
227 CSize sizeWhole = { sizeZoomed.cx + (GRIP_SIZE * 2), sizeZoomed.cy + (GRIP_SIZE * 2) };
228
229 // show/hide the scrollbars
230 ShowScrollBar(SB_HORZ, sizePage.cx < sizeWhole.cx);
231 ShowScrollBar(SB_VERT, sizePage.cy < sizeWhole.cy);
232
233 if (sizePage.cx < sizeWhole.cx || sizePage.cy < sizeWhole.cy)
234 {
235 GetClientRect(&rcClient); // Scrollbars might change, get client rectangle again
236 sizePage = CSize(rcClient.right, rcClient.bottom);
237 }
238
239 SCROLLINFO si = { sizeof(si), SIF_PAGE | SIF_RANGE };
240 si.nMin = 0;
241
242 si.nMax = sizeWhole.cx;
243 si.nPage = sizePage.cx;
245
246 si.nMax = sizeWhole.cy;
247 si.nPage = sizePage.cy;
249}
LONG cx
Definition: windef.h:334
LONG cy
Definition: windef.h:335
#define SIF_RANGE
Definition: winuser.h:1246
#define SIF_PAGE
Definition: winuser.h:1244
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)

Referenced by ImageModel::NotifyImageChanged(), OnButtonUp(), OnSize(), and zoomTo().

◆ zoomTo()

VOID CCanvasWindow::zoomTo ( INT  newZoom,
LONG  left = 0,
LONG  top = 0 
)

Definition at line 102 of file canvas.cpp.

103{
104 POINT pt = { left, top };
106
107 toolsModel.SetZoom(newZoom);
109 pt.x += GetScrollPos(SB_HORZ);
110 pt.y += GetScrollPos(SB_VERT);
111
113 updateScrollPos(pt.x, pt.y);
114 Invalidate(TRUE);
115}
VOID updateScrollPos(INT x=0, INT y=0)
Definition: canvas.cpp:251
void SetZoom(int nZoom)
Definition: toolsmodel.cpp:266
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLint left
Definition: glext.h:7726

Referenced by ZoomTool::OnButtonDown(), CMainWindow::OnCommand(), CMainWindow::OnMouseWheel(), and CToolSettingsWindow::OnVScroll().

Member Data Documentation

◆ m_drawing

◆ m_hitCanvasSizeBox

HITTEST CCanvasWindow::m_hitCanvasSizeBox
protected

Definition at line 58 of file canvas.h.

Referenced by DoDraw(), OnButtonDown(), OnButtonUp(), OnCancelMode(), OnKeyDown(), and OnMouseMove().

◆ m_nMouseDownMsg

UINT CCanvasWindow::m_nMouseDownMsg = 0
protected

Definition at line 81 of file canvas.h.

Referenced by OnButtonDblClk(), OnButtonDown(), OnButtonUp(), OnKeyDown(), OnMouseMove(), and OnSetCursor().

◆ m_ptOrig

POINT CCanvasWindow::m_ptOrig
protected

Definition at line 59 of file canvas.h.

Referenced by OnButtonDown(), OnButtonUp(), and OnMouseMove().

◆ m_rcResizing

CRect CCanvasWindow::m_rcResizing
protected

Definition at line 60 of file canvas.h.

Referenced by DoDraw(), OnButtonUp(), OnCancelMode(), OnKeyDown(), and OnMouseMove().


The documentation for this class was generated from the following files: